Wazuh x CrowdSec

modifié le : 7 octobre 2024,
par Killian Prin-abeil
 

Introduction

Découvrez aujourd'hui l'intégration de CrowdSec à Wazuh. Cet article sera une mise à jour de la vidéo de présentation disponible ici

Depuis la dernière fois, il y a eu des améliorations. Nous ne sommes plus obligés d'utiliser Suricata comme intermédiaire entre Wazuh et CrowdSec. Nous pouvons maintenant intégrer une notification dans CrowdSec afin que Wazuh puisse afficher directement les alertes de CrowdSec dans son tableau de bord. Cela rend l'intégration plus intéressante, et l'on peut utiliser CrowdSec comme on le souhaite, à l'inverse de lorsque nous utilisions Suricata comme intermédiaire.

Configuration

Pré-requis

Pour obtenir un composant AppSec opérationnel, vous aurez besoin de :

  • Crowdsec >= v1.6.3
  • Wazuh >= v4.9.0

Configuration CrowdSec

Commençons tout d'abord par créer le fichier file.yaml, un fichier qui contiendra la notification permettant l'envoi des alertes CrowdSec dans le fichier temporaire crowdsec_alerts.json. Le choix d'un fichier JSON permet une meilleure interprétation de la part de Wazuh, ce qui évite d'avoir à créer un décodeur.

/etc/crowdsec/notifications/file.yaml

# Ne pas changer
type: file

name: file_default # Nom du plugin à enregistrer dans le profiles.yaml
log_level: info

# Ce modèle rend tous les événements sous forme de ndjson
format: |
  {{range . -}}
   { "crowdsec": { "time": "", "program": "crowdsec", "alert": {{. | toJson }} }}
  {{ end -}}

# group_wait:
# group_threshold:

log_path: "/tmp/crowdsec_alerts.json" # or %TEMP%\crowdsec_alerts.json
rotate:
  enabled: true 
  max_size: 500 # in MB
  max_files: 5
  max_age: 5
  compress: true

Il ne reste plus qu'à ajouter le plugin dans le fichier profiles.yaml, puis à relancer la configuration de CrowdSec.

/etc/crowdsec/profiles.yaml

name: default_ip_remediation
#debug: true
filters:
 - Alert.Remediation == true && Alert.GetScope() == "Ip"
decisions:
 - type: ban
   duration: 4h
#duration_expr: Sprintf('%dh', (GetDecisionsCount(Alert.GetValue()) + 1) * 4)
notifications:
    - file_default
#   - 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
sudo systemctl reload crowdsec

La partie CrowdSec étant finie, il ne reste plus qu'à configurer Wazuh.

Configuration Wazuh

Il est préférable d'utiliser une gestion centralisée plutôt qu'une configuration locale. La création d'un groupe dans Wazuh est donc nécessaire, et le nom sera crowdsec. Ensuite, il faut éditer la configuration du groupe afin de pouvoir lire le fichier /tmp/crowdsec_alerts.json sur nos clients.

/var/ossec/etc/shared/Crowdsec/agent.conf

<agent_config>
    <localfile>
        <location>/tmp/crowdsec_alerts.json</location>
        <log_format>json</log_format>
        <only-future-events>no</only-future-events>
    </localfile>
</agent_config>

Ensuite, il faut créer un fichier de règles afin de pouvoir déclencher des alertes Wazuh. Dans le cas contraire, les alertes CrowdSec seront donc inutiles. Deux règles vont être créées : une pour des alertes de niveau 12 et une autre pour des alertes de test.

/var/ossec/etc/rules/crowdsec-rules.xml

<group name="crowdsec,">
    <!-- Nous considérerons que toutes les alertes CrowdSec sont importantes. -->
    <rule id="100002" level="12">
        <decoded_as>json</decoded_as>
        <field name="crowdsec.program">crowdsec</field>
        <description>CrowdSec alert: $(crowdsec.alert.message)</description>
    </rule>

    <rule id="100003" level="3">
        <if_sid>100002</if_sid>
        <field name="crowdsec.alert.message">test alert</field>
        <description>Test alert for CrowdSec.</description>
    </rule>
</group>

La configuration est maintenant finie. Il ne reste plus qu'à tester. Nous pouvons commencer par tester la règle de niveau 3, qui correspond à la règle de test. On peut donc utiliser la commande suivante directement sur la machine cliente : cscli notifications test file_default.

Nous pouvons constater que la règle de test se déclenche bien, avec notamment les différentes informations de data.crowdsec.alert.

Nous pouvons maintenant essayer la règle de niveau 12. Nous avons essayé cela sur notre serveur Proxmox, mais cela fonctionne avec tout type de serveur et d'alertes CrowdSec.

L'alerte CrowdSec fulljackz/proxmox-bf remonte bien dans Wazuh, et donc la règle de niveau 12 est déclenchée.

Pour finir

L'intégration est simple et très efficace. Cela renforce une gestion centralisée des alertes, qu'elles soient de Wazuh ou de CrowdSec. Chez Aukfood, nous tirons parti de ces deux solutions afin d'améliorer et de rendre plus efficaces la détection et la prévention des cyberattaques.