Cette solution concerne les serveur mail devant héberger plusieurs domaines différents. Il sert à la connexion des clients mail (thunderbird, outlook, ....) ou au webmail.

Cette technique utilise des boites mails virtuelles c'est à dire que les utilisateurs n'ont pas de comptes systèmes sur le serveur, pour l'authentification , la définitions du répertoire de stockage des mails , ... en un mot la gestion des utilisateurs et des mails se fait via une base de données ici Mysql

Pré-requis :

connaitre vi ou alors utiliser un éditeur de texte propre par ex :emacs (qui ne rajoute pas de caractère en fin de ligne)
un server mysql 5.0 ou 5.1 fonctionnel et correctement configuré (si c'est un autre machine que le futur compte postfix soit autorisé quand il est éxécuté à partir du serveur de mail, que ce compte n'accède uniquement à sa base postfix, idem pour lecompte dspam pour la base dspam, ainsi que spam pour la base spam)
Avoir comme système d'exploitation linux (debian utilisé ici mais une autre distribution est valide)
Avoir des noms de domaines valides
Avoir configuré correctement les MX au niveau du server DNS
Postfix / Mysql :

Rappel : le server de base de données mysql est sur un autre server et est fonctionnel.
Installation des packages debian sur le futur serveur de mail (je suppose que ssh , vim sont installés et configuré à votre convenance) la commande :
apt-get install postfix postfix-mysql mysql-client-5.1 courier-imap courier-imap-ssl courier-authdaemon courier-authlib-mysql libsasl2-2 libsasl2-modules sasl2-bin libpam-mysql openssl ntpdate fam tmpreaper whois
Connectez vous en ssh sur le server distant, puis avec la commande créez la base de données postfix: mysqladmin -h localhost -u root -p create postfix' (mettre le mot de passe à l'invitation : Enter password: ).
Créez l'utilisateur ""postfix"" ayant tous les droits sur la base de données ""postfix"" avec la commande : mysql -h localhost -u root -p (mettre le mot de passe à l'invitation : Enter password: ) , puis GRANT ALL PRIVILEGES ON postfix. TO ""postfix""@""nom_server_mail"" IDENTIFIED BY 'votre_mot_de_passe';
Créez les 3 tables suivantes :
Table domain :


Stockage des domaines hébergés sur le server.

CREATE TABLE domain (
domain varchar(255) NOT NULL default '',
description varchar(255) NOT NULL default '' ,
aliases int(10) NOT NULL default '0',
mailboxes int(10) NOT NULL default '0',
maxquota int(10) NOT NULL default '0',
quota int(10) NOT NULL default '0',
transport varchar(255) default NULL ,
backupmx tinyint(1) NOT NULL default '0',
created datetime NOT NULL default '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint(1) NOT NULL default '1',
PRIMARY KEY (domain)
) TYPE=MyISAM COMMENT='Postfix Admin - Virtual Domains';

Table mailbox :


Stockage des noms de boites aux lettres avec leur mot de passe associé.

 

CREATE TABLE mailbox (
username varchar(255) NOT NULL default '' ,
password varchar(255) NOT NULL default '',
name varchar(255) NOT NULL default '',
maildir varchar(255) NOT NULL default '' ,
quota varchar(20) NOT NULL default '0',
domain varchar(255) NOT NULL default ,
created datetime NOT NULL default '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint(1) NOT NULL default '1',
PRIMARY KEY (username)
) TYPE=MyISAM COMMENT='Postfix Admin - Virtual Mailboxes';

Table alias :


Stockage des alias pour 'router' les mails sur une autre boite au lettre interne ou externe des domaines hébergés.

 

CREATE TABLE alias (
address varchar(255) NOT NULL default '' ,
goto text NOT NULL default '' ,
domain varchar(255) NOT NULL default '' ,
created datetime NOT NULL default '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint(1) NOT NULL default '1',
PRIMARY KEY (address)
) TYPE=MyISAM COMMENT='Postfix Admin - Virtual Aliases';

Récupération des scripts de création des tables :

tables.zip

Exemple :


Voici un exemple de requête sql pour créer un domaine, une boite au lettre, un alias.
Pour créer les mot de passe des utilisateur utilisez la commande mkpasswd -5

