NOPE LinkedIn

Catégories:
Tips&Tricks
Security
Crowdsec

Installation de crowdsec sur Debian

Introduction

Crowdsec est une jeune solution de cybersécurité libre, gratuite, massivement collaborative et d’origine française. Il permet de détecter des comportements anormaux (à partir de l’analyse des logs provenant par exemple de syslog mais pas que) et de bloquer les attaques. Il collabore également au niveau mondial avec son réseau d’utilisateurs en partageant les adresses IP détectées. Ceci permet alors à chacun de les bloquer de manière préventive. L’objectif est de bâtir une immense base de données de réputation IP et d’en garantir un usage gratuit à ceux participant à son enrichissement.

En résumé, si vous souhaitez protéger des serveurs délivrant des services accessibles depuis Internet, Crowdsec est fait pour ça.

Fonctionnement général

Fonctionnement Crowdsec

Comme toute solution moderne, celle-ci vient avec son vocabulaire dont voici une présentation simplifiée :

  • Collection : ensemble de parsers et de scénarios.
  • Bouncer : en charge des blocages (en s’appuyant sur iptables, nginx…). L’installation d’un bouncer sur un serveur ne nécessite pas obligatoirement l’installation de l’agent Crowdsec sur ce même serveur.
  • Parser : analyseur de logs adapté à un service. L’analyseur peut être sur une machine différente que le serveur LAPI.
  • Scénario : permet de détecter et de qualifier un comportement spécifique, généralement une attaque.
  • Agent Crowdsec : peut être configuré en mode “standalone” (fonctionnement de base) ou bien configuré pour se connecter à un autre agent Crowdsec qui fait office de serveur Local API.
  • Serveur local API : agent crowdsec qui se connecte au serveur Central API et configuré pour que puissent se connecter :
    • les agents Crowdsec (faisant tourner les parsers et les scénarios)
    • les bouncers (pour récupérer et appliquer les décisions de blocages).
  • Serveur Central API : serveur Central API auquel se connecte le serveur Local API pour récupérer les décisions communautaires et participer à celles-ci.
  • cscli : ligne de commande permettant d’interagir avec Crowdsec.

Selon la documentation officielle de Crowdsec, le runtime Crowdsec-agent s’articule autour de quelques concepts simples :

  • Il lit les journaux (définis via la configuration d’acquisition)
  • Ces journaux sont analysés via des parsers et éventuellement enrichis.
  • Ces journaux normalisés sont ensuite comparés aux scénarios déployés par l’utilisateur.
  • Lorsqu’un scénario est “déclenché”, Crowdsec-agent génère une alerte et éventuellement une ou plusieurs décisions associées.
    • L’alerte est ici principalement pour la traçabilité, et demeurera même après l’expiration de la décision.
    • La décision, quant à elle, est de courte durée et indique les mesures à prendre contre l’adresse IP/plage/utilisateur incriminé…
  • Ces informations (le signal, les décisions associées) sont ensuite envoyées à l’API locale de crowdsec et stockées dans la base de données.

ATTENTION Il faut bien garder à l’esprit que le package Crowdsec est seulement en charge de la détection et ne va pas bloquer quoi que ce soit. Il faut pour cela installer un agent de remédiation (bouncer)pour prendre cette décision.

Installation

Crowdsec peut s’installer sur d’autre distribution Linux, tout est documenté sur la page d’installation

Configuration du depot sur le serveur

curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh | bash

Installation de l’agent

# apt-get install crowdsec
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following NEW packages will be installed:
  crowdsec
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 0 B/36.6 MB of archives.
After this operation, 137 MB of additional disk space will be used.
Preconfiguring packages ...
Selecting previously unselected package crowdsec.
(Reading database ... 33631 files and directories currently installed.)
Preparing to unpack .../crowdsec_1.5.2_amd64.deb ...
You can always run the configuration again interactively by using '/usr/share/crowdsec/wizard.sh -c
Unpacking crowdsec (1.5.2) ...
Setting up crowdsec (1.5.2) ...
Updating hub
INFO[09-07-2023 11:43:48] hub index is up to date
INFO[09-07-2023 11:43:48] Wrote new 787710 bytes index to /etc/crowdsec/hub/.index.json
Created symlink /etc/systemd/system/multi-user.target.wants/crowdsec.service → /lib/systemd/system/crowdsec.service.
You can always run the configuration again interactively by using '/usr/share/crowdsec/wizard.sh -c

