Réseau - Web - GNU/Linux

2013 23 août

Finesses pour les administrateurs système - Debian 7.0 wheezy

Rédigé par Marc GUILLAUME | Aucun commentaire
Article précédent Mail façon FAI - Debian 7.0 Wheezy

Quelques outils supplémentaires utiles.

Logrotate

Sur un serveur de mail actif votre fichier /var/log/mail.log va grossir rapidement. Ce fichier ne grossit pas indéfiniment grâce au programme logrotate qui est installé par défaut. Chaque jour (contrôlé par cron - voir le fichier /etc/cron.daily/logrotate file) les fichiers de log subissent une rotation. C'est à dire que l'ancien fichier mail.log est renommé en mail.log.1 et le démon Syslog est relancé de façon à ouvrir un nouveau fichier mail.log vide. Au cycle suivant le fichier mail.log.1 devient mail.log.2 qui est compressé au format GZip et pour donner un fichier beaucoup moins volumineux mail.log.2.gz.

Ce comportement est contrôlé par le fichier /etc/logrotate.d/rsyslog. Par défaut les cycles de rotations sont définis avec les options weekly (par semaine) et rotate 4 (rotation sur quatre fichiers). Avec cette configuration la rotation de fichier se fait un fois par semaine et après quatre rotations le fichier le plus ancien est effacé. Les serveurs de courrier très sollicités peuvent avoir besoin de rotations quotidienne. Il faut alors remplacer weekly par daily (par jour). Du coup les 4 rotations de fichier par défaut ne représentent plus que quatre jours et plus quatre semaine. Il faut donc augmenter le chiffre de rotations de façon significative. Par exemple rotate 90 gardera les logs des 90 derniers jours.

File d'attente et identifiants de file d'attente (queue IDs)

Comprendre le fonctionnement de la file d'attente de Postfix est très utile. Postfix va mettre tous les mails acceptés en file d'attente avant qu'un autre processus Postfix ne les récupère pour essayer de les distribuer. Vous pouvez voir quels mails sont actuellement en file d'attente en lançant dans le shell la commande :

mailq

Sur un serveur très actif vous pouvez avoir des centaines de mails en attente pour diverses raisons. Peut-être un FAI étrangle-t-il votre serveur car il envoit des quantités inhabituelles d'emails (ce qui peut facilement survenir quand vous envoyer une lettre d'information) ou bien le serveur de destination des mails est actuellement inaccessible. Un exemple des entrées qui peuvent figurer dans la file d'attente pourrait ressembler à ceci :

    04D8CA8C442     2399 Tue May 31 09:49:11  MAILER-DAEMON
                   (connect to mx.example.com[146.44.5.213]:25: Connection timed out)
                                             info@example.com

La chaîne de caractères 04D8CA8C442 est l'identifiant de file d'attente (queue ID). Pour voir ce qui s'est passé avec ce mail vous pouvez lancer la commande grep sur le fichier /var/log/mail.log :

grep 04D8CA8C442 /var/log/mail.log

La sortie pourrait être :

 

May 31 09:49:11 mx1 postfix/smtpd[4428]: 04D8CA8C442: client=web.localnet[10.10.41.3]
May 31 09:49:11 mx1 postfix/cleanup[4473]: 04D8CA8C442: message-id=<20110531094911.0A73631F59D@newsletter.example.net>
May 31 09:49:11 mx1 postfix/qmgr[25512]: 04D8CA8C442: from=<>, size=2399, nrcpt=1 (queue active)
May 31 09:49:41 mx1 postfix/smtp[4945]: 04D8CA8C442: to=<info@example.com>, relay=none, delay=30, delays=0.05/0.06/30/0, dsn=4.4.1, status=deferred (connect to mx.example.com[146.44.5.213]:25: Connection timed out)