Création du domaine exemple.com :
INSERT INTO domain (domain,description) VALUES ('exemple.com','Domaine exemple');
Création de la boite au lettre de l'utilisateur toto avec le mot de passe secret:
INSERT INTO mailbox (username,password,name,maildir,domain) VALUES (Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.','$1$caea3837$gPafod/Do/8Jj5M9HehhM.','Mailbox de l\'utilisateur toto',Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser./','exemple.com');

Création de l'alias root vers la boite au lettre de toto :
INSERT INTO alias (address,goto,domain) VALUES (Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.', Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.','exemple.com');
Création de l'alias titi vers une boite au lettre externe par exemple Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser. :
INSERT INTO alias (address,goto,domain) VALUES (Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.', Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.','yahoo.fr');

Configuration basique de Postfix :

La configuration de postfix se fait via 2 fichiers : main.cf et master.cf. On va remplacer le contenu du fichier main.cf, puis modifier une ligne de master.cf en rajoutant 2 options.
Remplacement de main.cf par :
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
append_dot_mydomain = no
myhostname = mail.example.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = t2.example.com
mydestination = localhost.localdomain, localhost
mynetworks = 127.0.0.1, localhost
mailbox_command = /usr/bin/procmail -a ""$EXTENSION""
mailbox_size_limit = 0
recipient_delimiter = +
best_mx_transport = local
local_transport = local
home_mailbox = Maildir/
notify_classes = 2bounce, bounce, delay, policy, protocol, resource, software
masquerade_domains = t2.example.com
smtpd_helo_required = yes
strict_rfc821_envelopes = yes
virtual_alias_maps = proxy:mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_gid_maps = static:20001
virtual_mailbox_base = /home/virtual
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_limit = 51200000
virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_minimum_uid = 20001
virtual_uid_maps = static:20001
proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains
$relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps
$mynetworks $smtpd_recipient_restrictions $smtpd_sender_login_maps

message_size_limit = 50240000
smtpd_recipient_restrictions =
permit_mynetworks,
reject_unauth_destination,
permit
smtpd_data_restrictions =
reject_unauth_pipelining,
permit
Modification du fichier master.cf :
Remplacer :
pickup fifo n - - 60 1 pickup
par :
pickup fifo n - - 60 1 pickup
-o receive_override_options=no_header_body_checks
-o content_filter=
Création du répertoire hébergeant les mails :
mkdir /home/virtual
Création de l'utilisateur et groupe système vmail ayant comme uid et gid 2001 :
groupadd -g 20001 vmail
useradd -g vmail -u 20001 vmail -d /home/vmail -m
On sécurise :
chown -R vmail: /home/virtual
chmod -R 770 /home/virtual
Création des fichiers permettant à postfix d'interroger la base de données :
/etc/postfix/mysql_virtual_alias_maps.cf

user = postfix
password = ****
hosts = localhost
dbname = postfix
query = SELECT goto FROM alias WHERE address='%s' and active = '1'
/etc/postfix/mysql_virtual_domains_maps.cf

user = postfix
password = ****
hosts = localhost
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%s' and active = '1'

/etc/postfix/mysql_virtual_mailbox_maps.cf

user = postfix
password = ****
hosts = localhost
dbname = postfix
query = SELECT maildir FROM mailbox WHERE username='%s' and active = '1'

On utilise dropmail comme mail delivery agent (MDA) : agent qui dépose les mails dans les boites, cet agent doit pouvoir communiquer avec la base de donnée, et gérer les quotas. Les outils de compilations doivent être présents sur le server, car on ne va pas utiliser le package de la distribution. On installe ces packages avec la commande : apt-get install bzip2 gcc libpcre3-dev libpcre++-dev courier-authlib-dev g++ libtool libmysqlclient15-dev make libssl-dev
Récupération de 'maildrop' :
La dernière version de maildrop au 29/03/2010 est la 2.4.3, utiliser la commande wget pour télécharger la bonne version. Aller sur le site pour vérifier la dernière version : http://sourceforge.net/projects/courier/files/ ; placer vous dans le répertoire de votre choix pour télécharger les sources wget http://heanet.dl.sourceforge.net/sourceforge/courier/maildrop-version.tar.bz2 .
Décompression des sources avec la commande tar -xvjf maildrop-version.tar.bz2
Compilation :
Se placer dans le répertoire decompressé : cd maildrop-version
Préparation à la compilation :
Tapez la commande : ./configure -prefix=/usr/local/courier --with-etcdir=directory=/etc/courier --enable-maildrop-uid=20001 --enable-maildrop-gid=20001 --enable-maildirquota --without-db
Cette commande est longue et peut durer plusieurs minutes.
la compilation à proprement parlé :
Tapez la commande : make
L'installation :
Tapez la commande : make install
En post-install, faut attribuer les bonnes appartenance et permission :
chown vmail: /usr/local/courier/bin/*
chmod 775 /var/run/courier/
chmod 775 /var/run/courier/authdaemon/
Vérification de la bonne installation de maildrop :
Tapez la commande : /usr/local/courier/bin/maildrop -v
maildrop 2.4.2 Copyright 1998-2005 Double Precision, Inc.
Courier Authentication Library extension enabled.
Maildir quota extension are now always enabled.
This program is distributed under the terms of the GNU General Public
License. See COPYING for additional information.

La configuration de maildrop se fait via les fichiers /etc/courier/authmysqlrc et /etc/courier/authdaemonrc:
authmysqlrc :


Il faut faire très attention à la syntaxe de ce fichier et bien mettre un tab entre le paramètre et sa valeur. Il ne doit y avoir aucun espace à la fin d’un paramètre. La moindre erreur entraine le dysfonctionnement de l’authentification.

MYSQL_SERVER nom_du_server_mysql
MYSQL_USERNAME postfix
MYSQL_PASSWORD mot_de_passe_de connexion_au_server_mysql
#MYSQL_SOCKET /var/run/mysqld/mysqld.sock # valide uniquement si le server mysql est local
MYSQL_PORT 3306
MYSQL_OPT 0
MYSQL_DATABASE postfix
MYSQL_USER_TABLE mailbox
MYSQL_CRYPT_PWFIELD password
MYSQL_UID_FIELD '20001'
MYSQL_GID_FIELD '20001'
MYSQL_LOGIN_FIELD username
MYSQL_HOME_FIELD '/home/virtual'
MYSQL_NAME_FIELD name
MYSQL_MAILDIR_FIELD maildir
MYSQL_QUOTA_FIELD concat(quota,'S')
authdaemonrc :


remplacer authmodulelist=""authpam"" par authmodulelist=""authpam authmysql""

Intégration de maildrop dans postfix :
Cette intégration se fait au travers des 2 fichiers de configuration : /etc/postfix/main.cf et /etc/postfix/master.cf
Ajouter dans le fichier main.cf :

virtual_transport = maildrop
maildrop_destination_recipient_limit = 1
Remplacez dans le fichier master.cf :

Remplacer :

maildrop unix - n n - - pipe
flags=DRhu user=vmail argv=/usr/bin/maildrop -d ${recipient}
par :

maildrop unix - n n - - pipe
flags=DRhu user=vmail argv=/usr/local/courier/bin/maildrop -w 90 -d ${user}@${nexthop} ${extension} ${recipient} ${user} ${nexthop} ${sender}
Activer les logs et la création des répertoires des boites virtuelles, mais aussi créer des filtres globaux et personnel se fait via le fichier .mailfilter.
Pour que les règles s'applique au niveau global : pour toutes les boites hébergées il faut placer le fichier dans le répertoire /home/virtual/.
Pour que les règles s'applique au niveau individuelle il faut placer le fichier dans le répertoire /home/virtual/nom@domaine.
.mailfilter global:

logfile ""/home/virtual/.maildrop.log""
`[ -d $DEFAULT ] || (maildirmake $DEFAULT && maildirmake -f Spam $DEFAULT && maildirmake -f sent-mail $DEFAULT && maildirmake -f Spam.BlackList
$DEFAULT && maildirmake -f Spam.WhiteList $DEFAULT)`

`test -r $HOME/$DEFAULT.mailfilter`
if( $RETURNCODE == 0 )
{
log ""(==) Including $HOME/$DEFAULT.mailfilter""
exception {
include $HOME/$DEFAULT.mailfilter
}
}
Exemple d'un .mailfilter personnel:

#elimine les messages en provenance de l'adresse ci-dessous
if( \
/^From: .*actu@b\.linternaute\.com/:h \
)
exception {
to ""/dev/null""
}
#Place les mails en provenance des adresses ci-dessous dans le répertoire annonces
if( \
/^From: .*alerte@avendrealouer\.fr/:h \
|| /^From: .*mailing_pap@pap\.fr/:h \
|| /^Sender: .*alertemail@pap\.fr/:h \
)
exception {
to ""${DEFAULT}/.annonces/""
}
Sécurisation du fichier : chown vmail .mailfilter et chmod 600 .mailfilter

Redémarrage du démon d'authentification et de postfix :
/etc/init.d/courier-authdaemon restart

/etc/init.d/postfix restart

On test cette configuration de base :
authtest Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser., on doit avoir un résultat de la forme :

Authenticated: Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser. (uid 20001, gid 20001)
Home Directory: /home/virtual
Maildir: Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser./
Quota: 0S
Encrypted Password: $1$caea3837$gPafod/Do/8Jj5M9HehhM.
Cleartext Password: (none)
Options: (none)
En cas d'erreur, le fichier authmysqlrc est surement la cause vérifiez les log : tail /var/log/mail.log ou tail /var/log/mail.info
/usr/local/courier/bin/maildrop -V 7 -d Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser., on doit avoir un résultat de la forme :

maildrop: authlib: groupid=20001
maildrop: authlib: userid=20001
maildrop: authlib: logname=Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser., home=/home/virtual, mail=Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser./
maildrop: Changing to /home/virtual
Pour sortir, appuyez sur les touche ""Ctrl""+""C""
on envoie un mail à Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser. : mail Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser., dans les log ( tail /var/log) la présence de :

...status=sent (delivered via maildrop service)...
On teste avec la commande telnet en direct sur le port 25 (ce qu’il faut taper est précédé de --->, le reste c’est le retour du serveur) :

---> telnet localhost 25
220 [127.0.0.1] ESMTP Postfix
---> HELO localhost
250 [127.0.0.1]
---> MAIL FROM: <>
250 2.1.0 Sender OK
---> RCPT TO: <Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.>
250 2.1.5 OK
---> DATA
354 End data with <CR><LF>.<CR><LF>
---> .
250 2.0.0 Ok: queued as 079474CE44
---> QUIT
221 2.0.0 Bye
Connection closed by foreign host
On vérifie dans les logs

Courier-imap

Démarrez les démons : courier-authdaemon, courier-imap, courier-imap-ssl.
On teste la connexion depuis un client mail (outlook, thunderbird..)
Ne pas oublier de spécifier Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser. comme login de la boite et non ’toto’ tout seul.
On rappelle que le password est ’secret’.
Paramétrer le SMTP sans authentification pour le moment.
On doit pouvoir consulter les mail envoyés localement tout à l’heure.
On teste un envoi de mail depuis le client sur sa propre adresse. On vérifie les logs et l’arrivée du nouveau mail dans la boîte.

Sécurité

Sécurisation : authentification Sasl
Pour le moment Postfix utilise l’adresse IP du client qui se connecte pour déterminer si il peut relayer ou non les mails (ou accepter seulement des mails pour les users locaux).
Pour pouvoir utiliser son serveur mail depuis l’extérieur (cas des laptops) on doit permettre une authentification sécurisée.

On crée le fichier /etc/pam.d/smtp et on met les 2 lignes :
auth required pam_mysql.so user=postfix passwd=mot_de_passe host=nom_du_server_de_base_de_données db=postfix table=mailbox usercolumn=username passwdcolumn=password crypt=1 md5=1
account sufficient pam_mysql.so user=postfix passwd=mot_de_passe host=nom_du_server_de_base_de_données db=postfix table=mailbox usercolumn=username passwdcolumn=password crypt=1 md5=1

On sécurise le fichier :
chmod 640 /etc/pam.d/smtp

On crée le fichier /etc/postfix/sasl/smtpd.conf et on mets les 3 lignes :
pwcheck_method: saslauthd
#Attention selon la version de postfix pwcheck_method: saslauthd devra être changé par pwcheck_method: pam
mech_list: PLAIN LOGIN
log_level: 5
On édite le fichier /etc/default/saslauthd pour avoir :
START=yes
MECHANISMS=""pam""
OPTIONS=""-c -r -m /var/spool/postfix/var/run/saslauthd""
On crée le répertoire du socket et on lui donne les droits adaptés :
mkdir -p /var/spool/postfix/var/run/saslauthd
chown -R root:sasl /var/spool/postfix/var/
chmod 710 /var/spool/postfix/var/run/saslauthd
adduser postfix sasl
On crée un lien symbolique au cas où :
ln -s /var/spool/postfix/var/run/saslauthd /var/run/saslauthd

On ajoute ceci au /etc/postfix/main.cf :
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain =
broken_sasl_auth_clients = yes
smtpd_sasl_authenticated_header = yes
On ajoute également 'permit_sasl_authenticated' dans 'smtpd_recipient_restrictions' pour valider les restrictions (attention à bien placer le paramètre exactement à l’endroit indiqué) :
.....
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
......
On édite /etc/init.d/postfix, on recherche la variable FILES et on ajoute etc/postfix/sasl/smtpd.conf à la liste :
FILES=""etc/localtime etc/services etc/resolv.conf etc/hosts \
etc/nsswitch.conf etc/nss_mdns.config etc/postfix/sasl/smtpd.conf""
On redémarre Postfix et Saslauthd :
/etc/init.d/postfix restart
/etc/init.d/saslauthd restart

On vérifie que les paramètres sont bien passés au daemon Saslauthd :
ps waux | grep saslauthd

doit donner plusieurs lignes avec comme paramètres :
/usr/sbin/saslauthd -a pam -c -r -m /var/spool/postfix/var/run/saslauthd -n 5

Activation de TLS
Création du certificat SSL :
mkdir /etc/postfix/tls
cd /etc/postfix/tls
openssl genrsa -des3 -rand /etc/hosts -out smtpd.key 1024
openssl req -new -key smtpd.key -out smtpd.csr
Note : le paramètre le plus important est le Common Name qui doit être le nom de domaine de votre serveur de mail : exemple.com On laisse ""challenge password"" vide.
openssl x509 -req -days 3650 -in smtpd.csr -signkey smtpd.key -out smtpd.crt
openssl rsa -in smtpd.key -out smtpd.key.unencrypted
mv -f smtpd.key.unencrypted smtpd.key
openssl req -new -x509 -extensions v3_ca -keyout cakey.pem -out cacert.pem -days 3650

Sécurité sur les fichiers :
chmod 400 /etc/postfix/tls/*

Modification du fichier /etc/postfix/main.cf par l'ajout de :
smtp_tls_security_level = may
smtpd_tls_security_level = may
smtpd_tls_auth_only = yes
smtpd_tls_key_file = /etc/postfix/tls/smtpd.key
smtpd_tls_cert_file = /etc/postfix/tls/smtpd.crt
smtpd_tls_CAfile = /etc/postfix/tls/cacert.pem
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom
Redémarre de Postfix :
/etc/init.d/postfix restart

Vérification :
On la fait depuis un client mail configuré pour l’authentification SASL sur un chiffrement TLS avec les mêmes identifiants que pour la connection IMAP (ne pas oublier le @exemple.com).
Pour le type d’authentication, il faut sélectionner ""en clair"" (le terme dépend du client mail) ou laisser décoché ""Utiliser une authentification sécurisée"" pour Thunderbird 3.x.
C’est le chiffrage de la connection par le TLS qui sécurisera le transfert du password.
Note : la directive ""smtpd_tls_auth_only = yes"" impose l’usage d’une connection sécurisée pour l’authentification SASL, ce qui limitera les erreurs de configuration des utilisateurs.
Antispam - Antivirus
Paramétrage de Postfix
Une grande majorité des spams ne respectent pas les règles d’envoi d’email : HELO incorrect, MAILFROM d’un domaine inconnu, etc, etc...
Il est très fortement conseillé de lire des documents sur ce sujet, notamment les RFC pour bien comprendre le fonctionnement.
La première chose à faire est de renforcer Postfix pour qu’il soit beaucoup plus restrictif.
Pour cela on va utiliser les smtpd_recipient_restrictions.
On édite le fichier /etc/postfix/main.cf et on remplace tout le smtpd_recipient_restrictions par celui ci :
smtpd_recipient_restrictions =
reject_non_fqdn_recipient,
reject_unknown_sender_domain,
reject_non_fqdn_sender,
reject_unknown_recipient_domain,
reject_invalid_helo_hostname,
reject_unlisted_recipient,
reject_unlisted_sender,
permit_mynetworks,
permit_sasl_authenticated,
reject_non_fqdn_helo_hostname,
reject_unauth_destination,
check_client_access hash:/etc/postfix/internal_networks,
check_sender_access hash:/etc/postfix/not_our_domain_as_sender,
check_helo_access proxy:mysql:/etc/postfix/mysql-hello.cf,
check_sender_access proxy:mysql:/etc/postfix/mysql-sender.cf,
check_client_access proxy:mysql:/etc/postfix/mysql-client.cf,
reject_rbl_client list.dsbl.org,
reject_rbl_client zen.spamhaus.org,
permit
On a aussi paramétré des RBL (des blacklists) qui filtrent assez efficacement.
Ensuite il faut limiter les possibilités de forging des expéditeurs en vérifiant les MAIL FROM (adresses expéditrices).
Toujours dans le fichier /etc/postfix/main.cf, on place au dessus du bloc smtpd_recipient_restrictions = :
smtpd_sender_login_maps = proxy:mysql:/etc/postfix/mysql-sasl-sender-check.cf
smtpd_sender_restrictions =
reject_unknown_sender_domain,
reject_authenticated_sender_login_mismatch
smtpd_reject_unlisted_sender = yes
smtpd_restriction_classes =
has_our_domain_as_sender
has_our_domain_as_sender =
check_sender_access hash:/etc/postfix/our_domain_as_sender,
reject
De même les utilisateurs authentifiés par SASL seront tenus d’utiliser comme adresse email (MAIL FROM) un alias valide de leur mail principal.
Il faut maintenant créer les fichiers de lookup.
On crée le fichier /etc/postfix/internal_networks :
vim /etc/postfix/internal_networks.

on spécifie son réseau local et son adresse publique à l’intérieur. Cela permet de spécifier la ou les plages IP de notre réseau, qui seront autorisées à envoyer un mail avec nos domaines dans le MAIL FROM. Cela permet également de préciser les IP autorisées à envoyer un mail en se présentant avec notre HELO.
On bloque ainsi les clients SMTP extérieurs qui se présentent avec un HELO qui est le notre :
10.0.0 has_our_domain_as_sender
90.46.134.64 has_our_domain_as_sender
On postmap ce fichier :
postmap /etc/postfix/internal_networks

On crée le fichier /etc/postfix/mysql-hello.cf qui appelle une table SQL.
Cette table SQL listera les HELO de nos domaines email (on peut en posséder plusieurs dans le cas d’un serveur multidomaine).
vim /etc/postfix/mysql-hello.cf

user = postfix
password = mot_de_passe_de_postfix_pour_mysql
hosts = nom_du_serveur_mysql
dbname = postfix
query = SELECT access FROM postfix_hello WHERE source='%s'
Sécurisation du fichier :
chown postfix /etc/postfix/mysql-hello.*
chmod 640 /etc/postfix/mysql-hello.*

On crée ensuite le fichier /etc/postfix/mysql-sender.cf.
Il sert à blacklister ou whitelister les MAILFROM, c’est à dire les expéditeurs, selon leur adresse email ou juste le domaine de celle ci :
vim /etc/postfix/mysql-sender.cf

user = postfix
password = mot_de_passe_de_postfix_pour_mysql
hosts = nom_du serveur_mysql
dbname = postfix
query = SELECT access FROM postfix_access WHERE source='%s' AND type = 'sender'
Sécurisation du fichier :
chown postfix /etc/postfix/mysql-sender.*
chmod 640 /etc/postfix/mysql-sender.*

On crée le fichier /etc/postfix/mysql-client.cf.
Il sert à blacklister ou whitelister les clients par leur connection (ip/domaine) :
vim /etc/postfix/mysql-client.cf

user = postfix
password = mot_de_passe_de_postfix_pour_mysql
hosts = nom_du_serveur_mysql
dbname = postfix
query = SELECT access FROM postfix_access WHERE source='%s' AND type = 'client'
Sécurisation du fichier :
chown postfix /etc/postfix/mysql-client.*
chmod 640 /etc/postfix/mysql-client.*

On crée le fichier /etc/postfix/mysql-sasl-sender-check.cf .
Il sert à spécifier les adresses que les utilisateurs authentifiés par SASL peuvent utiliser comme MAIL FROM :
vim /etc/postfix/mysql-sasl-sender-check.cf

user = postfix
password = mot_de_passe_de_postfix_pour_mysql
hosts = nom_du_serveur_mysql
dbname = postfix
query = SELECT goto FROM alias WHERE address='%s'
Note : on fait appel à la table alias. En effet c’est le meilleur endroit pour connaitre les MAIL FROM d’un utilisateur, car un mail from valide doit être une adresse valide pour cet utilisateur. (donc un de ces alias)
Sécurisation du fichier :
chown postfix /etc/postfix/mysql-sasl-sender-check.*
chmod 640 /etc/postfix/mysql-sasl-sender-check.*

On crée le fichier /etc/postfix/our_domain_as_sender .
Il sert à spécifier les domaines autorisés comme MAIL FROM pour les users internes authentifiés par leur IP (les clients en local peuvent envoyer un email local sans s’authentifier dans notre configuration)
vim /etc/postfix/our_domain_as_sender

exemple.com OK
<> OK
On postmap ce fichier :
postmap /etc/postfix/our_domain_as_sender

On crée enfin le fichier /etc/postfix/not_our_domain_as_sender .
Il sert à spécifier les domaines refusés comme MAIL FROM pour les users externes non authentifiés (c’est à dire quelqu’un de l’extérieur qui nous envoie un mail). Si il spécifie un de nos domaines en MAIL FROM, le message sera refusé.
vim /etc/postfix/not_our_domain_as_sender

exemple.com 554 You are not in our domain

On postmap ce fichier :
postmap /etc/postfix/not_our_domain_as_sender

On crée les tables en question :
mysql -h nom_du_servuer_mysql -u postfix -p
use postfix;
CREATE TABLE `postfix_hello` (
`id` int(10) unsigned NOT NULL auto_increment,
`source` varchar(128) NOT NULL default ,
`access` varchar(128) NOT NULL default ,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=37 DEFAULT CHARSET=latin1 AUTO_INCREMENT=37 ;
INSERT INTO `postfix_hello` (`id`, `source`, `access`) VALUES (36, 'exemple.com', 'REJECT you are not me');
CREATE TABLE `postfix_access` (
`id` int(10) unsigned NOT NULL auto_increment,
`source` varchar(128) NOT NULL default ,
`access` varchar(128) NOT NULL default ,
`type` enum('recipient','sender','client') NOT NULL default 'sender',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=107 DEFAULT CHARSET=latin1 AUTO_INCREMENT=107 ;
INSERT INTO `postfix_access` (`id`, `source`, `access`, `type`) VALUES (1, 'yahoo.com', 'OK', 'client'), (14, Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.', '554 Spam not tolerated here', 'sender');
On relance postfix
invoke-rc.d postfix reload

On vérifie les logs et on teste.
On a inséré des exemples de blacklist et de whitelist.
On peut utiliser PhpMyadmin pour gérer ces tables SQL.
Vérification des Headers, du Body et du Type Mime par Postfix.
Postfix peut vérifier les mails entrants très simplement en analysant le header, le body et le type mime des pièces jointes.
Ce type de blocage est très efficace, plus rapide que de laisser faire Amavisd ou SA (SpamAssassin), mais manque de souplesse.
Il s’avère cependant très efficace pour bloquer des types de fichiers par exemple sans que le mail ne soit envoyé au serveur puis traité (économie de bande passante et de CPU).
Cependant une trop grande quantité de règles et un fort trafic aurait l’effet inverse sur les performances.
Il faut donc utiliser ces règles avec précaution.
On crée les fichiers nécessaires :
cd /etc/postfix/
wget http://www.worm-fr.com/wiki/linux/upload/Debian/body_checks.cf
wget http://www.worm-fr.com/wiki/linux/upload/Debian/header_checks.cf
wget http://www.worm-fr.com/wiki/linux/upload/Debian/mime_headers_checks.cf
Les fichiers sont :
body_checks.cf
header_checks.cf
mime_headers_checks.cf

On édite le /etc/postfix/main.cf et on ajoute les lignes :
header_checks = regexp:/etc/postfix/header_checks.cf
body_checks = regexp:/etc/postfix/body_checks.cf
mime_header_checks = regexp:/etc/postfix/mime_headers_checks.cf
On relance postfix :
invoke-rc.d postfix reload

On teste en envoyant un mail classique puis un autre qui contient un des mots ou type bloqués par ces règles.
Le blocage est immédiat et se traduit par un retour d’erreur au moment de l’envoi.
Amavisd
On va faire une installation manuelle de Amavis sans utiliser les packages amavis pour Debian. Pour ce faire on a besoin du package libdb4.4-dev.
Installation du prérequis :
apt-get install libdb4.4-dev

Lancement de CPAN en console :
Si c’est la première fois, on répond par défaut aux questions qu’il pose pour la configuration de l’interface.
perl -MCPAN -e shell

On met à jour Cpan et on installe les modules :
install Bundle::CPAN
reload cpan
install Archive::Zip
install Convert::TNEF
install Convert::UUlib
install Net::Server
install Time::HiRes
install Unix::Syslog
install BerkeleyDB
install Mail::Sendmail
install Email::Valid
install MIME::Charset
install MIME::EncWords
Installation des softs nécessaires (les decoders ) si ils ne sont pas déjà installés :
apt-get install file libcompress-bzip2-perl nomarch arc p7zip-full arj zoo lzop freeze tnef pax cabextract

Le compresseur rar.
Il est très important également d’installer RAR depuis le site de rarlabs (http://www.rarlab.com/download.htm). Suivre les instructions d’installation sur le site.
Télécharger les sources chez amavisd :
Positionnez vous dans votre répertoire de téléchargement ou de sources
Récupérez la dernière version d'amavisd sur http://www.ijs.si/software/amavisd/#download, actuellement la 2.6.4 (au 11/04/2010)
wget http://www.ijs.si/software/amavisd/amavisd-new-2.6.4.tar.gz
tar xvzf amavisd-new-2.6.4.tar.gz
cd amavisd-new-2.6.4
Création de l'utilisateur et du groupe amavis :
addgroup amavis
adduser --disabled-password --home /var/amavis --ingroup amavis amavis

Création un home pour l'utilisateur amavis :
mkdir /var/amavis
mkdir /var/amavis/tmp /var/amavis/var /var/amavis/db /var/amavis/home
chown -R amavis: /var/amavis
Création de 2 lecteur tmpfs pour héberger les répertoires db et tmp d’amavis. Cela accroit notablement les performance de traitement.
Pour cela on modifie le fstab avec vi : /etc/fstab :
tmpfs /var/amavis/db tmpfs rw,size=10m,mode=700,uid=amavis,gid=amavis 0 0
tmpfs /var/amavis/tmp tmpfs rw,size=150m,mode=700,uid=amavis,gid=amavis 0 0
Puis :
mount /var/amavis/tmp
mount /var/amavis/db

Vérifie par un mount -l
Copie de l’exécutable :
cp amavisd /usr/local/sbin/
chown root /usr/local/sbin/amavisd
chmod 755 /usr/local/sbin/amavisd
Copie du fichier de conf :
cp amavisd.conf /etc/
chown root:amavis /etc/amavisd.conf
chmod 640 /etc/amavisd.conf
Création de la quarantaine :
mkdir /var/virusmails
chown amavis:amavis /var/virusmails
chmod 750 /var/virusmails
Edition du fichier /etc/amavisd.conf :
Ci dessous les paramètres à modifier. Le reste du fichier reste le même. Evidemment il faut bien préciser son réseau local dans @mynetworks :
$daemon_user = 'amavis';
$daemon_group = 'amavis';
$mydomain = 't2.example.com';
$myhostname = 'mail.t2.example.com';
$MYHOME = '/var/amavis';
$log_level = 2;
@mynetworks = qw( 127.0.0.0/8 10.0.0.0/24 );
Désactivation temporairement l’antispam et l’antivirus pour tester :
On décommente pour cela les lignes (au début du fichier de conf) :
@bypass_virus_checks_maps = (1);
@bypass_spam_checks_maps = (1);
Démarrer amavisd en console pour voir si il manque des prérequis :
Noter les erreurs éventuelles. Si amavisd ne démarre pas, arrêter la et résoudre les problèmes.
/usr/local/sbin/amavisd debug

Si c’est ok, arréter amavisd par CTRL + C.
Configuration de Postfix :
A la fin du fichier /etc/postfix/master.cf :
smtp-amavis unix - - y - 2 smtp
-o smtp_data_done_timeout=1200
-o smtp_send_xforward_command=yes
-o disable_dns_lookups=yes
-o max_use=20
127.0.0.1:10025 inet n - y - - 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 smtpd_data_restrictions=reject_unauth_pipelining
-o smtpd_end_of_data_restrictions=
-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
-o smtpd_client_connection_count_limit=0
-o smtpd_client_connection_rate_limit=0
-o receive_override_options=no_header_body_checks,no_unknown_recipient_checks
Dans le fichier /etc/postfix/main.cf
content_filter = smtp-amavis:[127.0.0.1]:10024
receive_override_options = no_address_mappings
Relancer postfix :
invoke-rc.d postfix reload

Surveillance des logs :
tail -f /var/log/mail.log

Si tout est ok, lancer à nouveau amavisd debug
/usr/local/sbin/amavisd debug

Dans une autre console tapez :
telnet 127.0.0.1 10024

Il doit répondre :
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
220 [127.0.0.1] ESMTP amavisd-new service ready
quit pour sortir
Pareil pour tester le retour de Postfix :
telnet 127.0.0.1 10025

La réponse doit être du style :
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
220 mail.exemple.com ESMTP Postfix (Debian/GNU)
QUIT pour sortir (en majuscules)
Si les connections sont ok :
Tester le fonctionnement de base (ce qu’il faut taper est précédé de ---> , le reste c’est le retour du serveur) :
---> telnet localhost 10024
220 [127.0.0.1] ESMTP amavisd-new service ready
---> HELO localhost
250 [127.0.0.1]
---> MAIL FROM: <>
250 2.1.0 Sender <> OK
---> RCPT TO: <postmaster>
250 2.1.5 Recipient <postmaster> OK
---> DATA
354 End data with <CR><LF>.<CR><LF>
---> From: virus-tester
---> To: undisclosed-recipients:;
---> Subject: amavisd test - simple - no spam test pattern
---> This is a simple test message from the amavisd-new test-messages.
---> .
250 2.6.0 Ok, id=30897-02, from MTA([127.0.0.1]:10025): 250 2.0.0 Ok: queued as 079474CE44
---> QUIT
221 2.0.0 [127.0.0.1] amavisd-new closing transmission channel
L’aller-retour postfix/amavisd fonctionne bien !
(on peut arréter le debug d’amavisd par un CTRL + C)
Clamav
On va faire une installation manuelle de Clamav et de son démon sans utiliser les packages clamav pour Debian. Pour ce faire on a besoin du package zlib1g zlib1g-dev libgmpxx4ldbl libgmp3-dev.
Installation du prérequis :
apt-get install zlib1g zlib1g-dev libgmpxx4ldbl libgmp3-dev

Télécharger les sources chez clamav :
Positionnez vous dans votre répertoire de téléchargement ou de sources
Récupérez la dernière version de clamav sur http://sourceforge.net/projects/clamav/files/, actuellement la 0.96 (au 11/04/2010)
Mise à jour:

26 Mai 2010 - Version : 0.96.1
Utilisation du code durci de clamav : http://seclamav.avcave.org/
4 Octobre 2010 - Version : 0.92.2.

 

wget http://downloads.sourceforge.net/project/clamav/clamav/0.96/clamav-0.96.tar.gz?use_mirror=ignum
tar xvzf clamav-0.96.tar.gz
cd clamav-0.96
./configure --sysconfdir=/etc --with-user=amavis --with-group=amavis --with-dbdir=/var/lib/clamav
make
make install
mkdir /var/run/clamav
chown -R amavis: /var/run/clamav
chmod -R 750 /var/run/clamav
mkdir /var/lib/clamav
chown -R amavis: /var/lib/clamav
chmod -R 770 /var/lib/clamav
On met a jour les fichiers de configuration :
cd /etc
mv clamd.conf clamd.conf.orig
mv freshclam.conf freshclam.conf.orig
wget http://www.worm-fr.com/wiki/linux/upload/Debian/clamd.conf
wget http://www.worm-fr.com/wiki/linux/upload/Debian/freshclam.conf
Les fichiers :
clamd.conf
freshclam.conf

Modification de la crontab de l’utilisateur amavis pour planifier la mise à jour de la base antivirale :
crontab -e -u amavis

On ajoute :
0 0,6,12,18 /usr/local/bin/freshclam --log-verbose

Création :
mkdir /var/log/clamav
chown -R amavis:amavis /var/log/clamav
Création du /etc/init.d/clamd
vim /etc/init.d/clamd

On écrit :
#!/bin/sh
# clamd
case ""$1"" in
'start')
/usr/local/bin/freshclam; sleep 10; /usr/local/sbin/clamd
;;
'stop')
/usr/bin/killall clamd > /dev/null 2>&1 && echo -n 'Clamd stopped'
;;
)
echo ""Usage: $0 { start | stop }""
;;
esac
exit 0
Sécurisation et démarrage au boot :
chmod 755 /etc/init.d/clamd
update-rc.d clamd defaults

Mise à jour de la base virale :
./freshclam

Vérification que les fichiers soient bien présents dans le répertoire :
ls -la /var/lib/clamav

On lance clamd :
/etc/init.d/clamd start

Vérification dans les logs :
tail -f /var/log/clamav/clamd.log

Vérification du bon fonctionnement du processus Clam :
ps aux | grep clam

Teste du fonctionnement (le dossier \""test\"" est dans le répertoire clamav-0.96) :
clamav-x.yz etant un des fichiers de test présents dans le répertoire test
cd /chemin/d/installation/clamav-0.96/test/
clamdscan -l scan.txt clam-x.yz

Installation des signatures additionnelles pour Clam (détection du spam, phising...)
Il s’agit de fichiers supplémentaires que l’on place dans le dossier /var/lib/clamav
apt-get install curl rsync
mkdir /var/tmp/clamdb
chown amavis: /var/tmp/clamdb
chmod 660 /var/tmp/clamdb
cd /usr/sbin
wget http://www.worm-fr.com/wiki/linux/upload/Debian/UpdateSaneSecurity.sh
chmod 755 UpdateSaneSecurity.sh
Le fichier :
UpdateSaneSecurity.sh

Lancement du script :
Attention le script mets 5 minutes pour se lancer
./UpdateSaneSecurity.sh

Vérification : la présence des fichiers dans le répertoire de clam :
ls -l /var/lib/clamav

On doit trouver les fichiers suivants en plus des fichers classiques :
MSRBL-Images.hdb
MSRBL-SPAM.ndb
phish.ndb
phish.ndb.gz
scam.ndb
scam.ndb.gz

Création d'une tache cron pour mettre à jour ces fichiers :
crontab -e -u amavis

5 /4 /usr/sbin/UpdateSaneSecurity.sh

Installation de ClamdMon pour la surveillance du demon clam :
installer le script de surveillance fourni dans les sources de clam (récupérer pour cela la version 0.95 de clamav):
cd /root/clamav-0.95/contrib/clamdmon
tar xvzf clamdmon-1.0.tar.gz
cd clamdmon-1.0
make
make install

Edition du fichier /usr/local/sbin/clamdmon.sh comme ceci :
/usr/local/sbin/clamdmon -p /var/run/clamav/clamd.ctl && (killall clamd; sleep 5; killall -9 clamd; sleep 1; freshclam; sleep 1; clamd)

Edition la crontab de root
crontab -e

On écrit :
*/5 /usr/local/sbin/clamdmon.sh

SpamAssassin
On va faire une installation manuelle de SpamAssassin sans utiliser les packages SA pour Debian. Pour ce faire on va installer SpamAssassin par CPAN.
Installation :
perl -MCPAN -e shell
o conf prerequisites_policy ask
install HTML::Parser
install LWP
install IO::Zlib
install Archive::Tar
install DB_File
install Net::SMTP
install Net::DNS
install Net::DNS::Resolver::Programmable
install Error
install NetAddr::IP
install IP::Country::Fast
install Mail::SPF
install DBI
install DBD::mysql
install Mail::DKIM
force install Encode::Detect
install Mail::SpamAssassin
Note : Si l’installation de SA finit par une erreur (le make test ne passe pas) il faut alors forcer l’install par force install Mail::SpamAssassin. DBD ::mysq peut présenter le meme probleme. Forcer l’install de la meme facon.
SA est installé. Sa config de base se fait dans le fichier /etc/mail/spamassassin/local.cf mais pour la plupart des paramètres, c’est le fichier amavisd.conf qui sera prioritaire.
Lorsqu’on utilise Amavisd pour appeler SA il est inutile de lancer spamd.
Edition du fichier /etc/mail/spamassassin/local.cf comme ceci :
lock_method flock
required_score 4.3
rewrite_header Subject *****SPAM****
report_safe 0
clear_internal_networks
clear_trusted_networks
#trusted networks doit TOUJOURS contenir les memes entrées que internal. On ajoutera eventuellement des réseaux de confiance dans ce paramètre.
internal_networks 90.46.134.64 127.0.0.1 10.0.0/24 192.168.2/24
trusted_networks 90.46.134.64 127.0.0.1 10.0.0/24 192.168.2/24
use_bayes 1
bayes_auto_expire 0
bayes_store_module Mail::SpamAssassin::BayesStore::MySQL
bayes_sql_dsn DBI:mysql:spam:localhost
bayes_sql_username spam
bayes_sql_password mot_de_passe_de_spam_pour_mysql
bayes_sql_override_username amavis
bayes_auto_learn 1
bayes_auto_learn_threshold_nonspam 0.1
bayes_auto_learn_threshold_spam 5.0
use_auto_whitelist 0
skip_rbl_checks 0
dns_available yes
## Optional Score Increases
score BAYES_99 4.300
score BAYES_80 3.000
score MISSING_MIMEOLE 0.501 0.501 0.241 0.200
score BAYES_60 0 0 2.502 2.502
score NO_RELAYS -3.2
Note : internal_networks et trusted_networks sont des paramètres très importants pour la pertinence de la détection. Il faut absolument les configurer correctement.
Sécurisation :
chown amavis: /etc/mail/spamassassin/local.cf
chmod 640 /etc/mail/spamassassin/local.cf

SA fonctionne sur 2 types de tests :
Heuristiques (ensemble de règles)
Bayesiens (apprentissage et statistiques)
Pour le filtre bayesien, on va installer directement la base dans une base Mysql. Les performances sont supérieures et on s’affranchit de diverses limitations :
Création de la base :
Se connecter au serveur mysql :
mysql -u root -p
create database spam;

GRANT SELECT, INSERT, UPDATE, DELETE ON spam. TO 'spam'@'nom_du_serveur_de_mail' IDENTIFIED BY 'mot_de_passe';
FLUSH PRIVILEGES;
quit

Importation la base sql toujours sur le serveur mysql:
wget http://svn.apache.org/repos/asf/spamassassin/tags/spamassassin_current_release_3.3.x/sql/bayes_mysql.sql
wget http://spamassassin.apache.org/gtube/gtube.txt
mysql -u root -p spam < bayes_mysql.sql

Initialisation de la base :
su amavis -c 'sa-learn -D --spam gtube.txt'

Vérification avec phpmyadmin que la base s’est bien remplie.
Amélioration des performances de la base en changeant le moteur : MyIsam en InnoDB :
Se connecter au serveur mysql
mysql -u root -p
USE spam;
ALTER TABLE bayes_expire TYPE=InnoDB;
ALTER TABLE bayes_global_vars TYPE=InnoDB;
ALTER TABLE bayes_seen TYPE=InnoDB;
ALTER TABLE bayes_token TYPE=InnoDB;
ALTER TABLE bayes_vars TYPE=InnoDB;
ANALYZE TABLE bayes_expire;
ANALYZE TABLE bayes_global_vars;
ANALYZE TABLE bayes_seen;
ANALYZE TABLE bayes_token;
ANALYZE TABLE bayes_vars;
Pour améliorer les performances, on a désactivé le \""opportunistic (automatic) Bayes auto-expiry\"" en spécifiant \""bayes_auto_expire 0\"" dans /etc/mail/spamassassin/local.cf.
Création d'une tache cron quotidienne pour effectuer l’expiration (la crontab de l’user amavis fera l’affaire) :
crontab -e -u amavis

Ajout de :
16 3 sa-learn --sync --force-expire

Mise à jour des Rules de SA et ajout des Rules SARE :
Mise à jour les règles de SA et en installer de nouvelles depuis le site de SARE :
l’update des règles de SA :
sa-update -D


->Note Cela aura pour effet de télécharger les règles à jour. Elles seront installés dans un dossier différent des règles d’origine : /var/lib/spamassassin/3.003001. (ce qui correspond à la version 3.3.1 de SA)
SA considèrera désormais ce dossier comme celui par défaut.

Vérification que tout soit OK :
su -c ""spamassassin -D --lint"" amavis

Il ne doit pas il y a voir de message d’erreur à la fin de l’execution.
Préparation de l’installation des rules SARE :
cd /etc/mail/spamassassin/
wget http://daryl.dostech.ca/sa-update/sare/GPG.KEY
sa-update --import GPG.KEY

Installation du fichier contenant la liste des Rules :
wget http://www.worm-fr.com/wiki/linux/upload/Debian/sare-sa-update-channels.txt
Le fichier :
sare-sa-update-channels.txt

Note : on pourra modifier ce fichier pour ne sélectionner que les RULES que l’on désire.
Mise à jour :
sa-update --channelfile /etc/mail/spamassassin/sare-sa-update-channels.txt --gpgkey 856AA88A

Note : Les fichiers seront placés dans /var/lib/spamassassin :
ls -la /var/lib/spamassassin/3.003001/

Nouvelle vérification que tout soit OK :
su -c ""spamassassin -D --lint"" amavis

Mise à jour régulière (1 fois par jour maximum) on pourra créer une tache cron en n’oubliant pas de relancer amavisd à la fin du script.
Création du fichier sa-update.sh :

vim /etc/sa-update.sh

On écrit :
#!/bin/bash
sa-update
code1=$?
if [[ $code1 > 1 ]]; then
echo ""problem with sa-update""
fi
sa-update --channelfile /etc/mail/spamassassin/sare-sa-update-channels.txt --gpgkey 856AA88A
code2=$?
if [[ $code2 > 1 ]]; then
echo ""problem with sare update""
fi
if [[ `expr $code1 + $code2` < 2 ]]; then
spamassassin --lint
code3=$?
if $code3 = 0 ; then
/etc/init.d/amavis stop && /etc/init.d/amavis start >/dev/null
else
echo ""spamassassin failed to lint""
fi
fi
Sécurisation :
chmod 755 /etc/sa-update.sh

Edition la crontab pour ajouter la ligne :
crontab -e
15 2 /etc/sa-update.sh

Compilation des Rulesets
Depuis la version 3.2, SA est un peu plus lent dans le traitement des messages. En revanche une nouvelle fonctionnalité est apparue : la compilation des règles.
Pour celles qui le permettent, cela accelère sensiblement le traitement. Pour cela il faut installer au préalable le paquet re2c :
apt-get install re2c

Exécuter la commande
sa-compile -D

Cela prend un certain temps avant de se terminer. Les règles compilées seront placées dans le répertoire /var/lib/spamassassin/compiled.
Il faut maintenant activer l’usage de ces règles grace au plugin Rule2XSBody :
Edition du fichier /etc/mail/spamassassin/v320.pre et on décommente la ligne suivante :
loadplugin Mail::SpamAssassin::Plugin::Rule2XSBody

Vérification que tout soit ok :
su -c 'spamassassin -D --lint' amavis

Planifier d'une compilation hebdomadaire des règles.
Création du fichier /etc/cron.weekly/sa-compile
vim /etc/cron.weekly/sa-compile

On écrit :
#!/bin/bash
if [ -x /usr/bin/re2c -a -x /usr/local/bin/sa-compile -a -d /var/lib/spamassassin/compiled ]; then
/usr/local/bin/sa-compile > /dev/null 2>&1
fi
code1=$?
if [[ $code1 > 0 ]]; then
echo ""problem with sa-compile, turning off Rule2XSBody plugin""
sed -i 's/loadplugin Mail::SpamAssassin::Plugin::Rule2XSBody/#loadplugin Mail::SpamAssassin::Plugin::Rule2XSBody/' /etc/mail/spamassassin/v320.pre
test -x /usr/local/sbin/amavisd || exit 0
/etc/init.d/amavis stop && /etc/init.d/amavis start >/dev/null
else
sed -i 's/#loadplugin Mail::SpamAssassin::Plugin::Rule2XSBody/loadplugin Mail::SpamAssassin::Plugin::Rule2XSBody/' /etc/mail/spamassassin/v320.pre
test -x /usr/local/sbin/amavisd || exit 0
/etc/init.d/amavis stop && /etc/init.d/amavis start >/dev/null
fi
On rend le fichier executable :
chmod 755 /etc/cron.weekly/sa-compile

Activation du plugin DKIM pour les vérification DKIM
Edition du fichier /etc/mail/spamassassin/v312.pre
vim /etc/mail/spamassassin/v312.pre

Décommenter la ligne :
loadplugin Mail::SpamAssassin::Plugin::DKIM

SA est prêt et fonctionnel !!
Activer SA dans amavisd :
Edition du fichier amavisd.conf et on commente la ligne :
# @bypass_spam_checks_maps = (1);

Démarrage en debug-sa :
/usr/local/sbin/amavisd debug-sa

On doit trouver dans la liste ceci :
dbg: bayes: using username: amavis
[30527] dbg: bayes: database connection established
[30527] dbg: bayes: found bayes db version 3
[30527] dbg: bayes: Using userid: 1
[30527] dbg: bayes: not available for scanning, only 1 spam(s) in bayes DB < 200

Note : Bayes n’est pas encore disponible car il n’a pas analysé assez de mails pour fonctionner. Ceci est normal.
On envoie un mail et on doit voir dans le debug le bon fonctionnement.
On arrête amavisd par un CTRL + C.
On édite le fichier amavisd.conf et on change les lignes suivantes de cette manière :
$sa_tag_level_deflt = -9999.9; # add spam info headers if at, or above that level
$sa_tag2_level_deflt = 4.3; # add 'spam detected' headers at that level
$sa_kill_level_deflt = 9999.9; # triggers spam evasive actions
$sa_mail_body_size_limit = 500*1024; # don't waste time on SA if mail is larger
$sa_spam_subject_tag = '***SPAM_SCORE_** ';
$sa_spam_report_header = 1;
$final_spam_destiny = D_PASS;
Note : Avec cette modification, on dit à amavisd de laisser passer le spam mais de le tagguer dans le header du mail.
On traitera le mail plus loin par Maildrop.
Création du fichier /etc/init.d/amavis avec vi :
#!/bin/sh
# amavisd-new
case ""$1"" in
'start')
/usr/local/sbin/amavisd start
;;
'stop')
/usr/local/sbin/amavisd stop
;;
)
echo ""Usage: $0 { start | stop }""
;;
esac
exit 0
Sécurisation :
chmod 755 /etc/init.d/amavis
update-rc.d amavis defaults

