Crowdsec
Bonjour,
Je vais vous présenter aujourd'hui Crowdsec nouvel outil de sécurité conçu pour protéger les serveurs
CrowdSec est un moteur de détection de comportement Open source, moderne et collaboratif (couplé à un réseau mondial de réputation IP)
Il s'appuie sur la philosophie de fail2ban mais est compatible IPV6 et il est au moins 60 fois plus rapide Il est est conçu pour les infrastructures modernes basées sur le Cloud/Conteneurs/VM mais fonctionne très bien en mode autonome (standalone)
Uns fois détectées, les IP jugées avoir des comportement dangereux ou suspicieux sont bloquées par divers moyens: Bloc de pare-feu (iptables/nftables), nginx http 403, Captchas, etc
Les adresses IP agressive peut être envoyée à CrowdSec pour être partagée entre tous les utilisateurs afin d'améliorer encore la sécurité de chacun. C'est le côté collaboratif.
Le principe est simple:
Un processus (appelons le "le physionomiste") va éplucher vos logs à la recherche de comportement suspicieux. Les IP trouvés seront transmise par le physionomiste au videur qui va prendre les actions nécessaire pour bloquer le malfaisant.
Je l'ai installé sur quatre serveurs et je ne le regrette pas...
Installation
# lsb_release -a No LSB modules are available. Distributor ID: Debian Description: Debian GNU/Linux 11 (bullseye) Release: 11 Codename: bullseye
# apt update && apt upgrade
# apt install bash gettext whiptail curl wget apt-transport-https # curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh | sudo bash ... The repository is setup! You can now install packages.
# cat /etc/apt/sources.list.d/crowdsec_crowdsec.list # this file was generated by packagecloud.io for # the repository at https://packagecloud.io/crowdsec/crowdsec deb https://packagecloud.io/crowdsec/crowdsec/debian/ bullseye main deb-src https://packagecloud.io/crowdsec/crowdsec/debian/ bullseye main
root@bullseye:~# apt-cache policy crowdsec crowdsec: Installé : 1.1.1 Candidat : 1.1.1 Table de version : *** 1.1.1 500 500 https://packagecloud.io/crowdsec/crowdsec/debian bullseye/main amd64 Packages 100 /var/lib/dpkg/status 1.1.0 500 500 https://packagecloud.io/crowdsec/crowdsec/debian bullseye/main amd64 Packages 1.0.9-2+b4 500 500 http://deb.debian.org/debian bullseye/main amd64 Packages
apt install -y crowdsec ... Creating crowdsec configuration in /etc/crowdsec Creating /etc/crowdsec/acquis.yaml INFO[10/09/2021:08:59:00] crowdsec_wizard: service 'sshd': /var/log/auth.log INFO[10/09/2021:08:59:00] crowdsec_wizard: service 'linux': /var/log/syslog /var/log/kern.log /var/log/messages WARN[10-09-2021 08:59:00 AM] can't load CAPI credentials from '/etc/crowdsec/online_api_credentials.yaml' (missing field) INFO[10-09-2021 08:59:00 AM] push and pull to crowdsec API disabled INFO[10-09-2021 08:59:00 AM] Machine 'a11b6e438546403ca3f0718f32e97a05XrlWffcAKHCWdpSD' successfully added to the local API INFO[10-09-2021 08:59:00 AM] API credentials dumped to '/etc/crowdsec/local_api_credentials.yaml' WARN[10-09-2021 08:59:01 AM] can't load CAPI credentials from '/etc/crowdsec/online_api_credentials.yaml' (missing field) INFO[10-09-2021 08:59:01 AM] push and pull to crowdsec API disabled INFO[10-09-2021 08:59:04 AM] Successfully registered to Central API (CAPI) INFO[10-09-2021 08:59:04 AM] Central API credentials dumped to '/etc/crowdsec/online_api_credentials.yaml' WARN[10-09-2021 08:59:04 AM] Run 'sudo systemctl reload crowdsec' for the new configuration to be effective. Updating hub INFO[10-09-2021 08:59:06 AM] Wrote new 131926 bytes index to /etc/crowdsec/hub/.index.json INFO[10/09/2021:08:59:06] crowdsec_wizard: Installing collection 'crowdsecurity/sshd' INFO[10/09/2021:08:59:09] crowdsec_wizard: Installing collection 'crowdsecurity/linux' Created symlink /etc/systemd/system/multi-user.target.wants/crowdsec.service → /lib/systemd/system/crowdsec.service. You always can run the configuration again interactively using '/usr/share/crowdsec/wizard.sh -c
Comme vous pouvez le vois, l'installeur à automatiquement activé les services qu'il a détecté:
INFO[10/09/2021:08:59:00] crowdsec_wizard: service 'sshd': /var/log/auth.log INFO[10/09/2021:08:59:00] crowdsec_wizard: service 'linux': /var/log/syslog /var/log/kern.log /var/log/messages
Vous pouvez à tout moment relancer l'assistant pour choisir les services à surveiller/protéger:
# /usr/share/crowdsec/wizard.sh -c
[attachment=0]Crowdsec-wizard9.JPG[/attachment]
Vous pouvez à tout moment lister vos filtres:
$ cscli collections list ------------------------------------------------------------------------------------------------------------ NAME 📦 STATUS VERSION LOCAL PATH ------------------------------------------------------------------------------------------------------------ crowdsecurity/wordpress ✔️ enabled 0.2 /etc/crowdsec/collections/wordpress.yaml crowdsecurity/linux ✔️ enabled 0.2 /etc/crowdsec/collections/linux.yaml crowdsecurity/sshd ✔️ enabled 0.1 /etc/crowdsec/collections/sshd.yaml crowdsecurity/postfix ✔️ enabled 0.2 /etc/crowdsec/collections/postfix.yaml crowdsecurity/base-http-scenarios ✔️ enabled 0.4 /etc/crowdsec/collections/base-http-scenarios.yaml crowdsecurity/iptables ✔️ enabled 0.1 /etc/crowdsec/collections/iptables.yaml crowdsecurity/mysql ✔️ enabled 0.1 /etc/crowdsec/collections/mysql.yaml crowdsecurity/apache2 ✔️ enabled 0.1 /etc/crowdsec/collections/apache2.yaml crowdsecurity/dovecot ✔️ enabled 0.1 /etc/crowdsec/collections/dovecot.yaml ------------------------------------------------------------------------------------------------------------
A ce niveau vous avez une liste d'IP à bloquer, mais [b]ELLES NE SONT PAS BLOQUÉES![/b] Nous sommes seulement à la première étape: La détection.
Vous pouvez d'ailleurs simplement lister les IPs à bloquer.
root@bullseye:~# cscli decisions list --all +-----+--------+-----------------------+----------------------+--------+---------+----+--------+---------------------+----------+ | ID | SOURCE | SCOPE:VALUE | REASON | ACTION | COUNTRY | AS | EVENTS | EXPIRATION | ALERT ID | +-----+--------+-----------------------+----------------------+--------+---------+----+--------+---------------------+----------+ | 1 | CAPI | Ip:49.88.112.75/32 | crowdsecurity/ssh-bf | ban | | | 0 | 23h15m26.663373073s | 1 | ... | 100 | CAPI | Ip:123.207.185.54/32 | crowdsecurity/ssh-bf | ban | | | 0 | 23h15m27.059075788s | 1 | +-----+--------+-----------------------+----------------------+--------+---------+----+--------+---------------------+----------+
Installation et configuration d'un "Bouncer"
Pour bloquer les malfaisants, il faut installer votre/vos "Bouncers" (Bouncers = Videur de boite de nuit...). Vous trouverez [url=https://hub.crowdsec.net/browse/#bouncers]ICI la listes des bouncers disponibles[/url] .
Il y en a pas mal... Le plus intéressant pour un serveur est [url=https://hub.crowdsec.net/author/crowdsecurity/bouncers/cs-firewall-bouncer]celui utilisant iptables/nftables[/url].
apt install nftables curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh | sudo bash apt install crowdsec-firewall-bouncer crowdsec-firewall-bouncer-nftables
Le fichier de config se trouve ici:
nano /etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml
- mode: cpeut être iptables, nftables , ipset ou pf
- update_frequency: contrôle la fréquence à laquelle le bouncer va interroger l’API locale
- api_url & api_key: contrôler les paramètres de l’API locale.
- iptables_chains: Permet (en mode iptables) de contrôler dans quelle chaîne les règles vont être insérées. (s’il est vide, le videur ne conservera que les listes d’ipset)
- disable_ipv6: Définir sur true pour désactiver ipv6
- deny_action: Définir quelle action utiliser pour refuser, DROP ou REJECT
- deny_log: Définir sur true pour ajouter une instruction de journal à la règle de pare-feu
- deny_log_prefix: si la journalisation est activée, permet de définir le préfixe du journal, par défaut "crowdsec
mode: nftables pid_dir: /var/run/ update_frequency: 10s daemonize: true log_mode: file log_dir: /var/log/ log_level: info api_url: http://localhost:8080/ api_key: 7c862f327f0205c2382e872dba60cfd4 disable_ipv6: false deny_action: DROP deny_log: true #to change log prefix deny_log_prefix: "crowdsec: " #if present, insert rule in those chains iptables_chains: - INPUT # - FORWARD # - DOCKER-USER
# systemctl start crowdsec-firewall-bouncer # systemctl status crowdsec-firewall-bouncer # systemctl enable crowdsec-firewall-bouncer
Et voilou ... Vous êtes protégé!
On va faire un test pour être sur!
root@bullseye:~# cscli decisions list No active decisions
A partir d'une autre machine on va faire le vilain... Pour des raisons de test j'ai enlevé la plage d'IP privée du la liste blanche
# nano /etc/crowdsec/parsers/s02-enrich/whitelists.yaml
name: crowdsecurity/whitelists description: "Whitelist events from private ipv4 addresses" whitelist: reason: "private ipv4/ipv6 ip/ranges" ip: - "127.0.0.1" - "::1" cidr: - "192.168.0.0/16" # - "10.0.0.0/8" - "172.16.0.0/12" # expression: # - "'foo.com' in evt.Meta.source_ip.reverse"
# systemctl restart crowdsec
Et ça ne loupe pas évidemment...
Sep 10 10:11:12 bullseye sshd[4584]: Failed password for root from 10.150.16.21 port 32820 ssh2 Sep 10 10:11:13 bullseye sshd[4584]: Failed password for root from 10.150.16.21 port 32820 ssh2
root@bullseye:~# cscli decisions list +-----+----------+-----------------+----------------------+--------+---------+----+--------+--------------------+----------+ | ID | SOURCE | SCOPE:VALUE | REASON | ACTION | COUNTRY | AS | EVENTS | EXPIRATION | ALERT ID | +-----+----------+-----------------+----------------------+--------+---------+----+--------+--------------------+----------+ | 201 | crowdsec | Ip:10.150.16.21 | crowdsecurity/ssh-bf | ban | | | 6 | 3h59m38.770890584s | 3 | +-----+----------+-----------------+----------------------+--------+---------+----+--------+--------------------+----------+
Nous allons nous débloquer...
root@bullseye:~# cscli decisions delete -i 10.150.16.21 INFO[10-09-2021 10:12:56 AM] 1 decision(s) deleted
Commandes Utiles
Bannir une adresse IP
Avec le client CrowdSec, vous pouvez avec la commande ban, ajouter ou supprimer manuellement des adresses IP à bloquer. Et la commande ban list vous permet de lister les adresses IP bloquées sur votre système.
cscli decisions list
Ajouter un bannissement manuellement pendant 24 heures :
cscli decisions add --ip 1.2.3.4 --duration 24h
Ajouter un bannissement sur une adresse IP et réclamer un CAPTCHA, un bannissement ou une limitation :
cscli decisions add --ip 1.2.3.4 --duration 24h --type
Ajouter un bannissement sur une tranche complète d’adresses IP :
cscli decisions add --range 1.2.3.0/24
Lister et retirer des règles de blocage Lister les règles de blocage
Pour visualiser vos règles :
cscli decisions list
Retirer un blocage
Vous pouvez défaire vos blocages manuels. Si vous voulez supprimer le bannissement de l’adresse IP 1.2.3.4 :
cscli decisions delete -i 1.2.3.4
Supprimer le bannissement du sous‑réseau 1.2.3.0/24 :
cscli decisions delete -r 1.2.3.0/24
Ou pour supprimer toutes les règles de bannissement exigeant un CAPTCHA :
cscli decisions delete --type captcha
Liste blanches
Très important: être capable de créer ses listes blanches pour ne pas se retrouver à la porte de son propre serveur...
On enlève l'IP du BAN:
cscli decisions delete -i 197.xxx.xxx.xxx cscli decisions delete -i 41.xxx.xxx.xxx
On crée la liste blanche:
nano /etc/crowdsec/parsers/s02-enrich/liste_blanche.yaml
name: crowdsecurity/whitelists description: "Liste blanche de mes IPs" whitelist: reason: "ma liste blanche" ip: - "41.xxx.xxx.xxx"
On recharge:
# systemctl reload crowdsec
On vérifie que la liste est active:
# cscli parsers list | grep liste_blanche liste_blanche.yaml 🏠 enabled,local /etc/crowdsec/parsers/s02-enrich/liste_blanche.yaml
Pour les IP dynamiques il vous faudra un script:
Mon script fonctionne en IPv4. Si vous avez l'équivalent fonctionnel pour l'IPv6 vous être le bienvenue: Partagez!
# nano /usr/local/bin/listeblanche_CrowdSec.sh
#!/bin/bash precedente=$(cat /usr/local/bin/votre.domaine.org) actuelle=$(dig +short votre.domaine.org) if ! [[ $actuelle =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then # echo "Echec. Ne semble pas être une IP valide. Sortie."; exit 1 elif [[ $actuelle = $precedente ]]; then # echo $actuelle "égale" $precedente "=> Sortie!" : else # echo $actuelle "différente" $precedente "=> On génère un nouveau fichier!" echo "name: crowdsecurity/whitelists" > /usr/local/bin/gateway.yaml echo "description: \"Mise en liste blanche de votre.domaine.org\"" >> /usr/local/bin/gateway.yaml echo "whitelist:" >> /usr/local/bin/gateway.yaml echo " reason: \"C'est la maison!\"" >> /usr/local/bin/gateway.yaml echo " ip:" >> /usr/local/bin/gateway.yaml echo " - \""$actuelle"\"" >> /usr/local/bin/gateway.yaml echo $actuelle > /usr/local/bin/votre.domaine.org cp /usr/local/bin/gateway.yaml /etc/crowdsec/parsers/s02-enrich/gateway.yaml systemctl reload crowdsec fi
Crontab:
*/5 * * * * /usr/local/bin/listeblanche_CrowdSec.sh
# cscli parsers list | grep gateway gateway.yaml 🏠 enabled,local /etc/crowdsec/parsers/s02-enrich/gateway.yaml
Voilà, simple et efficace. IPv6/IPv4 nftables, rapide et fiable ... et Français! :banana_rock:
A placer entre toutes les mains! :good: