« Crowdsec » : différence entre les versions

De Le Wiki du Forum-Debian.fr
Aller à la navigation Aller à la recherche
 
(2 versions intermédiaires par le même utilisateur non affichées)
Ligne 285 : Ligne 285 :
   liste_blanche.yaml              🏠  enabled,local          /etc/crowdsec/parsers/s02-enrich/liste_blanche.yaml
   liste_blanche.yaml              🏠  enabled,local          /etc/crowdsec/parsers/s02-enrich/liste_blanche.yaml


Pour le IP dynamiques il faudra vous faudra un script:
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
  # nano /usr/local/bin/listeblanche_CrowdSec.sh
<pre>#!/bin/bash
<pre>#!/bin/bash
precedente=$(cat /usr/local/bin/votre.domaine.org)
precedente=$(cat /usr/local/bin/votre.domaine.org)
actuelle=$(dig +short votre.domaine.org)
actuelle=$(dig +short votre.domaine.org)  


if ! [[ $actuelle =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
if ! [[ $actuelle =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
  echo "Echec. Ne semble pas être une IP valide. Sortie.";
#    echo "Echec. Ne semble pas être une IP valide. Sortie.";
     :
     exit 1
   elif [[ $actuelle = $precedente ]]; then
   elif [[ $actuelle = $precedente ]]; then
#    echo $actuelle "égale" $precedente "=> Sortie!"
     :
     :
   else
   else
     echo "name: crowdsecurity/whitelists" > /usr/local/bin/gateway.yaml
#     echo $actuelle "différente" $precedente "=> On génère un nouveau fichier!"
    echo "description: \"Mise en liste blanche de votre.domaine.org\"" >> /usr/local/bin/gateway.yaml
    echo "name: crowdsecurity/whitelists" > /usr/local/bin/gateway.yaml
    echo "whitelist:" >> /usr/local/bin/gateway.yaml
    echo "description: \"Mise en liste blanche de votre.domaine.org\"" >> /usr/local/bin/gateway.yaml
    echo "  reason: \"C'est la maison!\"" >> /usr/local/bin/gateway.yaml
    echo "whitelist:" >> /usr/local/bin/gateway.yaml
    echo "  ip:" >> /usr/local/bin/gateway.yaml
    echo "  reason: \"C'est la maison!\"" >> /usr/local/bin/gateway.yaml
    echo "    - \""$actuelle"\"" >> /usr/local/bin/gateway.yaml
    echo "  ip:" >> /usr/local/bin/gateway.yaml
    echo $actuelle > /usr/local/bin/votre.domaine.org
    echo "    - \""$actuelle"\"" >> /usr/local/bin/gateway.yaml
    cp  /usr/local/bin/gateway.yaml /etc/crowdsec/parsers/s02-enrich/gateway.yaml
    echo $actuelle > /usr/local/bin/votre.domaine.org
    systemctl reload crowdsec
    cp  /usr/local/bin/gateway.yaml /etc/crowdsec/parsers/s02-enrich/gateway.yaml
    systemctl reload crowdsec
fi</pre>
fi</pre>



Dernière version du 13 septembre 2021 à 07:26

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:

Discussion sur le forum

Lol (discussion)