Enrollment de l’agent

Pour pouvoir avoir accès facilement aux alertes remontées par l’agent installé sur votre serveur, il faut l’enregistrer sur le site de Crowdsec et donc se connecter à la Console

Fonctionnement Crowdsec

Et avoir accès au menu principal:

Menu principal

Ensuite, il faut sélectionner Engines, puis Add security engine

Ajout d'un nouveau endpoint

Il faut maintenant récupérer la commande permettant d’ajouter votre nouvelle sonde sur votre compte.

commande ajout cscli

Une fois connecté à la console il suffit de lancer la commande précédente:

cscli console enroll <Identiant Crowdsec>
# cscli capi register
WARN[09-07-2023 12:47:20] can't load CAPI credentials from '/etc/crowdsec/online_api_credentials.yaml' (missing field)
INFO[09-07-2023 12:47:20] push and pull to Central API disabled
WARN[09-07-2023 12:47:20] You are using sqlite without WAL, this can have a performance impact. If you do not store the database in a network share, set db_config.use_wal to true. Set explicitly to false to disable this warning.
WARN[09-07-2023 12:47:20] can't load CAPI credentials from '/etc/crowdsec/online_api_credentials.yaml' (missing field)
INFO[09-07-2023 12:47:20] push and pull to Central API disabled
INFO[09-07-2023 12:47:20] Successfully registered to Central API (CAPI)
INFO[09-07-2023 12:47:20] Central API credentials dumped to '/etc/crowdsec/online_api_credentials.yaml'
WARN[09-07-2023 12:47:20] Run 'sudo systemctl reload crowdsec' for the new configuration to be effective.

On relance Crowdsec

# systemctl reload crowdsec
# cscli console enroll <Identiant Crowdsec>
WARN[09-07-2023 12:48:40] You are using sqlite without WAL, this can have a performance impact. If you do not store the database in a network share, set db_config.use_wal to true. Set explicitly to false to disable this warning.
INFO[09-07-2023 12:48:42] manual set to true
INFO[09-07-2023 12:48:42] context set to true
INFO[09-07-2023 12:48:42] Enabled tainted&manual alerts sharing, see 'cscli console status'.
INFO[09-07-2023 12:48:42] Watcher successfully enrolled. Visit https://app.crowdsec.net to accept it.
INFO[09-07-2023 12:48:42] Please restart crowdsec after accepting the enrollment.

Il faut ensuite retourner sur la console WEB pour accepter l’ajout de notre nouveau serveur

Ajout du nouveau serveur

Le nouveau serveur apparait normalement dans la liste.

Nouveau serveur

Notre nouveau serveur n’est dans aucune liste d’exclusions, n’a aucun bouncer installés, ni aucun scénario.

Configuration

Ajout dans les listes d’exclusions

Avec un compte de base, on ne peut utiliser que deux des listes disponibles. J’ai fait le choix d’utiliser les deux suivantes:

Listes d'exsclusions

Pour ajouter des endpoint, il suffit de selectionner sur la droite des listes Manage. Il vous propose le ou les serveurs enregistrés et ne figurant pas dans cette liste.

Listes d'exsclusions

Cette opération est a répéter pour chaque liste.

Ajout des parsers

apt-get update
apt-get upgrade
cscli collections install LePresidente/emby
cscli collections install crowdsecurity/haproxy
cscli collections install crowdsecurity/iptables
cscli collections install crowdsecurity/linux
cscli collections install crowdsecurity/nginx
cscli collections install LePresidente/ombi
cscli collections install schiz0phr3ne/radarr
cscli collections install schiz0phr3ne/sonarr
cscli collections install crowdsecurity/sshd
cscli collections install crowdsecurity/traefik