Lancement de amavisd :
/etc/init.d/amavis start

Vérification des logs.
On envoie un mail et on regarde l’entête de celui ci. on doit voir les X-Spam- headers.
On paramètre Maildrop pour déposer le courier détecté comme spam dans le dossier spam de chaque utilisateur.
Edition du fichier /home/virtual/.mailfilter et on le modifie comme ceci :
logfile ""/home/virtual/.maildrop.log""
`[ -d $DEFAULT ] || (maildirmake $DEFAULT && maildirmake -f Spam $DEFAULT && maildirmake -f sent-mail $DEFAULT && maildirmake -f Spam.BlackList $DEFAULT && maildirmake -f Spam.WhiteList $DEFAULT)`
`test -r $HOME/$DEFAULT.mailfilter`
if( $RETURNCODE == 0 )
{
log ""(==) Including $HOME/$DEFAULT.mailfilter""
exception {
include $HOME/$DEFAULT.mailfilter
}
}
Note : Lors du premier mail envoyer les dossier Spam et sous dossier BlackList et WhiteList sont créés.
Pour améliorer l’apprentissage, on crée une tache qui scanne les boîte spam et nonspam et les 2 dossiers d’apprentissage BlackList et WhiteList des boîtes des utilisateurs (Dossiers crées automatiquement par maildrop à la première livraison) puis envoie leur contenu vers le filtre bayesien
Le filtre bayesien
Création des boites Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser. et Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser..
Création des deux répertoires spéciaux de transit :
mkdir /home/spamtrap
chown amavis: /home/spamtrap
chmod 777 /home/spamtrap
mkdir /home/hamtrap
chown amavis: /home/hamtrap
chmod 777 /home/hamtrap