Les différents processus Postfix qui ont pris en charge le mail sont notés après postfix/.... Le processus smtpd a reçu le mail depuis le serveur web.localnet. Alors le processus cleanup a placé le mail dans la file d'attente. Ensuite le processus qmgr a déplacé le mail dans la file d'attente active et smtp a essayé de l'envoyer. Comme le serveur de destination mx.example.com ne pouvait être contacté, Postfix a laissé le mail dans la file d'attente. Le code DSN (delivry status notfication ou notification de statut de distribution) étant 4.4.1. Tous les codes commençant par 4 correpondent à des erreurs temporaires, Postfix essayera encore d'envoyer le mail. Les codes commençant par 5 correspondent à des erreurs permanentes et Postfix instantanément rejette le mail et informe l'expéditeur de l'erreur de distribution. Les codes commençant par 2 correspondent à des envois réussis.

Si l'envoi a réussi, alors la ligne postfix/smtp ressemblera à ça :

Jun  5 12:41:10 mail postfix/smtp[12044]: 2171CA860E0: to=<jonathan@example.com>, relay=mx.example.com[191.13.14.2]:25, delay=0.32, delays=0.04/0/0.17/0.1, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as B0BAC736372)

La dernière partie du message contient une châine de caractères que le serveur distant retourne si la distribution a réussi. Ainsi si vous voyer qu'un email s'est perdu entre votre serveur et le serveur de destination (mx.example.com) cette ligne des logs vous aidera beaucoup. Vous voyez que votre mail a été mis dans votre file d'attente sous l'identifiant 2171CA860E0 et envoyé à mx.example.com qui l'a placé dans sa propre file d'attente avec l'identifiant B0BAC736372. Vous pouvez ainsi interroger l'administrateur du serveur distant pour lui demander ce qui est arrivé à ce mail.

Avoir des statistiques

La lecture de votre fichier de log peut difficilement vous donner des informations d'ensemble. Surtout sur un serveur très actif, vous aurez difficilement une idée de ce qui se passe, sauf à compter les lignes de votre fichier de log. Je préfère traiter mes logs de courrier avec pflogsum (Postfix Log Summare c'est à dire Résumé des Logs Postfix). Ce programme est facile à installer :

aptitude install pflogsumm

Traitez alors votre fichier de log avec ce programme :

    pflogsumm /var/log/mail.log

Vous obtenez généralement des comptes de ce genre :

messages

	129   received
	331   delivered
		1   forwarded
		8   deferred  (59  deferrals)
		3   bounced
	586   rejected (63%)
		0   reject warnings
		0   held
		0   discarded (0%)

	3108k  bytes received
	3967k  bytes delivered
		36   senders
		28   sending hosts/domains
	229   recipients
	147   recipient hosts/domains

Vous obtenez également un résumé du traffic heure par heure (combien de mails ont été envoyés et reçus et à quelle heure). Vous obtiendrez également un liste triée des domaines d'expéditon et de destination. A côté de ces statistiques générales pflogsumm extrait également les erreurs et les avertissements de telle sorte que vous avez une rapide vue d'ensemble des raisons pour lesquelles un mail a été mis en attente ou rejeté/renvoyé à l'envoyeur et une idée de l'efficacité des RBLs (real-time blacklists) que vous utilisez.

Regardez les exemples de paramètrage de tâches cron dans /usr/share/doc/pflogsumm/examples sur votre système. Ils vous aideront à obtenir un rapport automatique quotidien et hebdomadaire.

Note du traducteur : Une proposition de script envoyant par mail les statistiques de la veille à lancer en cron.

#! /bin/bash
# Création 2014 07 31
# Marc GUILLAUME <marc [chez] yakati.net>
# Script d'envoi des statstiques de mail de la veille avec pflogsumm

# Chemins des utilitaires
PFLOGSUMM=$(which pflogsumm) || exit 1
DATE=$(whichdate) || exit 2 
MAILX=$(which mailx) || exit 3

# Initialisation des variables
HOSTNAME=$(hostname)
LOGFILE='/var/log/mail.log'
DATEVEILLE=$(${DATE} --date='1 days ago' +%Y-%m-%d)
ADMINMAIL='admin@example.com'
SUBJECT='['$HOSTNAME'] statistiques mail du '$DATEVEILLE
TMPFILE='/tmp/statsPostfixVeille'

# On enregistre les stats dans un fichier
$(${PFLOGSUMM} -d yesterday --problems_first ${LOGFILE} > $TMPFILE 2>  /dev/null)

