Accueil > HowTo Mail > Gestion Serveur Mail Postfix, Amavisd, Mysql, Spamassassin, (...)
vendredi 29 juin 2007, par
Exploitation Serveur de MAIL
Mise à jour du 03/08/2012
Cet article traite de la gestion d’un système de mail.
La procédure détaillée d’installation de ce système est en ligne sur ce site.
4 logiciels principaux sont utilisés pour la remise et l’envoi du courrier :
le MTA postfix
le filtre amavis (interface entre le mta et l’antivirus)
le filtre spamassassin
le filtre dspam
postfix
amavis
antivirus
spamassassin
dspam
retour dans postfix
lda dovecot
D’une manière générale, pour effectuer un blocage systématique, il est conseillé de le faire directement dans Postfix. (sender, client, recipient, contrôle des entêtes, body et type Mime)
La charge est très réduite dans ce cas car c’est lors de la transaction SMTP que s’effectue le blocage.
Le mail n’est donc pas encore traité. (économie de bande passante)
Un blocage effectué dans Amavis ou dans SpamAssassin sera plus gourmand en ressource.
NOTE :
il existe plusieurs points de contrôle à l’arrivée d’un message dans Postfix.
L’ordre global d’application est le suivant :
SMTPD Restrictions
Header/body Checks
Content Filters
Postfix établit 4 étapes de tests (stages) au niveau des SMTPD Restrictions qui correspondent chacune à une commande SMTP :
Dans l’ordre :
| Stage | Smtp |
|---|---|
| smtpd_client_restrictions | connection du client |
| smtpd_helo_restrictions | HELO |
| smtpd_sender_restrictions | MAIL FROM |
| smtpd_recipient_restrictions | RCPT TO |
| smtpd_data_restrictions | DATA |
| smtpd_end_of_data_restrictions | END OF DATA |
Postfix est configuré dans notre cas pour évaluer les tests au moment de la commande RCPT TO, donc dans la section smtpd_recipient_restrictions.
C’est à dire que le blocage n’interviendra qu’au moment ou le client envoie la dernière commande.
A l’intérieur d’un restriction stage il existe des access lists (ACL).
Dès qu’une de ces access lists renvoient OK, on passe au stage suivant. (la fin d’un stage par défaut est PERMIT)
Si une access list renvoie REJECT le message est bloqué.
Si une access list ne matche pas, on passe a l’access list suivante dans le stage. (DUNNO)
Nous détaillons ci dessous notre cas de figure particulier :
Nous n’avons rien specifié ici donc par défaut ce stage est vide. On passe au suivant
Nous n’avons rien specifié ici donc par défaut ce stage est vide. On passe au suivant
Ici on a spécifié de rejeter :
A noter qu’en cas de blocage, on passe tout de meme au stage suivant car les blocages seront evalués au prochain stage. (mais le mail sera bloqué de toute facon, meme si le stage suivant se termine par OK)
Tous les autres cas de figures sont considérés comme valides, on passe donc au stage suivant.
smtpd_recipient_restrictions =
C’est le stage le plus important.
Evaluation des Stages CLIENT, HELO, SENDER, RECIPIENT :
A noter qu’a partir d’ici tous les stages précédents (CLIENT, HELO, SENDER, RECIPIENT) sont evalués, donc avec soit un PERMIT soit un REJECT (ou un code de rejet)
Si c’est un REJECT le mail est définitivement rejeté avec le code d’erreur associé, au moment ou le client passe la commande RCPT TO.
Si c’est un PERMIT alors on passe tout de même aux 2 stages suivants (commande DATA) car ils auront en quelque sorte le dernier mot si leurs ACLs rejettent un message.
Les stages DATA :
Un REJECT dans un des 2 stages DATA signifiera que le mail sera bloqué et ce MEME si il etait accepté EXPLICITEMENT dans l’évaluation des stages SENDER et RECIPIENT.
Par exemple, un utilisateur identifié SASL qui a vu son autorisation d’envoyer un mail acceptée bien plus haut dans la liste doit encore passer ces 2 stages. Et un reject signifiera que le mail est bloqué...
Un OK dans ce stage sera sans danger pour les restrictions des stages précédents car on l’a vu, en cas de REJECT dans les stages précedent le message n’arrive pas aux 2 stages DATA (rejet au moment de la commande RCPT TO donc avant que le client ne passe la commande DATA).
Donc aucun risque d’être un relais ouvert et/ou de bypasser les restrictions précedentes.
On bypassera en fait les autorisations précédentes.
Cela permet de bloquer les client SMTP qui "parlent" trop tôt dans la transaction.
C’est le cas des scripts mal écrits et de quelques softs de spamming.
smtpd_end_of_data_restrictions =
c’est l’utilisation d’un policy service, c’est à dire un petit logiciel qui est chargé d’effectuer des contrôles supplémentaires et qui renvoie à Postfix le résultat.
Pour nous il s’agit de Policyd, chargé d’effectuer des contrôles de flux.
On détaillera plus loin son fonctionnement.
Comme il s’agit du dernier stage le mail est veritablement validé ici. Policyd supplantera donc une decision de PERMIT prises plus haut et appliquera la sienne.
Comme Policyd est utilisé pour controler le flux, on gère ainsi TOUS les mails traversant le systeme.
Ci joint un schema sur l’application de ces restrictions
On vient de voir le fonctionnement global.
Prenons maintenant des cas pratiques en cas de blocage :
Première règle : chercher dans le message d’erreur, le message envoyé par le mailer-daemon et le log de Postfix, qu’elle est la raison du blocage.
Si on recoit un message "Postfix SMTP server : errors from :" dans la boite admin, il s’agit d’un blocage de Postfix.
NOTE :
le client ne recoit aucun message de la part de notre serveur, c’est le serveur du client qui recoit un code d’annulation de l’envoi et gère ce refus. (normalement le serveur du client avertit le sender par mail)
Il faut donc regarder quelle est le contenu du message :
Par exemple :
Il s’agit d’un blocage au niveau SMTP sur le HELO.
Le client n’a pas envoyé un HELO correct. (cela doit etre un FQDN et ici c’est une adresse IP, en l’occurence la notre, ce qui est clairement le signe d’un envoi invalide)
Dans la configuration actuelle il n’est pas prévu de laisser passer ce genre de message même pour des cas particuliers. (pas de whitelist)
Aucun serveur de mail ne doit envoyer un HELO de la sorte.
On l’a vu plus haut, une grande partie du filtrage peut se faire par l’utilisation de listes (des RBLs) sur internet, maintenues par diverses entités et qui recensent des milliers d’IP/domaines suspectés d’être à l’origine d’envois de spam.
Le problème reside dans le fait que ces listes sont plus ou moins arbitraires, (spamcop) et que leur filtrage est souvent trop brutal. (c’est pour cela qu’il est conseillé d’utiliser policyd-weight sur un serveur en production, voir l’article relatif sur Starbridge)
Pour un sender qui serait bloqué par les DNSBL ou les RBL :
Pour ce blocage on peut whitelister exceptionnellement le sender ou le client (comme on l’a dit plus haut il vaut mieux le faire sur le client par securité) :
il faut alors l’autoriser dans la table postifx_access (en précisant la nature : sender pour un email ou client pour un serveur de mail).
Ici il faudrait ajouter 59.95.12.67 en type client et action OK
Note : Ce whitelistage permet d’eviter le controle des RBL dans postfix mais aussi celle dans Policyd-weight, puisque l’access list est positionnée en amont.
Si on ne recoit aucun message d’erreur SMTP cela signifie que l’expéditeur et le recipient semblent valides, le message continue alors d’etre livré et Postfix vérifie son contenu.
Ce sont les tables (non SQL, dans /etc/postfix)
Note :
toute modification de ces fichiers doit être suivie de la commande :
Tout match sur des règles présentes dans ces fichiers se traduit par à nouveau un message dans la boite admin : (et dans les logs bien sur)
En cas de doute, on voit également dans les logs la nature de l’erreur (header, body, ou mime) et on peut ajuster alors le fichier correspondant si besoin est.
C’est ici qu’intervient le premier point de contrôle des pièces jointes.
Les extensions de fichiers et les types mime sont controlés.
Si un match se produit le serveur renvoit une erreur.
Note :
Il n’est pas possible de passer outre ces contrôles dans la configuration de base.
Ce controle à ces limites, notamment sur les emails encodés en base64.
C’est pour cela que les type de fichiers sont aussi controlés plus tard par Amavisd et qu’il n’est pas nécessaire de trop surcharger ces fichiers regexp.
Si l’on desire controler finement les pieces jointes, le mieux est de désactiver leur controle dans postfix et de laisser faire amavisd.
Ici il s’agit d’un destinataire inconnu.
L’adresse mail n’existe pas dans notre base.
Note : Ce parametre ne peut etre modifié que par un admin.
Il faut simplement ajouter une entrée dans la table postfix_access en type sender pour bloquer une adresse mail ou en type client pour bloquer un serveur.
[rouge]Attention : il faut absolument spécifier en action le code 554 suivi d’un texte qui sera affiché au serveur qui se connecte.
Si on ne met que le code 554 le filtrage ne fonctionne pas. (ex : 554 Spam)[/rouge]
De plus il faut être certain que l’IP du client ou le MAILFROM soient corrects pour que le contrôle soit efficace.
Par exemple le HELO n’est pas forcément le domaine du client. Il faut donc regarder quel est le premier log de la transaction SMTP (connect from :)
Les logs de postfix sont le point le plus fiable pour trouver ces informations.
Note : pour bloquer un domaine et ses sous domaines en type client il faut le spécifier comme ceci :
Par exemple, pour bloquer les connections depuis les clients smtp 21.mail-out.ovh.net et 12.mail-out.ovh.net, il faut specifier en type client :
mail-out.ovh.net et action 554 Spam
bien sur, tous les autres sous domaines seront également bloqués.
Note : ceci est le cas avec les parametres par défaut dans postfix qui applique le setting : parent_domain_matches_subdomains pour les tables smtpd_access_maps.
- Pièces Jointes
Amavisd peut bloquer les mails contenant certains types de pièces jointes. (avi, mp, dll...)
Ce scan est très fiable car le mail et la pièce jointe sont décomposés et eventuellement décompressés.
Ainsi un fichier .dll à l’intérieur d’une archive zip sera bloqué (alors qu’il ne pouvait pas l’être par le filtrage basique de Postfix)
De même, un fichier .dll renommé en txt sera également bloqué car le Type Mime du fichier sera vérifié.
Si un match se produit, il renvoit un mail d’erreur BANNED à l’expéditeur et au sender.
Et le mail est mis en quarantaine dans /var/virusmail.
On peut whitelister un Type Mime et des extensions de fichiers dans /etc/amavisd.conf.
Pour désactiver le controle des pieces jointes dans amavisd, il faut se connecter à horde et dans les options spams, cocher les cases : Skip Banned File Checks et Receive Banned Files.
Pour rendre cette règle active au niveau d’un domaine il faut qu’un administrateur ajoute dans la base les entrées équivalentes mais pour le user @domain.com, ce qui prendra alors en compte la totalité du domaine.
Une priorité à 6 sur ce domaine dans amavisd, permettra aux règles par users de supplanter cette règle générale.
Exemple pour paramétrer finement le domaine starbridge.org dans amavisd :
Ici l’on a désactivé le contrôle des fichiers joints pour le domaine starbridge.org.
La priorité 6 permettra à un réglage personnel pour un user du domaine, de prendre le pas sur cette configuration.
Attention aux id et aux correspondances de policy, ici les numero sont des exemples.
Si cette étape est validée, le mail est scanné par l’antivirus.
- Antivirus
L’antivirus traite les mails recus ET envoyés depuis la plateforme.
C’est le filtre Amavisd qui se charge de l’envoi des mails au daemon Clamd.
Amavisd a décomposé le mail, et décompressé les pièces jointes éventuelles et il transmet ces parties à clamd qui les scanne.
Si un virus est détecté, le mail est rejeté et un message d’alerte est envoyé.
Si le message est ok, amavisd poursuit le traitement. (spamassassin + dspam).
La mise à jour de la base antivirus est automatique.
En cas de détection d’un virus, le serveur renvoit un mail d’erreur INFECTED à l’expéditeur et au sender. (sauf dans le cas de virus connus pour créer de faux expéditeurs : liste dans amavisd.conf)
On peut permettre a un utilisateur ou a un domaine complet de recevoir les virus. (non recommandé)
C’est dans la table sql d’amavisd que cela se fait, voir plus haut pour la configuration.
Par utilisateur l’option existe dans le module sam, mais elle est desactivée par défaut. On peut la rendre disponible au users mais cela est tout a fait déconseillé.
Une fois le traitement antivirus terminé, amavisd poursuit avec l’antispam.
Tous les messages en dessous de 512 Ko sont envoyés à Spamassassin pour analyse.
La configuration de Spamassassin se trouve dans /etc/mail/spamassassin/local.cf.
Note : Vu que c’est le daemon Amavisd qui contrôle Spamassassin, il est conseillé de modifier la plupart des options dans amavisd.conf.
Cela dit le fichier local.cf de SA est toujours pris en compte, notamment pour le whitelist et le blacklist, mais certains paramètres seront ignorés.
Note : Le score minimum pour être détecté comme spam se règle dans Amavisd. (il est ignoré dans local.cf)
Pour whitelister un sender on a plusieurs possibilités :
soit on ajoute en dur dans la configuration d’amavisd des scores negatifs pour un sender donnée,
soit on parametre a nouveau la base sql d’amavisd pour un domaine donné
soit on utilise le module sam pour que chaque user gere ses whitelist et blacklist comme il le souhaite.
Pour parametre en dur et donc rendre la configuration globale, il faut ajouter ces lignes dans amavisd.conf :
pour whitelister un domaine entier :
pour blacklister un sender :
Il s’agit de soft whitelisting ou soft blacklisting : On attribut un score négatif ou positif qui modifiera le score initial du message.
Pour le faire au niveau du domaine grace à la base sql, il faut créer un sender dans la base, puis lié au moyen de la table wb, celui ci avec le user défini (en l’occurence @starbridge.org pour un domaine entier).
En précisant W ou B on whitelist ou on blackliste, en entrant un chiffre positif ou negatif, on attribue un score. (soft white|black listing)
Pour le faire par utilisateur, le module sam procède exactement de la même facon, en ajoutant ces entrées dans la base, mais en utilisant comme user un type user@starbridge.org, valide uniquement pour lui meme.
A noter que pour le moment le module SAM ne precise que W ou B, il ne fait pas de soft whitelisting.
Amavisd envoie ensuite les mails à Dspam, le traitement est automatique (pas de whitelist), car SA est prioritaire sur dspam.
En effet si dspam considère qu’un message est du spam, il transmet à Amavisd le résultat et le score s’ajoute dans SA.
On peut moduler ce score dans la configuration de SA. (fichier local.cf)
Après analyse, et si le score du message dépasse 4.3, Amavisd réecrit le header du message et y ajoute les infos :
X-Spam-
et réecrit également le sujet du message avec le préfixe ***SPAM(score)***
Contrairement à un virus, les spams sont autorisés a être livrés jusqu’a un score prédéfini (par défaut 10).
Au dela ils sont mis en quarantaine directement par amavisd qui les stocke en base SQL.
Entre 4.3 et 10 les mails sont juste taggés et triés plus tard par le filtre Sieve.
Le gestionnaire de quarantaine mailzu permet de consulter les mails directement par les users
Ceux ci peuvent alors demander la libération d’un message ) un administrateur. Après validation le mail sera livré.
Cette interface gere aussi la quarantaine des virus et des fichiers bannis.
Les messages même au dela de 10 sont donc encore consultables par les destinataires, ce qui leur permet de controler au mieux leur boite aux lettres.
La durée de vie dans la quarantaine de mailzu est de 30 jours.
Dans la configuration avec mailzu, le parametre kill_level dans la base sql d’amavisd est l’elément déterminant pour le placement du message dans la quarantaine.
Il est réglé à 10 par défaut.
4.3 est le tag level, c’est à dire le point où amavisd ajoute l’entête spam dans le message, mais le livre tout de même au client.
Par défaut dans SAM, un user peut modifier son tag level, mais pas son kill level.
Cependant il est possible de lui laisser ce choix en modifiant la conf du module SAM.
On peut, à nouveau, parametrer tout ceci pour un domaine particulier dans la base sql en utilisant comme user @starbridge.org.
Une fois que toutes les étapes postfix/amavisd/SA/clam/DSPAM sont validées, la livraison continue.
Le mail revient dans postfix suite au traitement.
C’est le lda de dovecot qui se charge de la livraison dans les boîtes physiques.
Il est appelé par Postfix (/etc/postfix/master.cf).
Le langage Sieve est supporté par le lda dovecot et permet d’exécuter des actions en fonction de criteres au moment de la livraison.
Un fichier Sieve général est systématiquement exécuté pour tous les mails livrés.
Ce fichier est exécuté dans l’ordre :
dès le premier match l’action est exécutée.
L’élimination ou la mise en quarantaine du spam sont effectuées à ce moment de la livraison :
Pour info le fichier global.sieve contient les regles suivantes :
C’est l’extension +spam de l’adresse qui est le critere determinant. Cette extension est ajoutée par amavisd pour les mails entre 4.3 et 10.
Si le mail est OK, sieve parse le fichier sieve personnel s’il existe. (dans le répertoire qui porte le nom de l’utilisateur)
C’est ici que l’utilisateur peut indiquer des règles de messages particuliers (remise dans des répertoires définis sur des critères précis.)
Si aucune règle ne matche, le mail est remis dans le répertoire utilisateur.
Si une règle matche, le mail sera alors livré dans le sous dossier correspondant
Note : Dans le cas d’utilisation du POP plutot que l’IMAP pour la consultation des boites au lettre, la redirection automatique des messages détéctés comme spam
dans un repertoire predéfini devra etre désactivée (fichier /home/sieve/global.sieve).
En effet, contrairement à l’imap, il n’y a pas de notion de repertoire dans le pop.
Les users pop recevront donc leur messages + le spam détecté avec le prefixe [SPAM] dans la même boite.
Les users pop pourront créer une regle sur leur client mail pour rediriger ces messages.
Si l’on a des utilisateurs IMAP et POP dans le reseau, alors il faudra totu de meme désactiver la redirection globale et Les users imap pourront utiliser ingo dans horde pour créer un filtre de redirection
automatique personnel de ces messages dans le bon dossier imap
Si un utilisateur a besoin de blacklister un expéditeur particulier, il peut le faire par l’interface du webmail Horde qui permet de créer des regles sieve dans le fichier sieve personnel.
Ce filtrage ne concerne que l’utilisateur en question et n’impacte pas les autres utilisateurs, contrairement aux exemples de blacklistage cités plus haut dans le document.
Note : Ceci ne s’applique qu’aux boite IMAP.
En plus du répertoire Spam dans les boites utilisateurs, on trouve également les répertoires :
SpamToLearn
SpamFalse
Ces 2 dossiers permettent à l’utilisateur de signaler un email noté à tort comme spam ou l’inverse.
Pour cela, il lui suffira de copier le message en question dans le dossier de son choix :
SpamToLearn dans le cas d’un spam non détecté.
SpamFalse dans le cas d’un false positive.
Ces répertoires sont automatiquement scannés et vidés plusieurs fois par jour. (fréquence déterminée par la crontab)
La création d’un alias se fait dans Postfixadmin par un administrateur
On crée l’alias en spécifiant la nouvelle adresse puis l’adresse de destination finale (la boite physique en fait)
[rouge]Attention : meme s’il est possible de diriger un alias vers un autre alias qui lui même pointe vers l’adresse physique, il ne faut surtout pas utiliser une telle méthode.[/rouge]
En effet, le contrôle des MAIL FROM pour les utilisateurs authentifiés par SASL se fait justement sur la comparaison entre la boite physique (donc le compte de l’utilisateur par exemple admin@starbridge.org) et les alias existants pointant vers celle ci.
On remarquera que Postfixadmin crée toujours un alias du même nom que la boite physique : par exemple pour la boite admin@starbridge.org, il existe dès la création l’alias :
admin@starbridge.org ==> admin@starbridge.org
Ces alias "systèmes" ne sont pas visibles dans Postfixadmin par défaut pour plus de clarté mais on peut les voir dans phpmyadmin.
Lors du controle SASL/MAILFROM, la table alias est consultée et dans tous les cas on aura au moins : admin@starbridge.org ==> admin@starbridge.org.
C’est pour cette raison que chaque création d’un nouvel alias doit pointer vers l’adresse physique.
Il existe 2 moyens de rediriger les messages recus vers un destinataire :
l’ajout d’un alias par l’administrateur
la regle sieve
http://www.starbridge.org/postfixadmin/
on ajoute au mail existant l’email desiré
[rouge]Attention : ne pas modifier les options en dessous. Cela provoquerait l’impossibilité d’envoyer un email depuis ce compte. Pour faire une redirection sans conserver une copie du message dans la boite principale, il FAUT utiliser la méthode sieve ci dessous.[/rouge]
Il vaut mieux utiliser la redirection sieve, notamment si on ne souhaite pas recevoir les messages dans la boite d’origine.
En effet la modification de l’alias principal par la methode 1, bloquera toute possibilité d’envoi de mail par l’utilisateur, en raison du mécanisme de verification des mailfrom.
Il existe plusieurs type de quotas dans notre infrastructure :
la taille maximale d’un mail (envoyé ou recu)
la taille maximale d’une boite email
le volume (poids/nbre) de mails reçus par heure.
Pour la taille d’un message on trouve 1 point de controle :
message_size_limit = 50240000 par defaut = 50 Mo
La taille maximale d’une boite email est gérée par dovecot et le plugin quota. Le quota est parametrable dans postfixadmin.
Le volume des mails envoyés est controlé par policyd.
dans notre configuration, et meme si TOUS les messages sont controlés, seul les expediteurs des messages sont pris en compte par ce controle. Ils peuvent etre des users de nos domaines qui envoient vers leurs domaines ou vers l’exterieur, mais cela peut etre aussi un expediteur externe qui envoient vers votre domaine.
Par défaut les paramètres sont les suivants :
Pour modifier globalement il faut changer les paramètres dans l’interface policyd
pour mieux comprendre le fonctionnement de postfix on pourra consulter :
Un article très complet sur le sujet, écrit par Jim Seymour.
En bas du présent article on trouvera 2 présentations (slides) des possibilités de filtrage et de configuration de postfix. Elles ont été realisées par Patrick Koetter & Ralf Hildebrandt.
document du site http://www.arschkrebs.de/ donnant une vue d’ensemble de possibilité Antispam de postfix.
document du site http://www.arschkrebs.de/ donnant une vue d’ensemble de la configuration de postfix.
2 Messages