Postfix est un outil particulirement modulaire, et que l'on peut facilement paramtrer pour mettre en place une politique anti-spam. Depuis la version 2.1 il est de plus dotde la fonctionnalit“policy-server” qui lui permet de prendre une dcision rapide ds le dbut de la connexion, permettant de renvoyer un 4xx ou un 5xx sur des critres comme l'IP, le from et le to. Les versions binaires sont disponibles sur http://postfix.wl0.org/en/. La version 2.2, trs rcente, est capable grce au module anvil de limiter la cadence d'expdition des mails.
Afin dviter l'utilisation par les spammeurs de nos serveurs, des techniques intgres dans Postfix sont utilises. On se doit de crer un fichier mynetwork qui contient les adresses IP des rseaux internes. Les protections sont ensuite vrifies par un telnet relay-test.mail-abuse.org depuis le serveur smtp frontal.
Le fichier /etc/postfix/main.cf (pour la partie antispam) de postfix a alors la tte suivante
mynetworks = /etc/postfix/network_table
mynetworks_style = subnet
smtpd_recipient_restrictions =
permit_mynetworks
reject_unauth_destination
permit
Le contenu du fichier network_table contient lui quelque chose comme
10.0.0.0/8 192.168.0.0/16
On pourra, avec profit, se reporterhttp://x.guimard.free.fr/postfix/index.php?page=SMTPD_ACCESS_README.html Il estnoter que de trs nombreux tests de rejet sont disponibles dans Postfix (voir l'url ci-dessus). Mais ces tests sont parfois trop agressifs. On peut tester quasiment n'importe quoin'importe quel moment, y compris avec des RBL, des expressions rgulires, des fichiers, des hash, des reverse dns, etc.
Le greylisting s'applique grcela notion de policy-server. Afin de pallier au problme des domaines incompatibles avec le greylisting, on cre un fichier whitelisted_domains qui les exclus du greylisting. Le fichier /etc/postfix/main.cf (pour la partie antispam) de postfix a alors la tte suivante
De plus pour les installer il faut insrer dans /etc/postfix/master.cf
greylist unix - n n - - spawn user=nobody argv=/usr/bin/perl /usr/libexec/postfix/extra/greylist.pl whitelist unix - n n - - spawn user=nobody argv=/usr/bin/perl /usr/libexec/postfix/extra/whitelist.pl
Des outils qui permettent de mettre en place le greylisting sont disponibles sur http://cri.univ-tlse1.fr/documentations/spam/outils/
perl -MCPAN -e 'install DB_File'
perl -MCPAN -e 'install DB_File::Lock'
Le blacklisting est une mthode efficace pour bloquer les spams. Plusieurs listes publiques sont disponibles et permettent de rejeter les mails qui proviennent d'expditeurs spammeurs. Toujours dans notre optique de limitation des effets, nous avons mis en place un taggage des mails suivant le rsultat des blacklists. Mais une simple modification du programme suffitrendre le programme “nergique”.
Pour les installer il faut insrer dans /etc/postfix/master.cf
rbl unix - n n - - spawn user=nobody argv=/usr/bin/perl /usr/libexec/postfix/extra/rbl.pl greylist unix - n n - - spawn user=nobody argv=/usr/bin/perl /usr/libexec/postfix/extra/greylist.pl whitelist unix - n n - - spawn user=nobody argv=/usr/bin/perl /usr/libexec/postfix/extra/whitelist.pl
Mais cela ne suffit pas, car nous souhaitons taguer tout message qui arrive. Pour cela nous crons une classe de restriction SMTP appele OK_AND_PREPEND qui va nous permettre d'accepter des messages, mais d'ajouter un renseignement complmentaires sur les rsultats de divers tests. La liste des RBL utilises est directement intgre dans le script.
Le fichier /etc/postfix/main.cf (pour la partie antispam) de postfix a alors la tte suivante
mynetworks = /etc/postfix/network_table
mynetworks_style = subnet
smtpd_recipient_restrictions =
permit_mynetworks
reject_unauth_destination
check_policy_service unix:private/whitelist
check_policy_service unix:private/greylist
permit
smtpd_restriction_classes = OK_AND_PREPEND
OK_AND_PREPEND =
check_policy_service unix:private/rbl
permit
Pour un exemple de dveloppement :
Ils permettent de vrifier que la machine qui envoie le message est autorisele faire avec l'identitqu'elle prtend ( exemple seuls les serveurs hotmail.com sont autorissenvoyer du @hotmail.com). Plusieurs dispositifs sont connus pour le faire. SPF et DomainsKey. Notre outil ne gre que SPF. Pour le mettre en place il faut insrer dans /etc/postfix/master.cf
spf unix - n n - - spawn user=nobody argv=/usr/bin/perl /usr/libexec/postfix/extra/spf.pl rbl unix - n n - - spawn user=nobody argv=/usr/bin/perl /usr/libexec/postfix/extra/rbl.pl greylist unix - n n - - spawn user=nobody argv=/usr/bin/perl /usr/libexec/postfix/extra/greylist.pl whitelist unix - n n - - spawn user=nobody argv=/usr/bin/perl /usr/libexec/postfix/extra/whitelist.pl
Nous compltons ensuite la classe OK_AND_PREPEND. Contenu de main.cf
En plus de la protection anti-spam nous en avons profitpour tester la cadence dmission des postes locauxl'aide d'un autre script. Celui -ci va vrifier qu'un poste ne prend pas plus de 5 identits d'expditeurs par 10 minutes) Pour installer cette protection il faut insrer dans master.cf
mynetwork unix - n n - - spawn user=nobody argv=/usr/bin/perl /usr/libexec/postfix/extra/mynetwork.pl spf unix - n n - - spawn user=nobody argv=/usr/bin/perl /usr/libexec/postfix/extra/spf.pl rbl unix - n n - - spawn user=nobody argv=/usr/bin/perl /usr/libexec/postfix/extra/rbl.pl greylist unix - n n - - spawn user=nobody argv=/usr/bin/perl /usr/libexec/postfix/extra/greylist.pl whitelist unix - n n - - spawn user=nobody argv=/usr/bin/perl /usr/libexec/postfix/extra/whitelist.pl
Nous ajoutons la classe MYNETWORK. Nouvelle version de main.cf:
mynetworks = /etc/postfix/network_table
mynetworks_style = subnet
smtpd_recipient_restrictions =
check_client_access hash:/etc/postfix/mynetwork
permit_mynetworks
reject_unauth_destination
check_policy_service unix:private/whitelist
check_policy_service unix:private/greylist
permit
smtpd_restriction_classes = OK_AND_PREPEND,MYNETWORK
OK_AND_PREPEND =
check_policy_service unix:private/spf
check_policy_service unix:private/rbl
permit
MYNETWORK =
check_policy_service unix:private/mynetwork
permit
127.0.0.1 OK
193.49.48.250 OK 193.49.48.247 OK 194.254.254.31 OK 192.93.172 MYNETWORK 193.49.48 MYNETWORK 193.49.50 MYNETWORK 193.49.51 MYNETWORK 193.49.52 MYNETWORK 193.49.53 MYNETWORK 193.49.54 MYNETWORK 193.49.55 MYNETWORK 193.49.58 MYNETWORK 194.254.254 MYNETWORK 194.254.255 MYNETWORK 195.83.197 MYNETWORK 10 MYNETWORK 192.168 MYNETWORK
Les virus sont parfois trop rapides pour les antivirus : 4 heures pour la misedisposition d'une signature (et parfois bien plus). C'est pour cela qu'il peuttre intressant de bloquer ou de retarder les annexes connues pour leur utilisation virales. Toujours selon notre politique, nous nous contentons de mettre en quarantaine les mails avec ce type d'annexes, puis nous les ressortons au bout de 6 heures. On commence par modifier le fichier /etc/postfix/header_checks en lui ajoutant la ligne suivante.
/^content-(type|disposition):.*name[[:space:]]*=.*\.(com|cpl|scr|vbe|vbs|pif|hta|shs|vxd|wsh|lnk|shm|shb)/ HOLD Attachement Type Not Allowed. Annexe de type non autorise
Il faut ensuite utiliser la possibilite de check de PostFix dans /etc/postfix/main.cf
header_checks = regexp:/etc/postfix/header_checks
Le script release_hold_mail.sh tournant toutes les heures va vrifier les mails en quarantaine et les relancer au bout de 6 heures.
#!/bin/sh # # On passe en langue anglaise, car les dates sont en anglais # LANG=us_GB # # On prend le jour, le mois et l'heure il y a 6 heures # date_recherchee=`date --date '6 hours ago' +'%a %b %e %H'` # # On recherche les mails en hold qui (dont le code se termine par # un "!") puis on recherche ceux dont l'heure est gale # date_recherche, on enlve le point d'exclamation, et on envoi # le tout postsuper pour qu'il les "sorte" du HOLD. # /usr/sbin/postqueue -p|egrep '^([0-9A-F]{10}\!)'|grep "$date_recherchee"|awk '{print $1}'|sed 's/!//'|/usr/sbin/postsuper -H - # # On release aprs un sleep de 30 secondes, les mails de la veille # # sleep 30 # # On prend le jour et le mois il y a 1 jour (en cas de ppin lors du # release normal # date_recherchee=`date --date '1 days ago' +'%a %b %e'` /usr/sbin/postqueue -p|egrep '^([0-9A-F]{10}\!)'|grep "$date_recherchee"|awk '{print $1}'|sed 's/!//'|/usr/sbin/postsuper -H -