Crowdsec : Centralisation des logs avec Rsyslog

Crowdsec Cybersécurité Open source

Dans ce nouveau billet, nous allons voir comment centraliser les logs avec Rsyslog afin de les faire parser par un seul agent Crowdsec. Seul les bouncers tourneront sur les machines à protéger. Nous verrons aussi comment configurer Crowdsec afin de lui passer les chemins personnalisés vers les fichiers de logs.

Serveur Crowdsec Local API :

  • OS : Debian 10
  • RAM : 2048
  • IP : 192.168.1.202/255.255.255.0
  • Nom d'hôte : srv-cs-lapi
  • Domaine de portée locale : lab.lan
  • FQDN : srv-cs-lapi.lab.lan

Serveur Nginx :

  • OS : Debian 10
  • RAM : 2048
  • IP : 192.168.1.203/255.255.255.0
  • Nom d'hôte : srv-nginx-01
  • Domaine de portée locale : lab.lan
  • FQDN : srv-nginx-01.lab.lan
  • Service installé : nginx

Serveur Syslog :

  • OS : Debian 10
  • RAM : 1024
  • IP : 192.168.1.205/255.255.255.0
  • Nom d'hôte : srv-rsyslog
  • Domaine de portée locale : lab.lan
  • FQDN : srv-rsyslog.lab.lan

Vm malveillante (en charge de simuler des attaques) : Serveur Nginx :

  • OS : Debian 10
  • Bureau : Gnome
  • RAM : 2048
  • IP : dhcp
  • Nom d'hôte : bad-vm

maquette04

Déclaration des hôtes dans /etc/hosts

vim /etc/hosts
127.0.0.1   localhost
127.0.1.1   srv-rsyslog.lab.lan srv-rsyslog
192.168.1.202   srv-cs-lapi.lab.lan
192.168.1.203   srv-nginx-01.lab.lan

Créez le fichier /etc/rsyslog.d/from_remote_tcp.conf, puis mettez-y ceci :

# MODULE TCP
module(load="imtcp")

# TEMPLATE
template(name="DynFile" type="string" string="/var/log/remote/%FROMHOST%/%PROGRAMNAME%.log")

# REGLE
ruleset(name="RemoteMachineTcp"){
action(type="omfile" dynaFile="DynFile")
}

# CONFIGURATION DU PORT ET DE LA REGLE
input(type="imtcp" port="514" ruleset="RemoteMachineTcp")

Relancez le service rsyslog.

Modifiez le fichier /etc/hosts afin d'y déclarer le serveur Rsyslog :

root@srv-nginx-01:~# vim /etc/hosts
127.0.0.1   localhost
127.0.1.1   srv-nginx-01.lab.lan    srv-nginx-01
192.168.1.202   srv-cs-lapi.lab.lan
192.168.1.205   rsyslog.lab.lan

Editez le fichier /etc/rsyslog.conf et placez à la fin de la section MODULES, la ligne suivante : module(load="imfile" PollingInterval="10")

Créez le fichier /etc/rsyslog.d/nginx-default-vhost.conf, puis mettez-y ceci :

## log access
input(type="imfile"
      file="/var/log/nginx/access.log"
      tag="default-vhost-access")

if $syslogtag == 'default-vhost-access' then {
   action(type="omfwd" Target="rsyslog.lab.lan" Port="514" Protocol="tcp")
   stop
}

## log error
input(type="imfile"
      file="/var/log/nginx/error.log"
      tag="default-vhost-error")

if $syslogtag == 'default-vhost-error' then {
   action(type="omfwd" Target="rsyslog.lab.lan" Port="514" Protocol="tcp")
   stop
}

Relancez le service rsyslog suivi du service Nginx puis depuis le serveur Nginx : curl http://192.168.1.203

Sur le serveur Rsyslog :

root@srv-rsyslog:~# tree /var/log/remote/srv-nginx-01.lab.lan/
/var/log/remote/srv-nginx-01.lab.lan/
├── default-vhost-access.log
└── default-vhost-error.log

N'ayant pas eu d'erreur sur Nginx, j'ai créé manuellement le fichier "default-vhost-error.log".

Faites de requêtes sur le serveur web et vérifier les logs sur le serveur Rsyslog.

Depuis le serveur CS LAPI, on exporte le certificat de notre autorité de certification : scp /root/pki/CA/ca.crt root@192.168.1.205:/usr/local/share/ca-certificates/

Sur le serveur Rsyslog :

# Mise à  jour des autorités de certifications
update-ca-certificates

# Installation de crowdsec
apt install -y gnupg lsb-release apt-transport-https curl 
curl -L https://packagecloud.io/crowdsec/crowdsec/gpgkey | apt-key add -
echo "deb https://packagecloud.io/crowdsec/crowdsec/debian/ $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/crowdsec.list > /dev/null
apt update
apt-get install crowdsec
systemctl enable crowdsec

# On enregistre notre machine auprès du serveur CS LAPI :
cscli lapi register -u https://srv-cs-lapi.lab.lan:8080

# On désactive l'API Locale
vim /lib/systemd/system/crowdsec.service :
# Remplacer la ligne 
ExecStart=/usr/bin/crowdsec -c /etc/crowdsec/config.yaml
# par la ligne suivante :
ExecStart=/usr/bin/crowdsec -c /etc/crowdsec/config.yaml -no-api
# On notifie à Systemd la mise à jour du fichier unité
systemctl daemon-reload

Ne redémarrez pas de suite le service.

Sur le serveur CS LAPI, validez la machine :