Installation du parser docker-logs

# cscli parsers install crowdsecurity/docker-logs
INFO[09-07-2023 13:51:52] crowdsecurity/docker-logs : OK
INFO[09-07-2023 13:51:52] Enabled parsers : crowdsecurity/docker-logs
INFO[09-07-2023 13:51:52] Enabled crowdsecurity/docker-logs
INFO[09-07-2023 13:51:52] Run 'sudo systemctl reload crowdsec' for the new configuration to be effective.

Installation de scénarios

cscli scenario install crowdsecurity/http-backdoors-attempts crowdsecurity/http-bad-user-agent
# cscli scenario install crowdsecurity/http-backdoors-attempts
WARN[09-07-2023 13:58:51] crowdsecurity/http-backdoors-attempts : overwrite
INFO[09-07-2023 13:58:51] Enabled crowdsecurity/http-backdoors-attempts
INFO[09-07-2023 13:58:51] Run 'sudo systemctl reload crowdsec' for the new configuration to be effective.

Il est possible d’installer plusieurs scénarios en même temps.

# cscli scenario install crowdsecurity/http-backdoors-attempts crowdsecurity/http-bad-user-agent
WARN[09-07-2023 13:59:22] crowdsecurity/http-backdoors-attempts : overwrite
INFO[09-07-2023 13:59:22] Enabled crowdsecurity/http-backdoors-attempts
WARN[09-07-2023 13:59:22] crowdsecurity/http-bad-user-agent : overwrite
INFO[09-07-2023 13:59:22] Enabled crowdsecurity/http-bad-user-agent
INFO[09-07-2023 13:59:22] Run 'sudo systemctl reload crowdsec' for the new configuration to be effective.

Intallation des bouncers

La sortie résultant de l’installation est très verbeuse. L’exemple suivant montre uniquement l’installation du Bouncer iptables

 # apt install crowdsec-firewall-bouncer-iptables
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  ipset libipset13
The following NEW packages will be installed:
  crowdsec-firewall-bouncer-iptables ipset libipset13
0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded.
Need to get 3,771 kB of archives.
After this operation, 12.9 MB of additional disk space will be used.
Do you want to continue? [Y/n] y
Get:1 http://mirror.hetzner.com/debian/packages bookworm/main amd64 libipset13 amd64 7.17-1 [67.5 kB]
Get:2 http://mirror.hetzner.com/debian/packages bookworm/main amd64 ipset amd64 7.17-1 [45.7 kB]
Get:3 https://packagecloud.io/crowdsec/crowdsec/debian bookworm/main amd64 crowdsec-firewall-bouncer-iptables amd64 0.0.27 [3,658 kB]
Fetched 3,771 kB in 1s (4,335 kB/s)
Selecting previously unselected package libipset13:amd64.
(Reading database ... 33645 files and directories currently installed.)
Preparing to unpack .../libipset13_7.17-1_amd64.deb ...
Unpacking libipset13:amd64 (7.17-1) ...
Selecting previously unselected package ipset.
Preparing to unpack .../ipset_7.17-1_amd64.deb ...
Unpacking ipset (7.17-1) ...
Selecting previously unselected package crowdsec-firewall-bouncer-iptables.
Preparing to unpack .../crowdsec-firewall-bouncer-iptables_0.0.27_amd64.deb ...
Unpacking crowdsec-firewall-bouncer-iptables (0.0.27) ...
Setting up libipset13:amd64 (7.17-1) ...
Setting up ipset (7.17-1) ...
Setting up crowdsec-firewall-bouncer-iptables (0.0.27) ...
INFO[0000] crowdsec-firewall-bouncer v0.0.27-debian-pragmatic-8d09f19d69e92a63e63888794af3a57c6ade3489
cscli/crowdsec is present, generating API key
API Key successfully created
Created symlink /etc/systemd/system/multi-user.target.wants/crowdsec-firewall-bouncer.service → /etc/systemd/system/crowdsec-firewall-bouncer.service.
Processing triggers for man-db (2.11.2-2) ...
Processing triggers for libc-bin (2.36-9) ...

