Postfix : lutte contre les virus et les spams

Posted by

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.

Leave a Reply

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.