Création du fichier /etc/sa-learn , édition via vi:
#!/bin/bash
chown amavis:amavis /home/spamtrap/ > /dev/null 2>&1
chown amavis:amavis /home/hamtrap/ > /dev/null 2>&1
chmod 777 /home/spamtrap/ > /dev/null 2>&1
chmod 777 /home/hamtrap/ > /dev/null 2>&1
mv /home/virtual/Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser./new/ /home/spamtrap/ > /dev/null 2>&1
mv /home/virtual/Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser./cur/ /home/spamtrap/ > /dev/null 2>&1
mv /home/virtual/Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser./new/ /home/hamtrap/ > /dev/null 2>&1
mv /home/virtual/Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser./cur/ /home/hamtrap/ > /dev/null 2>&1
cp /home/virtual/*/.Spam.BlackList/cur/ /home/spamtrap/ > /dev/null 2>&1
cp /home/virtual/*/.Spam.BlackList/new/ /home/spamtrap/ > /dev/null 2>&1
cp /home/virtual/*/.Spam.WhiteList/new/ /home/hamtrap/ > /dev/null 2>&1
cp /home/virtual/*/.Spam.WhiteList/cur/ /home/hamtrap/ > /dev/null 2>&1
su -c ""/usr/local/bin/sa-learn -D --spam /home/spamtrap/"" amavis
su -c ""/usr/local/bin/sa-learn -D --ham /home/hamtrap/"" amavis
rm /home/spamtrap/ > /dev/null 2>&1
rm /home/hamtrap/ > /dev/null 2>&1
Sécurisation et ""exécutabilité"" :
chmod 755 /etc/sa-learn

