I) Introduction :
Dans cette documentation nous allons apprendre
à mettre en place un antivirus et un antispam directement sur le serveur MTA. Ceci permet d’une part de traiter le plus tôt possible les messages incriminés et d’autre part, cela permet à tous les clients du système de messagerie d’être protégés.
L’installation de ces services se fera sur
une distribution Debian Sarge (Debian 3.1) avec les logiciels suivants :
- Postfix 2.1.3
- Clamav 0.75.1
- Spamassassin 2.64
- Pyzor 0.4.0.0
- Amavisd-new 20030616p10-3
- Procmail 3.22
Sous Debian Sarge, les noms des paquets à installer une fois Postfix configuré sont :
spamassassin pyzor amavisd-new procmail clamav-base clamav-daemon clamav-freshclam
II) RBL et tri des pièces jointes douteuses :
Les RBL, Realtime Black List, sont des listes
noires d’adresses IP ou de domaines bannis car connus comme étant à l’origine de spams ou permettant l’envoi de spams (Exemple : serveur SMTP acceptant de relayer les mails
de quiconque (OpenRelay)).
Pour indiquer à Postfix de prendre en compte les RBLs de votre choix, il faut ajouter les
lignes suivantes au fichier /etc/postfix/main.cf :
smtpd_client_restrictions = reject_rbl_client rbl-plus.mail-abuse.org reject_rbl_client bl.spamcop.net reject_rbl_client will-spam-for-food.eu.org reject_rbl_client relays.mail-abuse.org reject_rbl_client blackholes.mail-abuse.org reject_rbl_client relays.visi.com reject_rbl_client wingate.opm.blitzed.org reject_rbl_client korea.rominet.net reject_rbl_client china.rominet.net reject_rbl_client taiwan.rominet.net reject_rbl_client hong-kong.rominet.net smtpd_sender_restrictions = reject_rbl_client rbl-plus.mail-abuse.org reject_rbl_client bl.spamcop.net reject_rbl_client will-spam-for-food.eu.org reject_rbl_client relays.mail-abuse.org reject_rbl_client blackholes.mail-abuse.org reject_rbl_client relays.visi.com reject_rbl_client wingate.opm.blitzed.org reject_rbl_client korea.rominet.net reject_rbl_client china.rominet.net reject_rbl_client taiwan.rominet.net reject_rbl_client hong-kong.rominet.net
Il est également possible de sécuriser ce qui va atterir dans la boite aux lettres de vos
utilisateurs en faisant le tri dans les pièces jointes que vous seriez susceptibles de recevoir.
Des fichiers exe com reg src et compagine n’ont rien à faire en pièce jointe.
Ligne à rajouter dans /etc/postfix/main.cf :
mime_header_checks = regexp:/etc/postfix/mime_header_checks
Et ce fichier que vous adapterez à votre convenance doit contenir quelque chose du genre :
/filename="?.*.(bat|com|pif|vb|exe|lnk|scr|reg|chm|wsh|js|inf|shs|job|ini| shb|scp|scf|wsc|sct|dll|msc|msi|ppt|pps|mdb|rar|bmp|wav|mpg|mpeg|wma|wmv)/ REJECT
/^Content-(Disposition|Type):.*(file)?name="?.*.(bat|com|pif|vb|exe|lnk|scr|reg|chm|wsh|js|inf| shs|job|ini|shb|scp|scf|wsc|sct|dll|msc|msi|ppt|pps|mdb|rar|bmp|wav|wma|wmv)/ REJECT Extension de fichier joint refusée. Les différentes possibilités pour que votre message soit refusé sont les suivantes : 1) le type de fichier que vous tentez d'envoyer est souvent vecteur de virus. Mon serveur n'a pas de temps CPU à perdre à traiter des fichiers vérolés, à vous de vous arranger 2) Le format de fichier n'est pas compressé, ma bande passante n'est pas illimitée. 3) Le format de fichier joint est un format propriétaire et non documenté. Utilisez des logiciels vous garantissant votre liberté. Si aucune de ces conditions ne vous convient, et bien vos doléances ne m'interressent pas. A bon entendeur salut!
III) Configuration de Pyzor :
Pyzor est une implémentation du « Rasoir de Vipul ». C’est une solution de détection distribuée basée sur un travail collaboration. À chaque réception d’un nouveau mail, Pyzor va calculer un checksum sur ce mail et le comparer à la base de données. Si ce checksum correspond à une signature connue alors le mail est traité comme du spam.
Afin d’initialiser la base de données de spams de Pyzor, il est nécessaire de lancer la commande suivante en étant connecté sous l’utilisateur amavis (par exemple en faisant su – amavis en root) dès l’installation de Pyzor achevée
moe:~# pyzor discover
downloading servers from http://pyzor.sourceforge.net/cgi-bin/inform-servers-0-3-x
Ensuite, un simple Cron suffira à mettre à jour la base de données de Pyzor. J’ai
souhaité que les mises à jour se fassent tous les jours à 3H. Pour ceci, tapez :
crontab -e
Et ajoutez :
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/opt/bin
03 * * */usr/bin/pyzor discover >/dev/null 2>&1
IV) Configuration de SpamAssassin :
La configuration de Spamassassin requiert peu
de temps. Sous Debian il faut tout d’abord ajuster la variable ENABLED à 1 afin
que SpamAssassin se lance en démon dans le fichier /etc/default/spamassassin (Il peut
aussi être appelé depuis la ligne de commande).
Enfin nous allons configurer le fichier /etc/spamassassin/local.cf :
SpamAssassin attribue des points à chaque message qu’il traite. Plus un mail a un score élevé, plus il a de chance d’être un Spam. Nous considérerons qu’un mail est un spam à partir d’un score supérieur ou égal à 5 :
required_hits 5.0
La marque [SPAM] est ajouté au sujet de chaque message considéré comme du spam.
rewrite_subject 1
subject_tag [SPAM]
Langues pour lesquelles ont s’attend à recevoir du courrier. Les autres langues seront
pénalisées :
ok_language fr en
On active les filtres bayésiens et l’autoapprentissage :
use_bayes 1
auto_learn 1
J’active l’utilisation de Pyzor :
use_razor2 0
use_dcc 0
use_pyzor 1
On peut attribuer certains scores sur certains critères manuellement.
Se référer à la documentatino de SpamAssassin pour plus de détails :
scoreFORGED_HOTMAIL_RCVD3.000
scoreFORGED_DCVD_FOUND3.000
scoreMISSING_OUTLOOK_NAME3.000
Enfin, Pour éviter de pénaliser les Mailing Lists, je définis que certaines sources ne sont pas émetrices de spam :
whitelist_from@vger.kernel.org
whitelist_from@freedesktop.org
whitelist_from@kde.org
whitelist_from@lists.debian.org
V) Configuration de ClamAV :
Rien de spécial à configurer ici. J’ai conservé la configuration par défaut de la Debian donnée ci-dessous. J’ai précisé à freshclam
qui’il devait récupérer les mises à jour antivirales depuis db.fr.clamav.net.
Notez que pour que le scan des archives soit opérationnel, vous devez impérativement installer les outils adéquats : unzip, unrar, unarj, bzip2, gzip etc…
/etc/clamav/clamav.conf :
LocalSocket /var/run/clamav/clamd.ctl FixStaleSocket User amavis AllowSupplementaryGroups ScanMail ScanArchive ArchiveMaxRecursion 5 ArchiveMaxFiles 1000 ArchiveMaxFileSize 10M ReadTimeout 180 MaxThreads 12 MaxConnectionQueueLength 15 StreamSaveToDisk LogFile /var/log/clamav/clamav.log LogTime LogFileMaxSize 0 PidFile /var/run/clamav/clamd.pid DatabaseDirectory /var/lib/clamav/ SelfCheck 3600
/etc/clamav/freshclam.conf :
DatabaseOwner clamav UpdateLogFile /var/log/clamav/freshclam.log LogFileMaxSize 0 MaxAttempts 5 # Vérification de la présence d'une mise à jour 12 fois par jour : Checks 12 DatabaseMirror db.fr.clamav.net DatabaseDirectory /var/lib/clamav/ NotifyClamd
VI) Interface avec le MTA : Amavis
Amavis permets d’interfacer un MTA, ici Postfix
avec un antivirus (une bonne dizaines d’antivirus libres et propriétaires sont gérés) éventuellement avec SpamAssassin. Bien entendu nous verrons l’interfaçage avec ces
deux éléments.
De plus, Amavis gère le comportement du système lorsqu’il détecte
un virus ou un spam.
1) Interfaçage avec Postfix :
Si Amavis est correctement configuré et lancé, vous devriez pouvoir vous connecter
en telnet sur le port 10024 :
# telnet localhost 10024 Trying 127.0.0.1... Connected to localhost.localdomain. Escape character is '^]'. 220 [127.0.0.1] ESMTP amavisd-new service ready quit 221 2.0.0 [127.0.0.1] (amavisd) closing transmission channel Connection closed by foreign host.
Ensuite, il faut dire à Postfix comment communiquer avec Amavis. Dans le fichier
/etc/postfix/master.cf, rajoutez :
smtp-amavis unix - - n - 2 smtp -o smtp_data_done_timeout=1200 -o smtp_send_xforward_command=yes -o disable_dns_lookups=yes 127.0.0.1:10025 inet n - n - - smtpd -o content_filter= -o local_recipient_maps= -o relay_recipient_maps= -o smtpd_restriction_classes= -o smtpd_client_restrictions= -o smtpd_helo_restrictions= -o smtpd_sender_restrictions= -o smtpd_recipient_restrictions=permit_mynetworks,reject -o mynetworks=127.0.0.0/8 -o strict_rfc821_envelopes=yes -o smtpd_error_sleep_time=0 -o smtpd_soft_error_limit=1001 -o smtpd_hard_error_limit=1000
Maintenant que ceci est en place, rechargez Postfix en tapant
postfix reload
et nous allons pouvoir vérifier si la communication entre les différents démons s’effectue
normalement :
moe:/etc/postfix# telnet localhost 10025 Trying 127.0.0.1... Connected to localhost.localdomain. Escape character is '^]'. 220 krusty.momonux.org ESMTP Postfix (Debian/GNU) quit 221 Bye Connection closed by foreign host.
Pour le moment, tout va bien mais ce n’est pas suffisant. Nous allons simuler l’envoi
d’un message au travers d’Amavis :
moe:/etc/postfix# telnet localhost 10024 Trying 127.0.0.1... Connected to localhost.localdomain. Escape character is '^]'. 220 [127.0.0.1] ESMTP amavisd-new service ready MAIL FROM: foo@momonux.org 250 2.1.0 Sender foo@momonux.org OK RCPT TO: bar@momonux.org 250 2.1.5 Recipient bar@momonux.org OK DATA 354 End data with. Subject: Test Ceci est un test. . 250 2.6.0 Ok, id=28397-02, from MTA: 250 Ok: queued as 7402CFA5
Et maintenant, le même test sauf que que le corps du message sera une empreinte
de virus afin d’observer le comportement d’Amavis. Vous devriez obtenir quelque chose
de similaire :
moe:/etc/postfix# telnet localhost 10024 Trying 127.0.0.1... Connected to localhost.localdomain. Escape character is '^]'. 220 [127.0.0.1] ESMTP amavisd-new service ready MAIL FROM: foo@momonux.org 250 2.1.0 Sender foo@momonux.org OK RCPT TO: bar@momonux.org 250 2.1.5 Recipient bar@momonux.org OK DATA 354 End data with. Subject: Test avec un empreinte de virus X5O!P%@AP[4PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H* . 550 5.7.1 Message content rejected, id=16968-01 - VIRUS: EICAR-AV-Test 250 2.5.0 Ok, but 1 BOUNCE 250 2.7.1 Ok, discarded, id=16984-01 - VIRUS: EICAR-AV-Test 250 2.6.0 Ok, id=17041-01, from MTA: 250 Ok: queued as 3F1841A5F5
2) Configuration d’Amavis :
Désormais, Postfix et Amavis savent communiquer.
C’est une bonne nouvelle mais on en a toujours pas fini avec Amavis pour autant. Maitenant il faut dire à Amavis ce qu’il aura exactement à faire et comment il le fera. Vous noterez que le fichier de configuration d’Amavis, /etc/amavis/amavisd.conf, est
très bien commenté. Par conséquent, si vous connaissez l’anglais pour pourrez jouer
facilement avec tout les réglages possibles. Vous noterez que Amavis écrase
certains réglages que nous avons défini pour SpamAssassin.
Voici les points importants de la configuration d’Amavis :
Réglages pour la comunication avec Postfix :
$mydomain = 'momonux.org'; $forward_method = 'smtp:127.0.0.1:10025'; $notify_method = $forward_method;
Ces deux lignes doivent être impérativement commentées pour que l’antivirus et l’antispam soient appelés :
# @bypass_virus_checks_acl = qw( . ); # @bypass_spam_checks_acl = qw( . );
Sort que l’on réserve aux messages. Les valeurs possibles sont :
D_PASS : Le message est délivré quel qu’en soit son contenu.
D_DISCARD : Le message infecté n’est pas délivré et aucune notification n’est émise.
D_BOUNCE : Le message n’est pas délivré mais on en averti l’expéditeur.
D_REJECT : Le message n’est pas délivré et de préférence il faut avertir l’expéditeur.
$final_virus_destiny = D_BOUNCE; # Sort réservé aux virus. $final_banned_destiny = D_BOUNCE; $final_spam_destiny = D_PASS; # Sort réservé aux spams. $final_bad_header_destiny = D_PASS;
Liste d’expéditeurs sûrs :
map { $whitelist_sender{lc($_)}=1 } (qw(
toto@toto.com
foo@foo.com
bar@bar.com
));
Comportement de SpamAssassin :
$sa_tag_level_deflt = 0.0; # On marque dès un score de 0 pour être certain que chaque message sera marqué. $sa_tag2_level_deflt = 5.0; # On ajoute la marque X-Spam-Flag: YES à ce score. $sa_kill_level_deflt = 100.0; # Score à partir duquel un spam sera effacé. 100 car je veux qu'il y ai peu de chances que les spams soient supprimés. $sa_spam_subject_tag = '[SPAM]'; # On ajoute [SPAM] au sujet $sa_spam_modifies_subj = 1; #
La variable @av_scanners doit comporter :
['Clam Antivirus-clamd',
&ask_daemon, ["CONTSCAN {}n", "/var/run/clamav/clamd.ctl"],
qr/bOK$/, qr/bFOUND$/,
qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ],
Ensuite il faut permettre à clamav d’écrire dans /var/lib/amavis, dans le cas contraire vous rencontreriez cette erreur :
amavis[677]: (00677-01) Clam Antivirus-clamd FAILED - unknown status: /var/lib/amavis/amavis-20040717T011641-00677/parts: Can't access the file ERRORn
Ajoutez simplement clamav au groupe amavis :
adduser clamav amavis
VII) Traiter les messages infectés avec Procmail :
Sur mon serveur, le serveur IMAP est Courier-Imap.
J’ai créé pour chaque compte un dossier IMAP virus et un autre dossier IMAP spams. J’ai
configuré mon serveur de telle sorte que Postfix transmette les messages à délivrer à Procmail,
qui les remettra dans la boite aux lettres du récepteur.
Cependant, Procmail effectue un tri et les messages classés comme
spam sont rangés dans le dossier du même nom et même chose pour les virus.
Pour Postfix j’ai du rajouter deux lignes dans le fichier main.cf pour utiliser procmail :
mailbox_command = procmail -a "${extension}" home_mailbox = Maildir/
Et voila le /etc/procmailrc qui va bien pour le tri des messages :
DEFAULT=$HOME/Maildir/new MAILDIR=$HOME/Maildir/ VERBOSE=yes DROPPRIVS=yes #Filtrage des Spams :0: * ^X-Spam-Level: ***** .spams/ :0: * ^Subject:.*VIRUS* .virus/
VIII) Conclusion :
La protection d’un serveur contre les virus et
les spams est assez fastidieuse mais cela reste bien moins pénible que de recevoir spams et virus. Bien que n’utilisant que Linux, je reçois beaucoup de virus Windows et un antivirus n’est pas inutile. Un système de ce type en place devrait grandement améliorer votre confort et celui de vos utilisateurs face à l’utilisation du mail.