Il faut relancer Crowdsec

# systemctl reload crowdsec

Controle de l’installation

Parsers

On peut ensuite contrôler l’installation ainsi que les version des différents parsers présent sur le serveur.

root@debian-64gb-fsn1-2 ~ # cscli parsers list

PARSERS
───────────────────────────────────────────────────────────────────────────────────────────────────────────────
 Name                             📦 Status   Version   Local Path
───────────────────────────────────────────────────────────────────────────────────────────────────────────────
 LePresidente/emby-logs           ✔️ enabled   0.3       /etc/crowdsec/parsers/s01-parse/emby-logs.yaml
 LePresidente/ombi-logs           ✔️ enabled   0.2       /etc/crowdsec/parsers/s01-parse/ombi-logs.yaml
 crowdsecurity/dateparse-enrich   ✔️ enabled   0.2       /etc/crowdsec/parsers/s02-enrich/dateparse-enrich.yaml
 crowdsecurity/docker-logs        ✔️ enabled   0.1       /etc/crowdsec/parsers/s00-raw/docker-logs.yaml
 crowdsecurity/geoip-enrich       ✔️ enabled   0.2       /etc/crowdsec/parsers/s02-enrich/geoip-enrich.yaml
 crowdsecurity/haproxy-logs       ✔️ enabled   0.6       /etc/crowdsec/parsers/s01-parse/haproxy-logs.yaml
 crowdsecurity/http-logs          ✔️ enabled   1.1       /etc/crowdsec/parsers/s02-enrich/http-logs.yaml
 crowdsecurity/iptables-logs      ✔️ enabled   0.3       /etc/crowdsec/parsers/s01-parse/iptables-logs.yaml
 crowdsecurity/nginx-logs         ✔️ enabled   1.3       /etc/crowdsec/parsers/s01-parse/nginx-logs.yaml
 crowdsecurity/sshd-logs          ✔️ enabled   2.1       /etc/crowdsec/parsers/s01-parse/sshd-logs.yaml
 crowdsecurity/syslog-logs        ✔️ enabled   0.8       /etc/crowdsec/parsers/s00-raw/syslog-logs.yaml
 crowdsecurity/traefik-logs       ✔️ enabled   0.6       /etc/crowdsec/parsers/s01-parse/traefik-logs.yaml
 schiz0phr3ne/radarr-logs         ✔️ enabled   0.2       /etc/crowdsec/parsers/s01-parse/radarr-logs.yaml
 schiz0phr3ne/sonarr-logs         ✔️ enabled   0.2       /etc/crowdsec/parsers/s01-parse/sonarr-logs.yaml
───────────────────────────────────────────────────────────────────────────────────────────────────────────────

Scénarios

# cscli scenarios list

