Table des matières
Logcheck
Pour surveiller les différents serveurs j'utilise Logcheck qui est un très bon logiciel : “apt-get install logcheck” si vous ne l'avez pas encore. La configuration de base est triviale et ne sera pas détaillée ici : il faut juste mettre l'adresse mail vers laquelle seront envoyé les extraites de log.
La ou bât blesse c'est qu'il arrive que certaines règles ne suffisent pas (ou les logs générés par les différents services changent de format).
Deja comment tester une regle
Pour tester une règle qui est une regexp on peut utiliser la commande grep, comme par exemple avec une règle pour postfix (donc sur le fichier /var/log/mail.log) : les lignes affichées ici seront ignorées par logcheck :
egrep "^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ postfix/smtpd\[[[:digit:]]+\]: (dis)?connect from [^[:space:]]+$" /var/log/syslog
Un autre moyen est de lancer un dryrun de logcheck sur un fichier particulier (ici /var/log/syslog), pour se faire :
su logcheck -s /bin/bash -c "/usr/sbin/logcheck -l /var/log/syslog -o -t"
Ajouter des regles
Pour ajouter des regles (en fonction du role défini, mais par défaut “server”), cela se passe dans le fichier “/etc/logcheck/ignore.d.server/$SERVICE” en remplaçant $SERVICE par le nom du service
Le conseil du chef est de ne pas modifier les règles existantes mais d'ajouter les vôtres à un endroit simple pour gérer les futures mises a jour, par exemple … la fin du fichier
Voici donc quelques règles que j'utilise en plus de celles par défaut :
snmpd
pour gérer correctement l'ipv6 : ajouter dans le fichier /etc/logcheck/ignore.d.server/snmpd :
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ snmpd\[[0-9]+\]: Connection from UDP(/IPv6): \[[.:[:xdigit:]]+\]:[0-9]{4,5}(->\[[.:[:xdigit:]]+\])?$
pour matcher les règles similaires à :
Oct 21 09:05:02 cerbere snmpd[11878]: Connection from UDP/IPv6: [2607:f0d0:1002:51::4]:59407
bind
pour gérer correctement certains messages : ajouter dans le fichier /etc/logcheck/ignore.d.server/bind :
^\w{3} [ :0-9]{11} [._[:alnum:]-]+ named\[[0-9]+\]: (general: )?(info: )?received control channel command 'stats'$ ^\w{3} [ :0-9]{11} [._[:alnum:]-]+ named\[[0-9]+\]: (general: )?(info: )?dumpstats complete$
openvpn
pour gérer correctement certains messages : ajouter dans le fichier /etc/logcheck/ignore.d.server/openvpn :
- CRL CHECK :
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ (openvpn|ovpn-[._[:alnum:]-]+)\[[[:digit:]]+\]:( ([-_.@[:alnum:]]+/)?[.[:digit:]]{7,15}:[[:digit:]]{2,5})? CRL CHECK OK:.*$
- ajout de [AF_INET] devant les IP :
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ (openvpn|ovpn-[._[:alnum:]-]+)\[[[:digit:]]+\]:(( ([-_.@[:alnum:]]+/)?[.[:digit:]]{7,15}:[[:digit:]]{2,5})?( \[[-._[:alnum:]]+\])?)? Peer Connection Initiated with (\[AF_INET\])?[[:digit:].]{7,15}:[[:digit:]]+$ ^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ (openvpn|ovpn-[._[:alnum:]-]+)\[[[:digit:]]+\]:( ([-_.@[:alnum:]]+/)?[.[:digit:]]{7,15}:[[:digit:]]{2,5})? TLS: Initial packet from (\[AF_INET\])?[.[:digit:]]{7,15}:[[:digit:]]+, sid=[[:xdigit:]]{8} [[:xdigit:]]{8}$
- VERIFY OK debian jessie :
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ (openvpn|ovpn-[._[:alnum:]-]+)\[[[:digit:]]+\]:( ([-_.@[:alnum:]]+/)?[.[:digit:]]{7,15}:[[:digit:]]{2,5})? VERIFY (SCRIPT )?OK: depth=[[:digit:]]+, (/|C=)[-:_./=@[:alnum:], ]+$
amavisd-new
pour gérer correctement certains messages : ajouter dans le fichier /etc/logcheck/ignore.d.server/amavisd-new :
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ amavis\[[[:digit:]]+\]: \([-[:digit:]]+\) Passed (CLEAN|SPAM(MY)?)( {RelayedInbound})?,( LOCAL)?( \[(IPv6:)?[[:xdigit:].:]{3,39}\](:[[:xdigit:]]{0,5})?){0,2} <[^>]*> -> <[^>]*>(,<[^>]*>)*,( quarantine: ([[:alnum:]]/)?spam-[-+[:alnum:]]+(\.gz)?,)?( Queue-ID: [[:xdigit:]]*,)?( Message-ID: <[^>]+>( \((added by[^)]+|sfid-[_[:xdigit:]]+)\))?,)?( Resent-Message-ID: <[^>]+>,)? mail_id: [-+_[:alnum:]]+, Hits: (-?[.[:digit:]]*)+, size: [[:xdigit:]]+, queued_as: [[:xdigit:]]+( OK id=[-[:alnum:]]+)?, [[:digit:]]+ ms$
pour gérer les messages type
Oct 16 22:51:57 mailserver amavis[32039]: (32039-11) Passed CLEAN {RelayedInbound}, [10.0.0.1]:39213 [10.0.0.1] <root@domain.com> -> <root@domain.com>, Queue-ID: 8589710013F, Message-ID: <20141016205157.1B85842A6@mailserver.domain.com>, mail_id: DpzmaAs5yyiC,Hits: 4.799, size: 786, queued_as: B5161100158, 140 ms
ou “[ADRESSE_IP]:PORT [ADRESSE_IP]” ne sont pas filtrés par défaut. De plus il peut y avoir des “_” dans le champs mail_id ajoutés dans cette règle.
burp-backup
Pour BURP, un super logiciel de backup qui supporte aussi (tres bien) les clients windows en plus des linux, ici installé sur une debian jessie :
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ burp\[[[:digit:]]+\]: auth ok for: [[:alnum:]]+$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ burp\[[[:digit:]]+\]: Client [[:alnum:]]+ does not want a certificate signed$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ burp\[[[:digit:]]+\]: Client uses TLSv1/SSLv3 (-|[[:alnum:]])+$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ burp\[[[:digit:]]+\]: Client supports being sent counters.$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ burp\[[[:digit:]]+\]: in do_backup_server$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ burp\[[[:digit:]]+\]: Do a backup of [[:alnum:]]+ now.$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ burp\[[[:digit:]]+\]: Running backup of [[:alnum:]]+$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ burp\[[[:digit:]]+\]: Running timer script: [[:alnum:]]+ .*$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ burp\[[[:digit:]]+\]: (Out of|In) timeband: .*$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ burp\[[[:digit:]]+\]: (Last backup|Next after ): ([[:digit:]]|-)+ ([[:digit:]]|:)+( \(interval [[:digit:]]+h\))?$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ burp\[[[:digit:]]+\]: (Not yet time for a backup of|Not running backup of) [[:alnum:]]+$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ burp\[[[:digit:]]+\]: (/etc/burp/timer_script returned: (0|1)|exit child)$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ burp\[[[:digit:]]+\]: forked( status server)? child pid [[:digit:]]+$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ burp\[[[:digit:]]+\]: deleting [[:alnum:]]+ backup [[:digit:]]+$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ burp\[[[:digit:]]+\]: exit(ing| status server)$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ burp\[[[:digit:]]+\]: (Logging to|Compressing) /[[:alnum:]/]+([[:digit:][:space:]:-]+)?/log( to /[[:alnum:]/]+log.gz...)?$
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ burp\[[[:digit:]]+\]: [[:digit:]-]+ [[:digit:]:]+ < [[:digit:]-]+ [[:digit:]:]+.$
Si comme moi vous utilisez des log custom
postfix
J'utilise des logs custom dans postfix car cela permet de tracer plus simplement les connexions d'ou proviennent les mails, et parce que c'est simple de le faire : voici un extrait de mon /etc/postfixmaster.cf :
....
submission inet n - - - - smtpd
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
-o milter_macro_daemon_name=ORIGINATING
-o syslog_name=postfix/submission
smtps inet n - - - - smtpd
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
-o milter_macro_daemon_name=ORIGINATING
-o syslog_name=postfix/smtps
....
ou on peut voir que syslog_name ont été changé de leur valeur par defaut “postfix” pour devenir “postfix/submission” ou “postfix/smtps” respectivement pour les connexions originaires du port submission ou encore établies en smtps (SSL). Le problème de cette conf est que les règles logcheck d'origine ne matchent plus les logs obtenus : on va donc changer ca.
Pour rechercher les règles “connect from” en place par défaut :
# grep connect /etc/logcheck/ignore.d.server/postfix | grep from
qui devrait vous montrer quelques lignes dont une intéressante qui va servir de base pour notre règle custom :
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ postfix/smtpd\[[[:digit:]]+\]: (dis)?connect from [^[:space:]]+$
on va donc ajouter la présence optionnelle de “submission/” ou “smtps/” entre “postfix/” et “smtpd”, ce qui nous donne la ligne :
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ postfix/(submission/|smtps/)?smtpd\[[[:digit:]]+\]: (dis)?connect from [^[:space:]]+$
On valide cette règle avec un coup de
egrep -e "^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ postfix/(submission/|smtps/)?smtpd\[[[:digit:]]+\]: (dis)?connect from [^[:space:]]+$" /var/log/syslog | grep smtps
et si on obtient bien les resultats a filtrer on peut ajouter ce filtre au fichier “/etc/logcheck/ignore.d.server/postfix”.
Autre règle a rajouter :
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ postfix/(submission/|smtps/)?smtpd\[[[:digit:]]+\]: [[:alnum:]]+: client=[^[:space:]]+, sasl_method=[-[:alnum:]]+, sasl_username=[-_.@[:alnum:]]+$
Le monitoring a une facheuse tendance à faire des faux positifs
exemple de log obtenu (adapter à vos IPs de serveurs de monitoring 2607:f0d0:1002:51::1 et serveur dovecot 2607:f0d0:1002:51::2, mais vous ne voulez pas mettre ici des “[.:[:xdigit:]]+” pour ne pas cacher de vrais problèmes éventuels) :
# Oct 21 09:05:02 monserveur dovecot: imap-login: Aborted login (no auth attempts in 1 secs): user=<>, rip=2607:f0d0:1002:51::1, lip=2607:f0d0:1002:51::2, TLS, session=<2DV5XVTN0gAqAQ41i0SEwAAAAAAAAAAC>
et sa règle correspondante :
^\w{3} [ :[:digit:]]{11} [._[:alnum:]-]+ dovecot: (pop3|imap)-login: Aborted login( \([[:digit:]]+ authentication attempts\)| \(no auth attempts in [[:digit:]]+ secs\))?: (user=<[-_.@[:alnum:]]+>, method=[[:alnum:]-]+, |user=<>, )?rip=2607:f0d0:1002:51::1, lip=2607:f0d0:1002:51::2(, (TLS( handshake)?|secured))?(, session=<[[:alnum:]/\+]+>)?$