# On evoie le mail
${MAILX} -s  "${SUBJECT}"  ${ADMINMAIL}  < ${TMPFILE}

# On supprime le fichiet temporaire
rm -f ${TMPFILE}

exit 0

Bloquer les script Kiddies avec fail2ban

Vous êtes certainement au courant qu'Internet n'est plus l'endroit amical qu'il était jadis. Heureusement la plupart des attaquants que vous rencontrerez sur votre serveur de mail sont de stupides et aventureux script kiddies (voir la définition wikipedia de ce terme). Ils vont utiliser des scripts grossiers pour essayer quelques combinaisons de noms d'utilisateurs et de mots de passe pour essayer d'accéder à vos boîtes mail. Dans votre fichier /var/log/mail.log cela va ressembler à ça :

dovecot: pop3-login: Disconnected (auth failed, 1 attempts): user=, method=PLAIN, rip=61.144.24.114, lip=87.152.157.104
dovecot: pop3-login: Disconnected (auth failed, 1 attempts): user=, method=PLAIN, rip=61.144.24.114, lip=87.152.157.104
dovecot: pop3-login: Disconnected (auth failed, 1 attempts): user=, method=PLAIN, rip=61.144.24.114, lip=87.152.157.104
dovecot: pop3-login: Disconnected (auth failed, 1 attempts): user=, method=PLAIN, rip=61.144.24.114, lip=87.152.157.104
dovecot: pop3-login: Disconnected (auth failed, 1 attempts): user=, method=PLAIN, rip=61.144.24.114, lip=87.152.157.104
dovecot: pop3-login: Disconnected (auth failed, 1 attempts): user=, method=PLAIN, rip=61.144.24.114, lip=87.152.157.104
dovecot: pop3-login: Disconnected (auth failed, 1 attempts): user=, method=PLAIN, rip=61.144.24.114, lip=87.152.157.104
dovecot: pop3-login: Disconnected (auth failed, 1 attempts): user=, method=PLAIN, rip=61.144.24.114, lip=87.152.157.104
dovecot: pop3-login: Disconnected (auth failed, 1 attempts): user=, method=PLAIN, rip=61.144.24.114, lip=87.152.157.104
dovecot: pop3-login: Disconnected (auth failed, 1 attempts): user=, method=PLAIN, rip=61.144.24.114, lip=87.152.157.104
dovecot: pop3-login: Disconnected (auth failed, 1 attempts): user=, method=PLAIN, rip=61.144.24.114, lip=87.152.157.104
dovecot: pop3-login: Disconnected (auth failed, 1 attempts): user=, method=PLAIN, rip=61.144.24.114, lip=87.152.157.104
dovecot: pop3-login: Disconnected (auth failed, 1 attempts): user=, method=PLAIN, rip=61.144.24.114, lip=87.152.157.104
dovecot: pop3-login: Disconnected (auth failed, 1 attempts): user=, method=PLAIN, rip=61.144.24.114, lip=87.152.157.104
dovecot: pop3-login: Disconnected (auth failed, 1 attempts): user=, method=PLAIN, rip=61.144.24.114, lip=87.152.157.104
dovecot: pop3-login: Disconnected (auth failed, 1 attempts): user=, method=PLAIN, rip=61.144.24.114, lip=87.152.157.104

Nous n'utilisons pas de noms d'utilisateur de type « oscar » mais plutôt « oscar@example.com » donc ces ennuyeuses tentatives ne peuvent réussir. Mais pourquoi prendre un risque ? Nous pouvons alors utiliser le programme fail2ban (NdT : que l'on pourrait traduire par « de l'erreur au bannissement ») pour bloquer facilement ces attaques en force brute. Commençons par installer fail2ban sur notre serveur :

aptitude install fail2ban