root@srv-cs-lapi:~# cscli machines list
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 NAME                                              IP ADDRESS     LAST UPDATE                STATUS  VERSION                                                                
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 4f02c64d68fc456c8846281b0418c580bRfsqacxgzv9adtp  127.0.0.1      2021-07-15T12:07:57+02:00  ✔️       v1.1.1-debian-pragmatic-linux-73e0bbaf93070f4a640eb5a22212b5dcf26699de 
 530ec09a5c4544abaf9425d2fc657f32lfjaejYSbi45K3cO  192.168.1.203  2021-07-15T12:08:01+02:00  ✔️       v1.1.1-debian-pragmatic-linux-73e0bbaf93070f4a640eb5a22212b5dcf26699de 
 425c2992f9664dcd8c54d9de30b12b4eUEqsCN10fSUrKPpg  192.168.1.205  2021-07-15T13:20:28+02:00  🚫    

root@srv-cs-lapi:~# cscli machines validate  425c2992f9664dcd8c54d9de30b12b4eUEqsCN10fSUrKPpg

root@srv-cs-lapi:~# cscli machines list
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 NAME                                              IP ADDRESS     LAST UPDATE                STATUS  VERSION                                                                
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 4f02c64d68fc456c8846281b0418c580bRfsqacxgzv9adtp  127.0.0.1      2021-07-15T12:07:57+02:00  ✔️       v1.1.1-debian-pragmatic-linux-73e0bbaf93070f4a640eb5a22212b5dcf26699de 
 530ec09a5c4544abaf9425d2fc657f32lfjaejYSbi45K3cO  192.168.1.203  2021-07-15T12:08:01+02:00  ✔️       v1.1.1-debian-pragmatic-linux-73e0bbaf93070f4a640eb5a22212b5dcf26699de 
 425c2992f9664dcd8c54d9de30b12b4eUEqsCN10fSUrKPpg  192.168.1.205  2021-07-15T13:20:28+02:00  ✔️   
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Sur le serveur Rsyslog, relancez Crowdsec : systemctl restart crowdsec.service

Afin de parser les logs reçus depuis Nginx, nous allons installer la collection Nginx et configurer le chemin vers les logs.

Sur le serveur Rsyslog :

# Installation de la collection Nginx :
cscli collections install crowdsecurity/nginx

# Configuration pour l'acquisition des logs par Crowdsec :
vim /etc/crowdsec/acquis.yaml :

#Generated acquisition file - wizard.sh (service: sshd) / files : /var/log/auth.log
filenames:
  - /var/log/auth.log
labels:
  type: syslog
---
#Generated acquisition file - wizard.sh (service: linux) / files : /var/log/installer/syslog /var/log/syslog /var/log/kern.log /var/log/messages
filenames:
  - /var/log/installer/syslog
  - /var/log/syslog
  - /var/log/kern.log
  - /var/log/messages
labels:
  type: syslog
---
# Ajout manuel
filenames:
  - /var/log/remote/srv-nginx-01.lab.lan/default-vhost-access.log
  - /var/log/remote/srv-nginx-01.lab.lan/default-vhost-error.log
labels:
  type: nginx
---

Sur le serveur Nginx : afin de valider la démonstration, nous allons désinstaller Crowdsec agent sur ce serveur.

systemctl stop crowdsec
apt remove crowdsec

Sur le serveur CS LAPI : on supprime la machine Nginx.

root@srv-cs-lapi:~# cscli machines list
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 NAME                                              IP ADDRESS     LAST UPDATE                STATUS  VERSION                                                                
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 4f02c64d68fc456c8846281b0418c580bRfsqacxgzv9adtp  127.0.0.1      2021-07-15T12:07:57+02:00  ✔️       v1.1.1-debian-pragmatic-linux-73e0bbaf93070f4a640eb5a22212b5dcf26699de 
 530ec09a5c4544abaf9425d2fc657f32lfjaejYSbi45K3cO  192.168.1.203  2021-07-15T12:08:01+02:00  ✔️       v1.1.1-debian-pragmatic-linux-73e0bbaf93070f4a640eb5a22212b5dcf26699de 
 425c2992f9664dcd8c54d9de30b12b4eUEqsCN10fSUrKPpg  192.168.1.205  2021-07-15T13:20:28+02:00  ✔️       v1.1.1-debian-pragmatic-linux-73e0bbaf93070f4a640eb5a22212b5dcf26699de 
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

root@srv-cs-lapi:~# cscli machines delete 530ec09a5c4544abaf9425d2fc657f32lfjaejYSbi45K3cO
INFO[15-07-2021 02:57:34 PM] machine '530ec09a5c4544abaf9425d2fc657f32lfjaejYSbi45K3cO' deleted successfully 

root@srv-cs-lapi:~# cscli machines list
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 NAME                                              IP ADDRESS     LAST UPDATE                STATUS  VERSION                                                                
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 4f02c64d68fc456c8846281b0418c580bRfsqacxgzv9adtp  127.0.0.1      2021-07-15T12:07:57+02:00  ✔️       v1.1.1-debian-pragmatic-linux-73e0bbaf93070f4a640eb5a22212b5dcf26699de 
 425c2992f9664dcd8c54d9de30b12b4eUEqsCN10fSUrKPpg  192.168.1.205  2021-07-15T13:20:28+02:00  ✔️       v1.1.1-debian-pragmatic-linux-73e0bbaf93070f4a640eb5a22212b5dcf26699de 
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

À partir de maintenant, seuls les logs issues de notre serveur Rsyslog seront analysés.

Sur le serveur Rsyslog, pensez à "whitelister" les IP des serveurs et commenter la plage "192.168.0.0/16" (rappel : https://blog.raspot.in/fr/blog/crowdsec-ajout-et-configuration-dun-bouncer#configuration-de-la-whitelist)

Depuis la VM attaquante : nikto -host 192.168.1.203

Ce qui donne : Peek%2015-07-2021%2015-09

Article précédent Article suivant