Création d'une tache cron qu’on lance par root : (une fois par jour ou plus suivant la puissance de la machine, cette tache etant tres gourmande en ressources)
crontab -e
30 3,10,15,22 /etc/sa-learn

Note : Tout sera automatique. Il suffira d’indiquer aux utilisateurs de déplacer les emails non détectés comme Spam dans le dossier BlackList et les email légitimes détectés à tort comme Spam dans le Dossier WhiteList. Le script déplacera lors de son execution tous ces emails et en fera l’apprentissage soit comme spam soit comme ham (non spam).
Activation de Clam dans Amavisd
On paramètre ensuite l’antivirus pour fonctionner avec amavisd :
Edition du fichier /etc/amavisd.conf :
On remplace à la fin du fichier tout ce qui se trouve entre :
@av_scanners = (
et
1; # insure a defined return
par :

# ### http://www.clamav.net/
['ClamAV-clamd',
\&ask_daemon, [""CONTSCAN {}\n"", ""/var/run/clamav/clamd.ctl""],
qr/\bOK$/, qr/\bFOUND$/,
qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ],
);
@av_scanners_backup = (
### http://www.clamav.net/ - backs up clamd or Mail::ClamAV
['ClamAV-clamscan', 'clamscan',
""--stdout --no-summary -r --tempdir=$TEMPBASE {}"",
[0], qr/:.*\sFOUND$/, qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ],
);
On commente :
@bypass_virus_checks_maps = (1);

