[Tuto] Installation et Configuration de CrowdSec avec le reverse proxy SWAG

EVO

Administreur
Membre du personnel
25 Novembre 2019
8 213
1 575
278
/var/run/docker.sock
Bonjour,
Voici un petit tuto, pour ceux qui souhaiterai installer Crowdsec en Docker et le configurer sur votre instance SWAG.
Ceci est la suite du tutoriel : [Tuto] Installer SWAG en Docker ( Reverse Proxy )


CrowdSec, c'est quoi ? :giggle:
A Venir

Disclamer :
Le but de ce tuto sera de rendre cette installation facile et accessible a tous, bien que loin d’être un expert de docker/docker compose, n’hésiter pas à répondre à ce sujet avec vos interrogations, .. Pour ceux qui sont plus a l'aise avec ce genre d'installation, n'hésiter pas a proposer des améliorations, ou des conseils, ...

Pour un support sur Crowdsec ne concernant pas une installation via ce tutoriel, merci de poster votre question dans Applications.


Pré-requis :
Avoir installer SWAG sur sa machine en suivant ce tutoriel : [Tuto] Installer SWAG en Docker ( Reverse Proxy )

Sommaire :
1/ Mise en place de Crowdsec
a/ Installation de Crowdsec
b/ Configuration du Bouncer sur SWAG
c/ Quelques commandes utiles
d/ Rajout d'un Tableau de Bord
e/ Lier son instance à l'app Crowsed
2/ Notifications
a/ Être notifié via Gotify
b/ Être notifié via Discord

Aller go :)


1/ Mise en place de Crowdsec
a/ Installation de Crowdsec
Nous allons en 1er lieu, nous rendre dans notre dossier swag, si par exemple il se trouve dans /volume1/docker/swag, alors on tape :
cd /volume1/docker/swag

Si vous avez suivi mon tuto, notre fichier docker-compose.yml de SWAG ce trouve dans ce dossier.

Nous allons créer les deux dossier nécessaire au fonctionnement de Crowdsec :
mkdir -p crowdsec/{crowdsec-db,crowdsec-config}

Nous allons créer notre fichier d'aquisition :
nano crowdsec/acquis.yaml

