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
(ainsi
que journald depuis Debian 12). 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.d
│ ├── journal.logfiles
│ ├── [...]
│ └── syslog.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:.*$
Le programme logcheck-test permet de facilement tester une règle ou un fichier de règles.
$ logcheck-test -r /etc/logcheck/ignore.d.server/foo -l /var/log/syslog
Pour tester une expression régulière que l’on écrit, on utilisera
grep -E
ainsi :
$ sed -e 's/[[:space:]]*$//' /var/log/syslog | grep -E '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" | grep -E 'MA-SUPER-EXPRESSION-REGULIERE'
On peut tester l’exécution de logcheck avec toutes les règles et afficher en sortie standard dans le terminal :
# sudo -u logcheck /usr/sbin/logcheck -o
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).
Dans ce cas, si on ne peut pas réduire la taille des logs envoyés (en corrigeant l’applicatif responsable), on peut réduire la taille en compressant les logs en pièce jointe :
# Send the results as attachment or not.
# 0=not as attachment; 1=as attachment; 2=as gzip attachment
# Default is 0
MAILASATTACH=2