NOPE LinkedIn

Catégories:
Security
Crowdsec

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

Fonctionnement 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.