SCENARIOS
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 Name                                               📦 Status   Version   Local Path
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 LePresidente/emby-bf                               ✔️ enabled   0.1       /etc/crowdsec/scenarios/emby-bf.yaml
 LePresidente/ombi-bf                               ✔️ enabled   0.1       /etc/crowdsec/scenarios/ombi-bf.yaml
 crowdsecurity/CVE-2019-18935                       ✔️ enabled   0.1       /etc/crowdsec/scenarios/CVE-2019-18935.yaml
 crowdsecurity/CVE-2022-26134                       ✔️ enabled   0.1       /etc/crowdsec/scenarios/CVE-2022-26134.yaml
 crowdsecurity/CVE-2022-35914                       ✔️ enabled   0.1       /etc/crowdsec/scenarios/CVE-2022-35914.yaml
 crowdsecurity/CVE-2022-37042                       ✔️ enabled   0.1       /etc/crowdsec/scenarios/CVE-2022-37042.yaml
 crowdsecurity/CVE-2022-40684                       ✔️ enabled   0.2       /etc/crowdsec/scenarios/CVE-2022-40684.yaml
 crowdsecurity/CVE-2022-41082                       ✔️ enabled   0.3       /etc/crowdsec/scenarios/CVE-2022-41082.yaml
 crowdsecurity/CVE-2022-41697                       ✔️ enabled   0.1       /etc/crowdsec/scenarios/CVE-2022-41697.yaml
 crowdsecurity/CVE-2022-42889                       ✔️ enabled   0.2       /etc/crowdsec/scenarios/CVE-2022-42889.yaml
 crowdsecurity/CVE-2022-44877                       ✔️ enabled   0.2       /etc/crowdsec/scenarios/CVE-2022-44877.yaml
 crowdsecurity/CVE-2022-46169                       ✔️ enabled   0.1       /etc/crowdsec/scenarios/CVE-2022-46169.yaml
 crowdsecurity/apache_log4j2_cve-2021-44228         ✔️ enabled   0.4       /etc/crowdsec/scenarios/apache_log4j2_cve-2021-44228.yaml
 crowdsecurity/f5-big-ip-cve-2020-5902              ✔️ enabled   0.1       /etc/crowdsec/scenarios/f5-big-ip-cve-2020-5902.yaml
 crowdsecurity/fortinet-cve-2018-13379              ✔️ enabled   0.2       /etc/crowdsec/scenarios/fortinet-cve-2018-13379.yaml
 crowdsecurity/grafana-cve-2021-43798               ✔️ enabled   0.1       /etc/crowdsec/scenarios/grafana-cve-2021-43798.yaml
 crowdsecurity/http-backdoors-attempts              ✔️ enabled   0.3       /etc/crowdsec/scenarios/http-backdoors-attempts.yaml
 crowdsecurity/http-bad-user-agent                  ✔️ enabled   0.8       /etc/crowdsec/scenarios/http-bad-user-agent.yaml
 crowdsecurity/http-crawl-non_statics               ✔️ enabled   0.3       /etc/crowdsec/scenarios/http-crawl-non_statics.yaml
 crowdsecurity/http-cve-2021-41773                  ✔️ enabled   0.1       /etc/crowdsec/scenarios/http-cve-2021-41773.yaml
 crowdsecurity/http-cve-2021-42013                  ✔️ enabled   0.1       /etc/crowdsec/scenarios/http-cve-2021-42013.yaml
 crowdsecurity/http-generic-bf                      ✔️ enabled   0.4       /etc/crowdsec/scenarios/http-generic-bf.yaml
 crowdsecurity/http-open-proxy                      ✔️ enabled   0.3       /etc/crowdsec/scenarios/http-open-proxy.yaml
 crowdsecurity/http-path-traversal-probing          ✔️ enabled   0.2       /etc/crowdsec/scenarios/http-path-traversal-probing.yaml
 crowdsecurity/http-probing                         ✔️ enabled   0.2       /etc/crowdsec/scenarios/http-probing.yaml
 crowdsecurity/http-sensitive-files                 ✔️ enabled   0.2       /etc/crowdsec/scenarios/http-sensitive-files.yaml
 crowdsecurity/http-sqli-probing                    ✔️ enabled   0.2       /etc/crowdsec/scenarios/http-sqli-probing.yaml
 crowdsecurity/http-xss-probing                     ✔️ enabled   0.2       /etc/crowdsec/scenarios/http-xss-probing.yaml
 crowdsecurity/iptables-scan-multi_ports            ✔️ enabled   0.1       /etc/crowdsec/scenarios/iptables-scan-multi_ports.yaml
 crowdsecurity/jira_cve-2021-26086                  ✔️ enabled   0.1       /etc/crowdsec/scenarios/jira_cve-2021-26086.yaml
 crowdsecurity/netgear_rce                          ✔️ enabled   0.2       /etc/crowdsec/scenarios/netgear_rce.yaml
 crowdsecurity/nginx-req-limit-exceeded             ✔️ enabled   0.1       /etc/crowdsec/scenarios/nginx-req-limit-exceeded.yaml
 crowdsecurity/pulse-secure-sslvpn-cve-2019-11510   ✔️ enabled   0.2       /etc/crowdsec/scenarios/pulse-secure-sslvpn-cve-2019-11510.yaml
 crowdsecurity/spring4shell_cve-2022-22965          ✔️ enabled   0.2       /etc/crowdsec/scenarios/spring4shell_cve-2022-22965.yaml
 crowdsecurity/ssh-bf                               ✔️ enabled   0.1       /etc/crowdsec/scenarios/ssh-bf.yaml
 crowdsecurity/ssh-slow-bf                          ✔️ enabled   0.2       /etc/crowdsec/scenarios/ssh-slow-bf.yaml
 crowdsecurity/thinkphp-cve-2018-20062              ✔️ enabled   0.3       /etc/crowdsec/scenarios/thinkphp-cve-2018-20062.yaml
 crowdsecurity/vmware-cve-2022-22954                ✔️ enabled   0.2       /etc/crowdsec/scenarios/vmware-cve-2022-22954.yaml
 crowdsecurity/vmware-vcenter-vmsa-2021-0027        ✔️ enabled   0.1       /etc/crowdsec/scenarios/vmware-vcenter-vmsa-2021-0027.yaml
 ltsich/http-w00tw00t                               ✔️ enabled   0.1       /etc/crowdsec/scenarios/http-w00tw00t.yaml
 schiz0phr3ne/radarr-bf                             ✔️ enabled   0.1       /etc/crowdsec/scenarios/radarr-bf.yaml
 schiz0phr3ne/sonarr-bf                             ✔️ enabled   0.1       /etc/crowdsec/scenarios/sonarr-bf.yaml
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