On relance amavisd :
/etc/init.d/amavis stop && /etc/init.d/amavis start

L’antivirus est chargé.
Création de l’alias email : Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser. vers Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.
Dspam
Dspam et SpamAssassin sont complémentaires. Amavis sait gérer les deux en parallèle. On va faire une installation manuelle de Dspam sans utiliser les packages dspam pour Debian. Pour ce faire on va installer Dspam en compilant les sources.

Installation :
Télécharger les sources chez dspam :
Positionnez vous dans votre répertoire de téléchargement ou de sources.
Récupérez la dernière version de dspam sur http://sourceforge.net/projects/dspam/files/, actuellement la 3.9.0 (au 11/04/2010)
wget http://downloads.sourceforge.net/project/dspam/dspam/dspam-3.9.0/dspam-3.9.0.tar.gz?use_mirror=freefr
tar xvzf dspam-3.9.0.tar.gz
cd dspam-3.9.0
./configure --with-dspam-home=/var/amavis/dspam --enable-signature-headers --without-delivery-agent --without-quarantine-agent --with-storage-driver=mysql_drv --with-mysql-includes=/usr/include/mysql
make
make install

Modification les droits sur les exécutables (même utilisateur qu’amavisd) et le dspam.conf
chown amavis: /usr/local/bin/dspam*
chown amavis: /usr/local/etc/dspam.conf
chmod 750 /usr/local/bin/dspam*
chmod 640 /usr/local/etc/dspam.conf

