Je vais vous présenter 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...
Code : Tout sélectionner
# lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 11 (bullseye)
Release: 11
Codename: bullseye
Code : Tout sélectionner
# apt update && apt upgrade
Code : Tout sélectionner
# 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.
Code : Tout sélectionner
# 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
Code : Tout sélectionner
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
Code : Tout sélectionner
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
Vous pouvez à tout moment relancer l'assistant pour choisir les services à surveiller/protéger: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
Code : Tout sélectionner
# /usr/share/crowdsec/wizard.sh -c
Code : Tout sélectionner
$ 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
------------------------------------------------------------------------------------------------------------
Nous sommes seulement à la première étape: La détection.
Vous pouvez d'ailleurs simplement lister les IPs à bloquer.
Code : Tout sélectionner
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 |
+-----+--------+-----------------------+----------------------+--------+---------+----+--------+---------------------+----------+
Pour bloquer les malfaisants, il faut installer votre/vos "Bouncers" (Bouncers = Videur de boite de nuit...).
Vous trouverez ICI la listes des bouncers disponibles .
Il y en a pas mal...
Le plus intéressant pour un serveur est celui utilisant iptables/nftables.
Code : Tout sélectionner
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
Code : Tout sélectionner
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
Code : Tout sélectionner
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
Code : Tout sélectionner
# systemctl start crowdsec-firewall-bouncer
# systemctl status crowdsec-firewall-bouncer
# systemctl enable crowdsec-firewall-bouncer
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
Code : Tout sélectionner
# nano /etc/crowdsec/parsers/s02-enrich/whitelists.yaml
Code : Tout sélectionner
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"
Code : Tout sélectionner
# systemctl restart crowdsec
Code : Tout sélectionner
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
Code : Tout sélectionner
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 |
+-----+----------+-----------------+----------------------+--------+---------+----+--------+--------------------+----------+
Code : Tout sélectionner
root@bullseye:~# cscli decisions delete -i 10.150.16.21
INFO[10-09-2021 10:12:56 AM] 1 decision(s) deleted
IPv6/IPv4 nftables, rapide et fiable ... et Français!
A placer entre toutes les mains!