Bouncers

# cscli  bouncers list
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 Name                             IP Address   Valid   Last API pull          Type                        Version                                                             Auth Type
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 cs-firewall-bouncer-1688901786   127.0.0.1    ✔️       2023-07-09T11:39:29Z   crowdsec-firewall-bouncer   v0.0.27-debian-pragmatic-8d09f19d69e92a63e63888794af3a57c6ade3489   api-key
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

Note: La remontée des informations sur la console Crowdsec peut prendre un peu de temps mais au final une fois le serveur configuré, vous devriez avoir quelque chose dans le genre.

Serveur sur la console Web

Il est possible d’installer Crowdsec sur des firewall comme opnsense et ainsi bénéficier d’un firewall NextGen

Console

# cscli console status
╭────────────────────┬───────────┬───────────────────────────────────────────────────╮
│ Option Name        │ Activated │ Description                                       │
├────────────────────┼───────────┼───────────────────────────────────────────────────┤
│ custom             │ ✅        │ Send alerts from custom scenarios to the console  │
│ manual             │ ✅        │ Send manual decisions to the console              │
│ tainted            │ ✅        │ Send alerts from tainted scenarios to the console │
│ context            │ ✅        │ Send context with alerts to the console           │
│ console_management │ ❌        │ Receive decisions from console                    │
╰────────────────────┴───────────┴───────────────────────────────────────────────────╯

il est possible d’activer ou de désactiver les options avec la commande cscli console enable/disable <Nom de l'option>

Conclusion

Au final, par le biais de cette console centralisée, vous avez un rapport complet des alertes sur votre infrastructure. Les différentes graphes vous permettrons d’avoir une meilleure appréhension de la sécurité sur vos serveurs, firewalls.

Alertes sur la console Web

  • Par IPs Sources

    Alertes sur la console Web

  • Par AS Sources

    Alertes sur la console Web

  • Par pays d’origines

    Alertes sur la console Web

  • Par scénarios

    Alertes sur la console Web

  • Par endpoint

    Alertes sur la console Web