Création de la base sql (se connecte sur le serveur mysql) :
mysql -u root -p
create database dspam;
GRANT SELECT, INSERT, UPDATE, DELETE ON dspam. TO 'dspam'@'nom_du_serveur_de_mail' IDENTIFIED BY 'mot_de_passe';
FLUSH PRIVILEGES;
quit

Importation de la base sql (on est toujours connecté sur le serveur mysql) :
mysql -u root -p dspam < /chemin/du/répertoire/contenant/mysql_objects-4.1.sql

Modification du fichier /usr/local/etc/dspam.conf : exemple de fichier fonctionnel. On modifie ou on ajoute les lignes suivantes :
Trust amavis
#MySQLServer /var/run/mysqld/mysqld.sock # si mysql est local
MySQLServer nom_du_serveur_mysql
#MySQLPort
MySQLUser dspam
MySQLPass mot_de_passe_pour mysql
MySQLDb dspam
#MySQLCompress true
Création du répertoire de dspam dans le home d’amavisd :
mkdir /var/amavis/dspam
chown -R amavis: /var/amavis/dspam

Activation de dspam, il faut décommenter la ligne suivante dans amavisd.conf :
On a :
# $dspam = 'dspam';
pour avoir :
$dspam = 'dspam';

Relancement d'amavisd :
/etc/init.d/amavis stop && /etc/init.d/amavis start

