Environnement multi server avec Crowdsec
Environnement multi-server Crowdsec
L’idée sous-jacente est d’avoir Crowdsec
installé sur tous les servers (Windows ou Linux) et de les faire communiquer pour éviter toute attaque.
C’est-à-dire que si un équipement avec Windows ou Linux est attaqué, le reste des machines de l’organisation peut découvrir l’attaque et bloquer l’adresse IP de l’attaquant avant même qu’il ne puisse frapper. Par défaut, disons que Crowdsec fonctionne localement, chaque agent crowdsec communique avec son propre serveur API local
, nous allons faire en sorte qu’ils communiquent tous avec le même serveur LAPI
.
Schéma de fonctionnement des divers composant de la solution Crowdsec
1. Serveur local API
Nous allons commencer par configurer la machine que nous voulons comme serveur API pour le reste des agents.
Nous l’activons donc dans votre fichier de configuration /etc/crowdsec/config.yaml
, nous indiquons l’IP et le port sur lesquels il écoutera.
Par defaut, le serveur n’écoute que localement 127.0.0.1
. Il faut remplacer cette adresse et le port par les valeurs désirées.
api:
client:
insecure_skip_verify: false
credentials_path: /etc/crowdsec/local_api_credentials.yaml
server:
log_level: info
listen_uri: 127.0.0.1:8080 <== Remplacer par l adresse externe.
profiles_path: /etc/crowdsec/profiles.yaml
console_path: /etc/crowdsec/console.yaml
online_client: # Central API credentials (to push signals and receive bad IPs)
credentials_path: /etc/crowdsec/online_api_credentials.yaml
trusted_ips: # IP ranges, or IPs which can have admin API access
- 127.0.0.1
- ::1
# tls:
# cert_file: /etc/crowdsec/ssl/cert.pem
# key_file: /etc/crowdsec/ssl/key.pem
A changer également dans le fichier /etc/crowdsec/local_api_credentials.yaml
url: http://127.0.0.1:8080 <== Remplacer par l adresse externe.
login: <LOGIN ID>
password: <PASSWORD>
Note:
Sur un firewall
Opnsense
les fichiers ne se trouvent pas au même endroit. Ils sont dans le répertoire/usr/local/etc/crowdsec/
Les étapes de configurations sont les mêmes.
On relance ensuite Crowdsec
pour prendre en compte les modifications
Linux (Debian)
# systemctl restart crowdsec
Opnsense (BSD)
# service crowdsec restart
Stopping crowdsec.
Waiting for PIDS: 77187.
2. Configuration des agents Crowdsec
maintenant, Il reste à enregistrer le reste des machines possedant un agent Crowdsec
sur le serveur central. Il faudra également désactiver le LAPI
de chaque machine Crowdsec
car il ne sera pas utilisé. Sur notre infrastructure, c’est un firewall en entrée de zone qui accepte les enregistrements sur son API local.
Enregistrement de l’agent
# cscli lapi register -u http://<IP SERVEUR LAPI>:8080
INFO[16-07-2023 11:23:24] Successfully registered to Local API (LAPI)
INFO[16-07-2023 11:23:24] Local API credentials dumped to '/etc/crowdsec/local_api_credentials.yaml'
WARN[16-07-2023 11:23:24] Run 'sudo systemctl reload crowdsec' for the new configuration to be effective.
Désactivation de l’agent LAPI
sur le serveur enregistré.
Par défaut, le serveur api local LAPI
est actif sur chaque installation d’agent CrowdSec. Dans cette configuration, nous voulons le désactiver sur le serveur agissant en client
. Il faut donc modifier le fichier qui permet d’initialiser le service Crowdsec et d’y ajouter un paramêtre lors du lancement de l’agent Crowdsec
cp /lib/systemd/system/crowdsec.service /etc/systemd/system/crowdsec.service
Nous allons ajouter l’option -no-api
à la fin de la ligne ExecStart
du fichier de configuration du service Crowdsec.
Editer le fichier /lib/systemd/system/crowdsec.service
1[Unit]
2Description=Crowdsec agent
3After=syslog.target network.target remote-fs.target nss-lookup.target
4
5[Service]
6Type=notify
7Environment=LC_ALL=C LANG=C
8ExecStartPre=/usr/bin/crowdsec -c /etc/crowdsec/config.yaml -t
9ExecStart=/usr/bin/crowdsec -c /etc/crowdsec/config.yaml -no-api
10#ExecStartPost=/bin/sleep 0.1
11ExecReload=/bin/kill -HUP $MAINPID
12Restart=always
13RestartSec=60
14
15[Install]
16WantedBy=multi-user.target
On relance l’agent Crowdsec
sur le serveur
# systemctl daemon-reload
# systemctl restart crowdsec
3. Validation de l’enregistrement sur le server LAPI
On peut consulter la liste des serveurs enregistrés sur notre serveur Crowdsec LAPI
, ici notre firewall.
1# cscli machines list
2────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
3 Name IP Address Last Update Status Version Auth Type Last Heartbeat
4────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
5 c1ac4dSjeiuG5 192.168.XX.XX 2023-07-16T09:38:33Z ✔️ v1.5.1-freebsd-freebsd-b76e95e3 password 15s
6 828cf8Bke7SfY 192.168.XX.XX 2023-07-16T09:23:25Z 🚫 password ⚠️ 15m24s
7────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Notre serveur n’est pas encore validée
# cscli machines validate 828cf8Bke7SfY
INFO[16-07-2023 11:44:43] machine '828cf8Bke7SfY' validated successfully
On peut contrôler le bon déroulement de l’enregistrement:
# cscli machines list
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Name IP Address Last Update Status Version Auth Type Last Heartbeat
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
c1ac4dSjeiuG5 192.168.XX.XX 2023-07-16T09:45:33Z ✔️ v1.5.1-freebsd-freebsd-b76e95e3 password 0s
828cf8Bke7SfY 192.168.XX.XX 2023-07-16T09:45:17Z ✔️ v1.5.2-debian-pragmatic-9d264c0 password 16s
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Sans oublier de recharger Crowdsec dans chaque agent une fois que nous l’avons validé, avec :
# systemctl restart crowdsec
Il est possible de contrôler le statut du dialogue de l’agent avec le LAPI
:
# cscli lapi status
INFO[16-07-2023 12:11:15] Loaded credentials from /etc/crowdsec/local_api_credentials.yaml
INFO[16-07-2023 12:11:15] Trying to authenticate with username 245d54aVlcdUqboV on http://192.168.XX.XX:8080/
INFO[16-07-2023 12:11:15] You can successfully interact with Local API (LAPI)
4. Mise en oeuvre des mesures de remédiation
Nous allons générer des Tokens
(jetons) sur le serveur LAPI
.
# cscli bouncers add brzl001
Api key for 'brzl001':
caa197<deleted>904937eef
Please keep this key since you will not be able to retrieve it!
# cscli bouncers add brzl002
Api key for 'brzl002':
666a0ce<deleted>0ca1f7fb
Please keep this key since you will not be able to retrieve it!
# cscli bouncers add brzl004
Api key for 'brzl004':
6e8171<deleted>a72a61176
Please keep this key since you will not be able to retrieve it!
On vient éditer sur chaque serveur se connectant sur notre serveur LAPI
le fichier /etc/crowdsec/cs-firewall-bouncer/cs-firewall-bouncer.yaml
- api_url: par l’url du serveur LAPI.
- api_key: par le
token
généré ci-dessus.
1mode: iptables
2pid_dir: /var/run/
3update_frequency: 10s
4daemonize: true
5log_mode: file
6log_dir: /var/log/
7log_level: info
8log_compression: true
9log_max_size: 100
10log_max_backups: 3
11log_max_age: 30
12api_url: http://192.168.XX.XX:8080/
13api_key: caa197<deleted>904937eef
14insecure_skip_verify: false
15disable_ipv6: false
16deny_action: DROP
17deny_log: false
18supported_decisions_types:
19 - ban
On relance ensuite le bouncers
# systemctl restart crowdsec-firewall-bouncer
5. Conclusion
A ce stade tous les serveurs ayant leur agent Crowdsec enregistrés auprés de notre LAPI
, en l’occurence ici notre firewall partageront leur blacklist
et bloqueront les IPs traitées par le bouncer du Firewall.
L’ajout et validation de nouveaux bouncers. Il est important de noter que les bouncers et agents CrowdSec ne doivent pas forcément être installés sur le même serveur. L’agent CrowdSec doit être installé là où les journaux sont générés, mais la remédiation peut être déportée là où elle est utile.
6. Quelques mises en garde :
Les communications entre les agents se font par HTTP en clair. Ceci est acceptable sur un réseau local, mais pas possible sur Internet. CrowdSec permet l’utilisation de HTTPS pour ces communications. La surveillance ou l’alerte n’est pas non plus couverte dans cet article. CrowdSec permet une surveillance très puissante grâce au scraper Prometheus.
La base de données CrowdSec n’est pas hautement disponible. En outre, l’agent CrowdSec sur le serveur hébergeant LAPI
est SPOF
.