Login Logout

Howto Logcheck

Logcheck est un script Bash qui permet d’envoyer par email les termes inconnus dans des logs. Il est lancé toutes les heures et surveille par défaut /var/log/syslog et /var/log/auth.log. C’est un complément idéal de Log2mail car il va détecter de nouveaux termes dans les logs, que l’on considèrera comme normaux (on les ajoutera alors à la liste des termes connus) ou anormaux (que l’on ajoutera à Log2mail pour avoir une alerte immédiate).

Installation

# apt install logcheck logcheck-database

Configuration

Fichiers de configuration :

/etc/logcheck/
├── logcheck.conf
├── logcheck.logfiles
├── header.txt
├── cracking.d/
│   ├── kernel
│   ├── [...]
│   └── uucico
├── cracking.ignore.d/
├── ignore.d.paranoid/
│   ├── bind
│   ├── [...]
│   └── xinetd
├── ignore.d.workstation
│   ├── automount
│   ├── [...]
│   └── xlockmore
├── logcheck.logfiles.d/
├── violations.d/
│   ├── kernel
│   ├── [...]
│   └── sudo
└── violations.ignore.d
    ├── logcheck-su
    └── logcheck-sudo

Le fichier de configuration principal est /etc/logcheck/logcheck.conf où l’on précisera notamment l’option REPORTLEVEL pour choisir quel jeu d’exceptions l’on veut utiliser et SENDMAILTO pour la destination de l’email :

REPORTLEVEL="server"
SENDMAILTO="monitoring@example.com"
MAILASATTACH=0
FQDN=1
TMP="/tmp"

La liste des fichiers de journaux à surveiller se trouve dans le fichier /etc/logcheck/logcheck.logfiles :

/var/log/syslog
/var/log/auth.log
/var/log/user.log

Utilisation

Par défaut Logcheck s’exécute toutes les heures et à chaque reboot comme indiqué dans le fichier /etc/cron.d/logcheck. On est parfois surpris par la quantité de lignes reçues. Pourtant, le but est bien de ne rien recevoir sauf exception ! Pour cela, il est important de passer par une « phase de test » où l’on ajoutera des règles d’exception pour prendre en compte les particularités de son système.

Si vous utilisez le REPORTLEVEL="server" vous ajouterez des expressions régulières dans un fichier situé dans le répertoire /etc/logcheck/ignore.d.server/. Voici par exemple, quelques règles que l’on a pu ajouter pour diverses raisons :

^\w{3} [ :0-9]{11} [._[:alnum:]-]+ kernel: \[IPTABLES DROP\] : IN=eth0 OUT= MAC=.*
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ log2mail\[[0-9]+\]: Logfile [.[:alnum:]/]+ rotated. Listening to new file.$
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ nrpe\[[0-9]+\]: Could not read request from client, bailing out...$
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ nrpe\[[0-9]+\]: INFO: SSL Socket Shutdown.$
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ ntpd\[[0-9]+\]: clock is now [[:alnum:]]+$
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ suhosin\[[0-9]+\]: ALERT - Include filename \([^)]+\) is an URL that is not allowed \(attacker.+$
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ suhosin\[[0-9]+\]: ALERT - tried to register forbidden variable '_REQUEST' through POST variables \(attacker.+$
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ suhosin\[[0-9]+\]: ALERT - tried to register forbidden variable '_GET' through POST variables \(attacker.+$
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ suhosin\[[0-9]+\]: ALERT - tried to register forbidden variable '_SERVER\[\w+\]' through POST variables \(attacker.+$
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ suhosin\[[0-9]+\]: ALERT - ASCII-NUL chars not allowed within request variables.+$
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ proftpd\[[0-9]+\]: [._[:alnum:]-]+ - ProFTPD killed \(signal 15\)$
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ proftpd\[[0-9]+\]: [._[:alnum:]-]+ - ProFTPD 1.3.1 standalone mode SHUTDOWN$
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ proftpd\[[0-9]+\]: [._[:alnum:]-]+ - ProFTPD 1.3.1 \(stable\) \(built Tue Oct 27 10:09:08 UTC 2009\) standalone mode STARTUP$
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ rsyncd\[[0-9]+\]: connect from [._[:alnum:]-]+ \([.[0-9]]+\)$
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ rsyncd\[[0-9]+\]: rsync allowed access on module [a-z]+ from [._[:alnum:]-]+ \([.[0-9]]+\)$
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ rsyslogd: -- MARK --$
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ rsyslogd: \[origin software="rsyslogd" swVersion="3.18.6" x-pid="[0-9]+" x-info="<http://www.rsyslog.com"\>] restart$
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ sshd\[[0-9]+\]: Received disconnect from [.[0-9]]+: 11:.*$

Pour tester une expression régulière que l’on écrit, on utilisera egrep ainsi :

$ sed -e 's/[[:space:]]*$//' /var/log/syslog | egrep 'MON-EXPRESSION-REGULIERE'

On peut aussi faire tout simplement :

$ echo "Oct  8 23:59:33 foo sshd[24123]: Received disconnect from 192.0.2.51: 11: disconnected by user" | egrep 'MA-SUPER-EXPRESSION-REGULIERE'

FAQ

Comment apprendre les expressions régulières pour écrire de nouvelles règles ?

Le plus simple est de repartir des règles existantes, et de s’aider de la nombreuse documentation existante comme le site http://rubular.com/.

Je ne reçois pas certains emails envoyés par Logcheck ?

Quand beaucoup de logs anormaux sont générés, il est possible que l’email envoyé dépasse la taille autorisé par votre MTA (sous Postfix, c’est 10 Mo par défaut).