Fai2ban lance un processus démon qui peut examiner divers fichiers de log, rechercher certains types de lignes correspondant à des tentatives d'attaque dans ces fichiers (en utilisant un filtrage par des expressions régulières) et agir en conséquence. Il est ainsi possible d'apprendre à fail2ban à rechercher des lignes de log rapportant des erreurs d'authentification comme celles de l'exemple plus haut et ajouter une règle de pare-feu (en utilisant iptables par défaut) pour bloquer les accès depuis l'IP du script kiddie. Par défaut fail2ban lance une action de blocage si il trouve trois tentatives d'attaque dans une période de 10 minutes. Il bloque l'accès au serveur par cette IP pendant 10 minutes. Ces valeurs sont configurables.

Ajoutez un fichier /etc/fail2ban/filter.d/dovecot-pop3imap.conf contenant :

[Definitio
failregex = (?: pop3-login|imap-login): .*(?:Authentication failure|Aborted login \(auth failed|Aborted login \(tried to use disabled|Disconnected \(auth failed).*rip=(?P\S*),.*
ignoreregex =

Ceci ajoute une expression régulière qui indique à fail2ban à quoi ressemble une ligne de log correspondant à une tentative d'attaque. La chaîne P comme valeur de rip (remote IP c'est à dire IP distante) contiendra l'adresse IP de l'attaquant, Fail2ban utilise cette variable pour créer la règle de bannissement de l'adresse IP.

Éditez ensuite le fichier /etc/fail2ban/jail.conf. Commencez par activer le filtre postfix qui est désactivé par défaut :

[postfix]
enabled  = true
port     = smtp,ssmtp
filter   = postfix
logpath  = /var/log/mail.log

Rajoutez ensuite une section pour le filtrage dovecot que l'on vient de créer ci-dessus :

[dovecot-pop3ima
enabled = true
port = pop3,pop3s,imap,imaps
filter = dovecot-pop3imap
logpath = /var/log/mail.log

NOTE DU TRADUCTEUR : Christoph Haas modifie directement le fichier jail.conf, mais je vous conseille de suivre les indications donnés par le mainteneur du paquet Debian qui conseille dans l'installation Debian de rajouter vos popres modifications dans un fichier /etc/fail2ban/jail.local. La raison en est que lors d'une mise à jour du paquet fail2ban vos modifications ne risqueront pas d'être écrasées par le configuration par défaut. Voici la mention qui figure en tête du fichier /etc/fail2ban/jail.conf :

#
# This file was composed for Debian systems from the original one
#  provided now under /usr/share/doc/fail2ban/examples/jail.conf
#  for additional examples.
#
# To avoid merges during upgrades DO NOT MODIFY THIS FILE
# and rather provide your changes in /etc/fail2ban/jail.local
#
# Author: Yaroslav O. Halchenko <debian@onerussian.com>
#
# $Revision: 281 $
#

Redémarrez fail2ban :

/etc/init.d/fail2ban restart

Maintenant vous pouvez attendre que les scripts kiddies tentent leur chance. Mais pour vérifier que tout fonctionne vous pouvez aussi simuler une attaque en envoyant manuellement des lignes dans vos logs.

logger -p mail.info -t dovecot "imap-login: Aborted login (auth failed, 2 attempts): user=, method=PLAIN, rip=10.20.30.40, lip=1.2.3.4, TLS"

Lancez cette commande trois fois coup sur coup pour déclencher le blocage par fail2ban. Si tout fonctionne comme cela devrait vous devriez lire dans votre fichier /var/log/fail2ban.log :

fail2ban.actions: WARNING [dovecot-pop3ima Ban 10.20.30.40

Maintenant les attaquants ne peuvent lancer plus de trois attaques toutes les dix minutes. C'est chouette non ?

Écrire un commentaire

Quelle est la deuxième lettre du mot nfhges ?

Fil RSS des commentaires de cet article

À propos

Yakati.info - Réseau - Web - GNU/Linux © 2017

Généré par PluXml en 0.03s  - Administration

Mes coordonnées

Marc Guillaume
contact[at]yakati.info
79150 ÉTUSSON

Crédits

Pour la gestion du contenu

Généré par PluXml, le Blog ou Cms sans base de données

Pour le contenu

Licence Creative Commons
Ce(tte) œuvre est mise à disposition selon les termes de la Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International.

Pour le thème

Thème SOLID de blacktie.co adapté pour PluXml