Vérification des logs. On doit voir :
Found $dspam at /usr/local/bin/dspam

On envoie un email :
Vérification des logs, les headers des email pour les tags X-DSPAM et le remplissage de la base de données.
Principe de fontionnement :
Dans cette configuration, Dspam marque simplement les mails (il ajoute un tag dans le header). Pour que le filtrage devienne effectif, il faut donc indiquer à Spamassasssin le score à attribuer en fonction de la valeur du tag X-DSPAM dans le header.
De préférence, il vaut mieux attendre quelques jours après l’installation de dspam afin de le laisser apprendre sur un volume de mail conséquent, avant d’activer ces rules SA.
Dès que l’on estime que les tags sont pertinents dans les headers (c’est à dire que Dspam détecte bien du spam et du non-spam (ham) correctement), on peut ajouter ceci au /etc/mail/spamassassin/local.cf :
header DSPAM_SPAM X-DSPAM-Result =~ /^Spam$/
describe DSPAM_SPAM DSPAM claims it is spam
score DSPAM_SPAM 2.8
header DSPAM_HAM X-DSPAM-Result =~ /^Innocent$/
describe DSPAM_HAM DSPAM claims it is ham
score DSPAM_HAM -0.2
Amélioration des performances de la base en changeant le moteur : passage de MyIsam en InnoDB (se connecter sur le serveur mysql)
mysql -u root -p

USE dspam;
ALTER TABLE dspam_preferences TYPE=InnoDB;
ALTER TABLE dspam_signature_data TYPE=InnoDB;
ALTER TABLE dspam_stats TYPE=InnoDB;
ALTER TABLE dspam_token_data TYPE=InnoDB;
ANALYZE TABLE dspam_preferences;
ANALYZE TABLE dspam_signature_data;
ANALYZE TABLE dspam_stats;
ANALYZE TABLE dspam_token_data;

Création des taches de maintenance de dspam :
Une tache cron avec l'utilisateur amavis (crontab -e -u amavis) :
14 2 /usr/bin/mysql -u dspam -p'******' dspam < /root/dspam-3.8.0/src/tools.mysql_drv/purge-4.1.sql

Modification du fichier /répertoire/ou/se/trouve/dspam-3.9.0/src/tools.mysql_drv/purge-4.1.sql pour rajouter à la fin :
START TRANSACTION;
optimize table dspam_signature_data, dspam_token_data;
COMMIT;
Création d'une tache cron de purge des log avec l'utilisateur amavis (crontab -e -u amavis):
3 3 1 * /usr/local/bin/dspam_logrotate -a 30 -v -d /var/amavis/dspam

Filtrage par extensions et type mime dans amavisd.
On peut également renforcer le blocage des fichiers par extension et type mime dans amavisd, indépendamment de l’antivirus.
Ce blocage est très efficace et peut être complémentaire du premier blocage par postfix sur ces fichiers (headers, body, type mime), car il utilise cette fois les capacités de décodage et de décompression d’Amavisd.
Par exemple, on pourra facilement bloquer un fichier exe à l’intérieur d’un fichier zip.
Voir mon fichier amavisd.conf pour des exemples de type mime et d’extensions de fichiers.
Le serveur de mail et le filtrage sont configurés !
Mon fichier amavisd.conf