Dedans nous indiquons le template d'aquisions pour la collections nginx :
Code:
filenames:
  - /var/log/nginx/*.log
labels:
  type: nginx

On sauvegarde le fichier, et on quitte l'éditeur !

Nous allons maintenant editer notre fichier docker-compose afin d'y rajouter notre conteneur Crowdsec :

nano docker-compose.yml

Code:
version: "2.1"
services:
  swag:
[...]

  crowdsec:
    container_name: crowdsec
    image: crowdsecurity/crowdsec
    restart: unless-stopped
    environment:
      - COLLECTIONS=crowdsecurity/nginx
      - GID=1000
    depends_on:
      - swag
    volumes:
      - ./config/log/nginx:/var/log/nginx
      - ./crowdsec/acquis.yaml:/etc/crowdsec/acquis.yaml
      - ./crowdsec/crowdsec-db:/var/lib/crowdsec/data/
      - ./crowdsec/crowdsec-config:/etc/crowdsec/
    security_opt:
      - no-new-privileges=true

Ici nous allons donc rajouter le service crowdsec a notre compose swag actuel.

GID doit être égal au PGID de votre utilisateurs ( comme nous avons configuré le PGID dans SWAG )
Si vous êtes comme moi avec le fichier docker-compose.yml a la racine de votre dossier SWAG, vous n'avez pas besoin de le modifier le chemins vers le fichier et les 3 dossiers suivant :
./crowdsec/acquis.yaml doit correspondre au fichier créer avant.
./config/log/nginx doit correspondre au dossier vers les logs nginx de SWAG.
./crowdsec/crowdsec-db doit correspondre au dossier créer en début de paragraphe.
./crowdsec/crowdsec-config doit correspondre au dossier créer en début de paragraphe.

Maintenant, vous pouvez enregistrer les modifications, et fermer l'éditeur.

Lancer la commande : docker compose up -d pour mettre à jour la configuration, cela va lancer la création du conteneur crowdsec que nous avons rajouté !

Attendez quelques minutes que le conteneurs démarre :) Puis passer au point suivant :)

b/ Configuration du Bouncer sur SWAG
Pour ajouter un "bouncers" a notre conteneur crowdsec, il faut executer cette commande :
docker exec -t crowdsec cscli bouncers add bouncer-swag

Cela va vous donner une clé API à ajouter dans les paramètres d'environnement de SWAG. ( Gardez là , nous allons en avoir besoin juste après ).

Exemple :

Pour configurer le bouncers SWAG, nous allons editer notre fichier docker-compose.

Code:
version: "2"

services:
  swag:
    image: linuxserver/swag
    container_name: swag
    cap_add:
      - NET_ADMIN
#    labels:
#      - com.centurylinklabs.watchtower.enable=true
    environment:
      - PUID=9999
      - PGID=111
      - TZ=Europe/Paris
      - URL=tutoevo.fr
      - SUBDOMAINS=wildcard
      - VALIDATION=dns
      - DNSPLUGIN=ovh
      - EMAIL=xxx@xxx.com
    volumes:
      - ./config:/config
    ports:
      - 443:443
      - 80:80
    restart: unless-stopped

* Suivant votre configuration, il n'est pas forcément strictement identique ce n'est pas grave.

Dans le champs "environnement:" nous allons devois rajouter 3 paramètres :
Code:
      - DOCKER_MODS=linuxserver/mods:swag-crowdsec
      - CROWDSEC_API_KEY=hg45a7235458c69c46f59574334sk11p
      - CROWDSEC_LAPI_URL=http://crowdsec:8080

Attention, hg45a7235458c69c46f59574334sk11p de la variable CROWDSEC_API_KEY est a remplacer par l'apikey que vous a donner la commande au début de ce paraphaphe.

Par exemple comme ceci :
Code:
version: "2"

services:
  swag:
    image: linuxserver/swag
    container_name: swag
    cap_add:
      - NET_ADMIN
#    labels:
#      - com.centurylinklabs.watchtower.enable=true
    environment:
      - PUID=9999
      - PGID=111
      - TZ=Europe/Paris
      - URL=tutoevo.fr
      - SUBDOMAINS=wildcard
      - VALIDATION=dns
      - DNSPLUGIN=ovh
      - EMAIL=xxx@xxx.com
      - DOCKER_MODS=linuxserver/mods:swag-crowdsec
      - CROWDSEC_API_KEY=hg45a7235458c69c46f59574334sk11p
      - CROWDSEC_LAPI_URL=http://crowdsec:8080
    volumes:
      - ./config:/config
    ports:
      - 443:443
      - 80:80
    restart: unless-stopped

Note: Dans le cas ou vous utilisez deja la variable DOCKER_MODS, par exemple car vous avez configurer le dashboard de SWAG, via :
- DOCKER_MODS=linuxserver/mods:swag-dashboard vous devez rajouter le mods crowdsec via le séparateur | de cette façon : - DOCKER_MODS=linuxserver/mods:swag-dashboard|linuxserver/mods:swag-crowdsec

Une fois les modifications effectuées, vous devez lancer la recréaction du conteneur avec la commande : docker compose up -d



c/ Quelques commandes utiles
En Constrution ...

docker exec -t crowdsec cscli metrics


Voir la liste de "decisions" en cours :
docker exec -t crowdsec cscli decisions list

Purger la liste de "decisions" en cours :
docker exec -t crowdsec cscli decisions delete --all

Supprimer les "decisions" pour une plage ip ( ici 1.2.3.0/24 ) :
docker exec -t crowdsec cscli decisions delete -r 1.2.3.0/24

Supprimer les "decisions" sur une ip ( ici 1.2.3.0 ) :
docker exec -t crowdsec cscli decisions delete -i 1.2.3.4

Supprimer les "decisions" d'un scenarios ( ici crowdsecurity/ssh-bfcscli ) :
docker exec -t crowdsec cscli decisions delete -s crowdsecurity/ssh-bfcscli

d/ Rajout d'un Tableau de Bord - Dashboard
Nous sommes toujours dans notre dossier swag !

On créer le dashboard avec la commande suivante : mkdir -p crowdsec/dashboard

Puis on récupère le Dockerfile qui va nous permettre de créer l'image de notre conteneur : wget -P crowdsec/dashboard https://github.com/crowdsecurity/example-docker-compose/blob/main/basic/crowdsec/dashboard/Dockerfile

Nous allons maintenant éditer notre docker-compose.yml afin d'y rajouter notre conteneur "dashboard", vous allez rajouter le service "dashboard" à la fin de fichier, comme ceci :

Code:
version: "2.1"
services:
  swag:
[...]

  crowdsec:
[...]

  dashboard:
    container_name: crowdsec-dashboard
    build: ./crowdsec/dashboard
    restart: unless-stopped
    depends_on:
      - crowdsec
    ports:
      - 3000:3000
    environment:
      - MB_DB_FILE=/data/metabase.db
      - MGID=1000
    volumes:
      - ./crowdsec/crowdsec-db:/metabase-data/

Puis on valide avec Ctrl+X :)

Maintenant, on lance la création du conteneur : docker compose up -d

Une fois fini, on se rend a l'adresse https://IP_LOCALE_NAS:3000 pour acceder a l'interface du tableau de bord !

Les identifiants par defaut sont : crowdsec@crowdsec.net and !!Cr0wdS3c_M3t4b4s3??



9Tv3FlN.png




e/ Lier son instance à l'app Crowsed
Source, merci @axionman

-Aller sur le site https://app.crowdsec.net/ et créer un compte:

2022-10-04 19-39-54.png

-On vous proposera ensuite d'enregistrer une instance à l'aide d'une commande:

En SSH, exécuter la commande suivante:

docker exec -t crowdsec cscli console enroll cl8rkusxxxxxxxxxxxxxxx

2022-10-04 19-40-03.png

-Retourner ensuite le site de https://app.crowdsec.net/ et cliquer sur "accept" pour enregistrer l'instance.

2022-10-04 19-40-08.png

-Redémarrer le container de Crowdsec, et voilà, vous pouvez désormais monitorer votre instance depuis le site web de Crowdsec:

2022-10-04 19-40-14.png



2/ Notifications

Les commandes données, le sont toujours en partant du principe que vous êtes en SSH dans notre dossier d'installation de SWAG, avec dedans un dossier crowdsec comprenant les dossiers crowdsec-db et crowdsec-config.

a/ Être notifié via Gotify
Dans le dossier notifications de Crowdsec, nous allons créer un fichier gotify.yaml :

nano crowdsec/crowdsec-config/notifications/gotify.yaml

Dedans, nous placerons ce contenu :
YAML:
type: http          # Don't change
name: gotify  # Must match the registered plugin in the profile

# One of "trace", "debug", "info", "warn", "error", "off"
log_level: trace

# group_wait:         # Time to wait collecting alerts before relaying a message to this plugin, eg "30s"
# group_threshold:    # Amount of alerts that triggers a message before <group_wait> has expired, eg "10"
# max_retry:          # Number of attempts to relay messages to plugins in case of error
# timeout:            # Time to wait for response from the plugin before considering the attempt a failure, eg "10s"

#-------------------------
# plugin-specific options

# The following template receives a list of models.Alert objects
# The output goes in the http request body

format: |
  {{ range . -}}
  {{ $alert := . -}}
  {
    "extras": {
      "client::display": {
      "contentType": "text/markdown"
    }
  },
  "priority": 3,
  {{range .Decisions -}}
  "title": "{{.Type }} {{ .Value }} for {{.Duration}}",
  "message": "{{.Scenario}}  \n\n[crowdsesc cti](https://app.crowdsec.net/cti/{{.Value -}})  \n\n[shodan](https://shodan.io/host/{{.Value -}})"
  {{end -}}
  }
  {{ end -}}

# The plugin will make requests to this url, eg:  https://www.example.com/
url: https://gotify.ndd/message?token=<MON_TOKEN>

# Any of the http verbs: "POST", "GET", "PUT"...
method: POST

headers:
   Content-Type: application/json
#   Authorization: token 0x64312313

# skip_tls_verification:  # true or false. Default is false

Dans ce fichier gotify.yaml, vous allez devois personnaliser une ligne : url: https://gotify.ndd/message?token=<MON_TOKEN>
- https://gotify.ndd est a remplacer par l'url de votre instance gotify
- <MON_TOKEN> est a remplacer pour le token que vous aurez généré dans l'onglet APPS de Gotify

Enregistrer le fichier, et quitter ( Ctrl + X )

Maintenant, nous allons activer les notifications, pour cela on modifie le fichier profiles.yaml présent dans le dossier de configuration de CrowdSec.

nano crowdsec/crowdsec-config/profiles.yaml
Le fichier d'origine doit être similaire a cela :

YAML:
name: default_ip_remediation
#debug: true
filters:
 - Alert.Remediation == true && Alert.GetScope() == "Ip"
decisions:
 - type: ban
   duration: 4h
#notifications:
#   - slack_default  # Set the webhook in /etc/crowdsec/notifications/slack.yaml before enabling this.
#   - splunk_default # Set the splunk url and token in /etc/crowdsec/notifications/splunk.yaml before enabling this.
#   - http_default   # Set the required http parameters in /etc/crowdsec/notifications/http.yaml before enabling this.
#   - email_default  # Set the required email parameters in /etc/crowdsec/notifications/email.yaml before enabling this.
on_success: break

Nous allons décommenter notifications: et rajouter - gotify sur la ligne d'apres, comme cela :
YAML:
name: default_ip_remediation
#debug: true
filters:
 - Alert.Remediation == true && Alert.GetScope() == "Ip"
decisions:
 - type: ban
   duration: 4h
notifications:
 - gotify
#   - slack_default  # Set the webhook in /etc/crowdsec/notifications/slack.yaml before enabling this.
#   - splunk_default # Set the splunk url and token in /etc/crowdsec/notifications/splunk.yaml before enabling this.
#   - http_default   # Set the required http parameters in /etc/crowdsec/notifications/http.yaml before enabling this.
#   - email_default  # Set the required email parameters in /etc/crowdsec/notifications/email.yaml before enabling this.
on_success: break

On enregistre les modifications ( Ctrl + X ).

Puis on redémarre le conteneur CrowdSec pour que les modifications soit prisent en charge : docker restart crowdsec


Le résultat sur Gotify :
1664485946932.png

❤ Merci à bobcat, Sirius et Loz sur le Discord CrowdSec pour leur aide.

b/ Être notifié via Discord
Linuxserver à fait un tutoriel la dessus à cette adresse : https://www.linuxserver.io/blog/blocking-malicious-connections-with-crowdsec-and-swag.


2024-02-01 - Mise à jour du chemin pour récupérer le Dockerfile du Dashboard
2023-03-26 - Rajout de précision
2022-09-29 - Rajout de la section "Notifications" avec l'explication pour mettre en place les notifications des bannissements sur Gotify
2022-06-26 - Rajout de la partie "Rajout d'un Tableau de Bord - Dashboard"
 
Dernière édition par un modérateur:
  • J'aime
Réactions: MilesTEG
Bonsoir,
j''obtiens une l'erreur suivante dans le log crowdsec :
nginx: [error] [lua] crowdsec.lua:46: init(): error loading recaptcha plugin: no recaptcha site key provided, can't use recaptcha

Je ne vois pas ce que c'est, avez-vous une idée ?

Autre chose... A quoi correspond la ligne
CROWDSEC_LAPI_URL=http://crowdsec:8080, faut-il modifier le port au cas où il serait déjà utilisé ?
 
Je ne vois pas ce que c'est, avez-vous une idée ?
Dans mon tuto il n'y a pas de configuration de recaptcha, ce message est donc normal. En cas d'ip malveillante qui visite vos/votre sites, celle ci sera bloqué directement. Dans le cas ou recaptcha est configurer, le visiteur a l'ip malveillante sera obliger de remplir un captcha pour visiter votre site ( il n'est donc pas complétement refusé d'acces )

Plus d'info : https://github.com/linuxserver/docker-mods/tree/swag-crowdsec#recaptcha-support-notes
 
Dans mon tuto il n'y a pas de configuration de recaptcha, ce message est donc normal. En cas d'ip malveillante qui visite vos/votre sites, celle ci sera bloqué directement. Dans le cas ou recaptcha est configurer, le visiteur a l'ip malveillante sera obliger de remplir un captcha pour visiter votre site ( il n'est donc pas complétement refusé d'acces )

Plus d'info : https://github.com/linuxserver/docker-mods/tree/swag-crowdsec#recaptcha-support-notes

Ok merci pour l'info je vais regarder tout ça. et à quoi sert la ligne CROWDSEC_LAPI_URL=http://crowdsec:8080, faut-il modifier le port au cas où il serait déjà utilisé ?
 
et à quoi sert la ligne CROWDSEC_LAPI_URL=http://crowdsec:8080,
Elle sert a contacter le conteneur crowdsec via son API local

http => Par le protocole HTTP
crowdsec +> nom du conteneur ( doit etre sous le meme reseau docker pour etre joignable via son nom, sinon il faut utiliser son IP )
8080 => Ip de l'API de crowdsec

Peut etre modifier bien sur, mais devra etre modifié ici mais aussi dans la configuration du conteneur Crowdsec. De plus si SWAG et Crowdsec sont sous le meme reseau bridge, aucune raison de modifier le port.
 
Ok merci, il ne me reste plus qu'a vérifier si cela fonctionne.
j'ai testé la commande :
docker exec -t crowdsec cscli decisions list mais cela me renvoi
No active decisions
 
Si ton installation est récente, il faut attendre 2h pour que le "cron" s'active et recupere les ip de la communauté
 
Ok. Effectivement je viens de le mettre en place. En tout cas les tutos sont super, merci !
 
  • J'adore
Réactions: EVO
Bonjour,

Savez-vous s’il est possible d’être notifié des blocages (sur discord, gotify. Telegram…) ?
 
Bonjour,

juste pour dire merci, tout fonctionne très bie y compris les notification sur Discord. Maintenant je vais regarder s'il est possible d'intégrer crowdsec sur un routeur.
 
  • J'aime
Réactions: EVO
Yop @EVOTk ça va depuis le temps ? :)

J'ai découvert ce logiciel il y a quelques heures, le temps de ça en place et je me rends compte après coup que tu avais fait un tutoriel. :p
Question : la dashboard on est obligé de la build ? est-ce que je vais devoir retélécharger le fichier ? il n'y a pas d'image publique visiblement que je pourrais insérer dans mon docker compose.

Si tu peux m'éclairer à ce sujet, je n'ai encore jamais pratiqué le build d'image.
 
Yop @EVOTk ça va depuis le temps ? :)
Ca va merci, et toi ? :)

Question : la dashboard on est obligé de la build ?
Oui, il n'y a pas ( encore ? ) d'image docker.

est-ce que je vais devoir retélécharger le fichier ?
Je n'ai pas compris, tu parle du Dockerfile pour build l'image ? Une fois DL tu le garde, c'est lui qui inclu les commandes de construction de l'image, sauf modification majeure, il ne change pas.
 
Ca va tranquille !
En fait, vu que je me sers de la fonction Git Repository de Portainer, j'aurais aimé ne pas être lié à une machine en particulier, et que l'image soit disponible sur le net. Du coup ce que je vais faire c'est que je vais pousser l'image sur un dépôt GitHub privé, ça règlera le souci. :)
 
  • J'aime
Réactions: EVO