Installation Serveur Mail Postfix, Amavisd, Mysql, Spamassassin

Transcription

Installation Serveur Mail Postfix, Amavisd, Mysql, Spamassassin
Installation Serveur Mail Postfix, Amavisd, Mysql, Spamassassin, Dspam, Courier-IMAP
Extrait du site : http://www.starbridge.org/spip
Installation Serveur Mail
Postfix, Amavisd, Mysql,
Spamassassin, Dspam,
Courier-IMAP
Copyright ©
Page 1/32
Installation Serveur Mail Postfix, Amavisd, Mysql, Spamassassin, Dspam, Courier-IMAP
Le systeme sur lequel est basé ce document est une DEBIAN 4.0. La version Testing (Lenny) à la date de rédaction
ne présente pas de réelles differences. Ce tuto fonctionne aussi sous Ubuntu mais certains paquets presentent de
légères différences. On essaiera de les indiquer si possible. On prendra comme base pour l'exemple le domaine
starbridge.org et le hostname du serveur de mail sera spike. On met le système à jour
aptitude update aptitude dist-upgrade
On vérifie les fichiers:
- * /etc/hostname:
spike.starbridge.org
- * /etc/hosts:
127.0.0.1starbridge.org spike.starbridge.org localhost.localdomain localhost spike
Le fonctionnement d'un serveur de mail nécessite l'utilisation intensive de requètes DNS. Pour des raisons de
performances, il est très fortement conseillé d'installer un cache DNS local.
aptitude install bind9
La configuration de base sous Debian fournie un serveur cache (on peut bien sur le configurer pour gérer son
domaine local voire son domaine public mais ce n'est pas le sujet de cet article). On modifie le /etc/resolv.conf pour
pointer en local:
nameserver 127.0.0.1 search starbridge.org
on relance le serveur DNS:
/etc/init.d/bind9 restart
Puis on teste la résolution avec nslookup ou dig
nslookup
>server
doit retourner:
Default server: 127.0.0.1 Address: 127.0.0.1#53
puis:
> yahoo.fr
La résolution doit se faire correctement.
apt-get install postfix postfix-mysql mysql-client-5.0 mysql-server-5.0 courier-imap courier-imap-ssl
courier-authdaemon courier-authlib-mysql libsasl2-2 libsasl2-modules sasl2-bin libpam-mysql openssl ntp fam
tmpreaper
D'autre paquets vont s'installer en même temps. L'ancien MTA exim4 sera desintallé. Note: pour les questions de
l'installeur Debian:
- *courier-base: Faut-il créer les répertoires nécessaires à l'administration web = NON.
- *postfix configuration: SITE INTERNET. Pour le reste on repond par défaut. On installe apache + php5 pour gérer
plus tard le tout avec l'interface postfixadmin.
aptitude install apache2 libapache2-mod-php5 php5-mysql
Copyright ©
Page 2/32
Installation Serveur Mail Postfix, Amavisd, Mysql, Spamassassin, Dspam, Courier-IMAP
Note: Il est fortement conseillé d'installer le SSL avec apache pour sécuriser les échanges. Cette configuration sort
du scope de document. Pour ceux qui le préfère, on peut tout de suite installer phpmyadmin pour effectuer l'etape
suivante. (on ne detaillera pas cette installation, en dehors du scope de ce document) On passe donc à la création
de la base Postfix:
mysqladmin -u root password 'your password' mysqladmin -u root --password='' create postfix
Création de l'user postfix:
$ mysql -u root -p Enter password: GRANT ALL PRIVILEGES ON postfix.* TO "postfix"@"localhost" IDENTIFIED
BY 'password';
On crée les tables suivantes dans la base postfix: USE postfix; CREATE TABLE admin ( username varchar(255)
NOT NULL default '', password 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), KEY username (username) ) TYPE=MyISAM COMMENT='Postfix Admin Virtual Admins'; # # Table structure for table alias # CREATE TABLE alias ( address varchar(255) NOT NULL
default '', goto text NOT NULL, 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), KEY address (address) ) TYPE=MyISAM COMMENT='Postfix Admin Virtual Aliases'; # # Table structure for table domain # 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', 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), KEY
domain (domain) ) TYPE=MyISAM COMMENT='Postfix Admin - Virtual Domains'; # # Table structure for table
domain_admins # CREATE TABLE domain_admins ( username varchar(255) NOT NULL default '', domain
varchar(255) NOT NULL default '', created datetime NOT NULL default '0000-00-00 00:00:00', active tinyint(1)
NOT NULL default '1', KEY username (username) ) TYPE=MyISAM COMMENT='Postfix Admin - Domain Admins';
# # Table structure for table log # CREATE TABLE log ( timestamp datetime NOT NULL default '0000-00-00
00:00:00', username varchar(255) NOT NULL default '', domain varchar(255) NOT NULL default '', action
varchar(255) NOT NULL default '', data varchar(255) NOT NULL default '', KEY timestamp (timestamp) )
TYPE=MyISAM COMMENT='Postfix Admin - Log'; # # Table structure for table mailbox # 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),
KEY username (username) ) TYPE=MyISAM COMMENT='Postfix Admin - Virtual Mailboxes'; # # Table structure for
table vacation # CREATE TABLE vacation ( email varchar(255) NOT NULL default '', subject varchar(255) NOT
NULL default '', body text NOT NULL, cache text NOT NULL, domain varchar(255) NOT NULL default '', created
datetime NOT NULL default '0000-00-00 00:00:00', active tinyint(1) NOT NULL default '1', PRIMARY KEY (email),
KEY email (email) ) TYPE=MyISAM COMMENT='Postfix Admin - Virtual Vacation'; INSERT INTO domain
(domain,description) VALUES ('starbridge.org','Test Domain'); INSERT INTO alias (address,goto,domain) VALUES
('[email protected]', '[email protected]','starbridge.org'); INSERT INTO alias (address,goto,domain) VALUES
('[email protected]', '[email protected]','starbridge.org'); INSERT INTO alias (address,goto,domain)
VALUES ('[email protected]', '[email protected]','starbridge.org'); INSERT INTO alias (address,goto,domain)
VALUES ('[email protected]', '[email protected]','starbridge.org'); INSERT INTO alias (address,goto,domain)
VALUES ('[email protected]', '[email protected]','starbridge.org'); INSERT INTO mailbox
(username,password,name,maildir,domain) VALUES
('[email protected]','$1$caea3837$gPafod/Do/8Jj5M9HehhM.','Mailbox
User','[email protected]/','starbridge.org'); INSERT INTO mailbox (username,password,name,maildir,domain)
VALUES ('[email protected]','$1$caea3837$gPafod/Do/8Jj5M9HehhM.','Mailbox
Admin','[email protected]/','starbridge.org'); Seules 3 tables sont nécessaires à Postfix. Le reste est pour
Copyright ©
Page 3/32
Installation Serveur Mail Postfix, Amavisd, Mysql, Spamassassin, Dspam, Courier-IMAP
l'interface postfixadmin que l'on installera plus tard. Le password (MD5) est "secret"
($1$caea3837$gPafod/Do/8Jj5M9HehhM.) Le premier INSERT permet à Postfix de savoir que ce domaine est
virtuel et qu'il doit donc le gérer. Le 3ème INSERT est un alias virtuel poitant vers un user de la table mailbox. Cet
alias vers lui même sera utilisé par postfixadmin. le 4ème INSERT est lui un simple alias virtuel. Le 7ème INSERT
est un compte (boite email) virtuel, qui utilise un mot de passe encrypté en MD5. Note: on remarquera que l'on laisse
Postfix chrooté (plus secure) et que l'on utilise le daemon proxy pour communiquer avec le socket de mysql. On
remplace tout le /etc/postfix/main.cf par le contenu ci dessous: smtpd_banner = $myhostname ESMTP $mail_name
(Debian/GNU) biff = no append_dot_mydomain = no myhostname = spike.starbridge.org alias_maps =
hash:/etc/aliases alias_database = hash:/etc/aliases myorigin = starbridge.org mydestination = localhost.localdomain,
localhost mynetworks = 127.0.0.0/8 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 = starbridge.org
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 On modifie le
/etc/postfix/master.cf comme ci dessous: #
========================================================================== # service type
private unpriv chroot wakeup maxproc command + args #
(yes) (yes) (yes) (never) (100) #
========================================================================== smtp
inet n
smtpd #submission inet n
smtpd #-o smtpd_etrn_restrictions=reject
#628
inet n
qmqpd pickup fifo n
60
1
pickup -o
receive_override_options=no_header_body_checks -o content_filter= cleanup unix n
0
cleanup qmgr
fifo n
300 1
qmgr #qmgr fifo n
300 1
oqmgr rewrite
unix trivial-rewrite bounce unix 0
bounce defer unix 0
bounce trace unix 0
bounce verify unix 1
verify flush unix n
1000? 0
flush proxymap unix n
proxymap smtp
unix smtp relay unix smtp #
-o smtp_helo_timeout=5 -o
smtp_connect_timeout=5 showq unix n
showq error unix error local unix n
n
local virtual unix n
n
virtual lmtp
unix n
lmtp anvil unix n
1
anvil # # Interfaces to non-Postfix software. Be sure
to examine the manual # pages of the non-Postfix software to find out what options it wants. # # maildrop. See the
Postfix MAILDROP_README file for details. # #maildrop unix n
n
pipe # flags=DRhu
user=vmail argv=/usr/local/bin/maildrop -d $recipient uucp
unix n
n
pipe flags=Fqhu
user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient) ifmail unix n
n
pipe
flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient) bsmtp unix n
n
pipe
flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -d -t$nexthop -f$sender $recipient scalemail-backend
unix-nn-2pipe flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store $
nexthop $user $extension #
only used by postfix-tls tlsmgr unix--n3001tlsmgr smtps inetn-n--smtpd -o smtpd_tls_wrappermode=yes -o
smtpd_sasl_auth_enable=yes 587 inetn-n--smtpd -o smtpd_enforce_tls=yes -o smtpd_sasl_auth_enable=yes
scache unix 1
scache discard unix discard On crée le dossier
des mails:
mkdir /home/virtual
On crée le groupe et le user vmail avec l'uid et gid 20001:
Copyright ©
Page 4/32
Installation Serveur Mail Postfix, Amavisd, Mysql, Spamassassin, Dspam, Courier-IMAP
groupadd -g 20001 vmail
Copyright ©
useradd -g vmail -u 20001 vmail -d /home/vmail -m
Page 5/32
Installation Serveur Mail Postfix, Amavisd, Mysql, Spamassassin, Dspam, Courier-IMAP
On sécurise:
chown -R vmail: /home/virtual chmod 770 /home/virtual
On crée les fichiers d'appel des tables par Postfix: /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 description 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 postmap ces fichiers
postmap /etc/postfix/mysql_virtual_alias_maps.cf postmap /etc/postfix/mysql_virtual_domains_maps.cf
postmap /etc/postfix/mysql_virtual_mailbox_maps.cf
puis on sécurise le tout:
chmod 640 mysql_* chgrp postfix mysql_*
Nous avons besoin d'un MDA (mail delivery agent) pour livrer les mails dans les boîtes. Le service de livraison
Virtual de Postfix ne convient pas totalement pour notre usage. En effet nous allons avoir besoin de capacité de
filtrage sur le MDA ainsi que la possibilté de gérer les quotas, ce que ne sait pas faire Virtual. Procmail est très bien
pour le filtrage, mais ne supporte pas les users/domaines virtuels car il ne sait pas communiquer avec une base de
données. Une methode repandue pour les quotas est l'application du patch VDA sur Postfix, option que nous ne
choisirons pas pour des raisons de fiabilité. Maildrop répond lui à nos besoins: Il s'occupera donc de la livraison
des mails dans les home. On installe d'abord les outils pour la compilation:
aptitude install bzip2 gcc libpcre3-dev libpcre++-dev courier-authlib-dev g++ libtool libmysqlclient15-dev
On télécharge les sources: wget http://heanet.dl.sourceforge.net/sourceforge/courier/maildrop-2.0.2.tar.bz2 tar jxf
maildrop-2.0.2.tar.bz2 cd maildrop-2.0.2 ./configure -prefix=/usr/local/courier --enable-maildropmysql
--with-etcdir=directory=/etc/courier --with-mysqlconfig=/etc/courier/maildropmysql.config --enable-maildrop-uid=20001
--enable-maildrop-gid=20001 --enable-maildirquota make && make install On applique les permissions correctement
sur les exécutables puis on fait un chmod 775 sur le rep /var/run/courier (juste le rep) et sur
/var/run/courier/authdaemaon (que le dossier):
chown vmail: /usr/local/courier/bin/* chmod 775 /var/run/courier/ chmod 775 /var/run/courier/authdaemon/
NOTE: sous ubuntu il faudra aussi modifier le fichier /etc/init.d/courier-authdaemon et modifier le 750 dans
chmod 750 $run_dir
par 775 On vérifie si maildrop est correctement installé (modules activés): /usr/local/courier/bin/maildrop –v devrait
Copyright ©
Page 6/32
Installation Serveur Mail Postfix, Amavisd, Mysql, Spamassassin, Dspam, Courier-IMAP
donner:
maildrop 2.0.2 Copyright 1998-2005 Double Precision, Inc. GDBM extensions enabled. Courier Authentication
Library extension enabled. Maildir quota extension enabled. This program is distributed under the terms of
the GNU General Public License. See COPYING for additional information.
On voit que l'authentification est activée, ainsi que la gestion des quotas que nous configurerons plus tard. Maildrop
est appelé par postfix au moment de la livraison. On édite le fichier /etc/courier/authdaemonrc il faut remplacer
authmodulelist="authpam" par authmodulelist="authpam authmysql" On édite le /etc/courier/authmysqlrc
MYSQL_SERVERlocalhost MYSQL_USERNAMEpostfix MYSQL_PASSWORDxxxxxx
MYSQL_SOCKET/var/run/mysqld/mysqld.sock MYSQL_PORT3306 MYSQL_OPT0 MYSQL_DATABASEpostfix
MYSQL_USER_TABLEmailbox MYSQL_CRYPT_PWFIELDpassword MYSQL_UID_FIELD'20001'
MYSQL_GID_FIELD'20001' MYSQL_LOGIN_FIELDusername MYSQL_HOME_FIELD'/home/virtual'
MYSQL_NAME_FIELDname MYSQL_MAILDIR_FIELDmaildir MYSQL_QUOTA_FIELDconcat(quota,'S') On édite
le /etc/courier/maildropmysql.config hostnamelocalhost #port3306 socket/var/run/mysqld/mysqld.sock
databasepostfix dbuserpostfix dbpwxxxxxx dbtablemailbox default_uidnumber20001
default_gidnumber20001 uid_fieldusername maildir_fieldmaildir homedirectory_fieldhomedir
uidnumber_fielduidnumber gidnumber_fieldgidnumber quota_fieldconcat(quota,'S') 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 entrainera le non fonctionnement de l'authentification. On sécurise ces fichiers:
chmod 640 /etc/courier/authmysqlrc chown vmail: /etc/courier/maildropmysql.config chmod 640
/etc/courier/maildropmysql.config
Pour que Postfix utilise Maildrop, on ajoute au main.cf:
virtual_transport = maildrop maildrop_destination_recipient_limit = 1
et au master.cf:
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
On crée /home/virtual/.mailfilter pour activer les logs et la création automatique des maildir à la livraison (postfix ne
sait pas le faire comme avec le transport par défaut "virtual"): logfile "/home/virtual/.maildrop.log" ` -d $DEFAULT ] ||
(maildirmake $DEFAULT && maildirmake -f Spam $DEFAULT && maildirmake -f sent-mail $DEFAULT &&
maildirmake -f SpamToLearn $DEFAULT && maildirmake -f SpamFalse $DEFAULT)` `test -r
$HOME/$DEFAULT.mailfilter` if( $RETURNCODE == 0 ) log "(==) Including $HOME/$DEFAULT.mailfilter"
exception include $HOME/$DEFAULT.mailfilter
chown vmail: /home/virtual/.mailfilter chmod 600 /home/virtual/.mailfilter
on redémarre le daemon d'authentification et Postfix
/etc/init.d/courier-authdaemon restart /etc/init.d/postfix restart
On teste cette première configuration de base:
authtest [email protected]
doit donner:
Authentication succeeded.
Directory: /home/virtual
Authenticated: [email protected]
Maildir: [email protected]/
$1$caea3837$gPafod/Do/8Jj5M9HehhM. Cleartext Password: (none)
Copyright ©
(uid 20001, gid 20001)
Home
Quota: 0 Encrypted Password:
Options: (none)
Page 7/32
Installation Serveur Mail Postfix, Amavisd, Mysql, Spamassassin, Dspam, Courier-IMAP
En cas d'erreur, il est fort problable que le fichier authmysqlrc soit en cause. Regarder les log /var/log/mail.log.
puis:
/usr/local/courier/bin/maildrop -V 7 -d [email protected]
cela devrait donner:
maildrop: authlib: groupid=20001 maildrop: authlib: userid=20001 maildrop: authlib:
[email protected], home=/home/virtual, [email protected]/ maildrop: Changing to
/home/virtual
CTRL + C pour sortir On vérifie que l'on peut envoyer un mail à [email protected]:
mail [email protected]
On regarde les logs pour les erreurs. note: si la commande mail n'existe pas sur le systeme (ubuntu par exemple)
l'installer avec
aptitude install mailx
Puis on teste en direct sur le port 25: (ce qu'il faut taper est précéder 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]
&#45;&nbsp;&nbsp;&#61;&#62;&nbsp; MAIL FROM: <> 250 2.1.0 Sender OK
&#45;&nbsp;&nbsp;&#61;&#62;&nbsp; RCPT TO: <[email protected]> 250 2.1.5 OK
&#45;&nbsp;&nbsp;&#61;&#62;&nbsp; DATA 354 End data with .
&#45;&nbsp;&nbsp;&#61;&#62;&nbsp; . 250 2.0.0 Ok: queued as 079474CE44
&#45;&nbsp;&nbsp;&#61;&#62;&nbsp; QUIT 221 2.0.0 Bye Connection closed by foreign host On regarde les logs
pour vérifier.
&#45;&nbsp;*NOTE: Le fichier .mailfilter crée plus haut est commun à tous les comptes et sera appliqué à chaque
mail. Si l'on veut appliquer des règles spécifiques à un utilisateur, il suffit de créer un autre fichier .mailfilter dans son
Maildir. On pourra par exemple rediriger des emails dans des répertoires spécifiques de cette facon. On verra dans
un autre article comment paramétrer le webmail Horde pour générer ces fichiers personnels. Exemple de fichier
.mailfilter personnel: #elimine les messages en provenance de l'adresse ci-dessous if( \ /^From:
.*actu@b\.linternaute\.com/:h \ ) exception to "/dev/null" ##### annonces ##### if( \ /^From:
.*alerte@avendrealouer\.fr/:h \ || /^From: .*mailing_pap@pap\.fr/:h \ || /^Sender: .*alertemail@pap\.fr/:h \ )
exception to "$DEFAULT/.annonces/"
On a déjà configuré la partie la plus importante de courier-imap, c'est à dire l'authentification mysql, dans la partie
sur maildrop. On va simplement ajouter une fonctionnalité très utile à Courier-IMAP:
&#45;&nbsp;le ENHANCEDIDLE Cela permet de rafraichir en temps réel la boîte de réception dans le client de
messagerie sans besoin de la planifier ou autre. Un nouveau message apparaitra instantanément dans le client.
Attention:
&#45;&nbsp;* il faut que le client de messagerie supporte cette fonction. C'est le cas d'Outlook et de Thunderbird.
&#45;&nbsp;* Pour fonctionner cela utilise FAM, le File ALteration Monitor. Sur des serveurs avec de très
nombreuses boîtes email cela peut être un problème pour les performances. Il faut donc activer cette fonction en
connaissance de cause et surveiller la charge au fil du temps. De plus FAM a tendance à planter sur de très grosse
manipulation sur les boîtes (avec plusieurs milliers de mail). Dans ce cas de figure, Courier-Imap continuera à
fonctionner sans problème (mais sans le temps reel bien sur) et des messages d'erreurs apparaitront dans mail.log
jusqu'au redemarrage de FAM. Il peut donc être judicieux de surveiller le process FAM et de le relancer
autiomatiquement en cas d'arrêt. (un module Webmin fait c'a très correctement) Pour activer la fonction, rechercher
Copyright ©
Page 8/32
Installation Serveur Mail Postfix, Amavisd, Mysql, Spamassassin, Dspam, Courier-IMAP
ces paramètres dans /etc/courier/imapd et mettre leur valeur à 1 (IMAP_USELOCKS devrait déjà être sur 1 par
défaut)
IMAP_USELOCKS=1 IMAP_ENHANCEDIDLE=1
On redémarre ensuite le daemon d'authentification et courier-imap:
/etc/init.d/courier-authdaemon restart /etc/init.d/courier-imap restart
Pour activer le SSL sur l'imap, il faut simplement lancer le daemon courier-imap-ssl, la création du certificat ayant
été faite automatiquement lors de l'installation par les paquets Debian.
/etc/init.d/courier-imap-ssl restart
On teste la connection depuis un client mail (outlook, thunderbird..) Ne pas oublier de spécifier
[email protected] comme login de la boite et non 'user' 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. Notes:
&#45;&nbsp;Par défaut IMAP est configuré pour démarrer au maximum 40 serveurs IMAP. Cela permettra à 40
utilisateurs de se connecter simultanément. (MAXDAEMONS=40) Par default, il limite également à 20 le nombre
d'utilisateurs simultanés depuis la même IP. (MAXPERIP=20) On modifiera donc ces paramètres en fonction du
nombre de boites email.
&#45;&nbsp;/etc/courier/imapd contient des paramètres généraux de configuration qui s'appliqueront égalemment à
imap-ssl. (par exemple le ENHANCEDIDLE) Cependant le nombre de daemons et de connections par IP se
configure indépendamment dans /etc/courier/imapd et /etc/courier/imapd-ssl.
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
avec le contenu suivant: auth required pam_mysql.so user=postfix passwd=yourpass host=127.0.0.1 db=postfix
table=mailbox usercolumn=username passwdcolumn=password crypt=1 md5=1 account sufficient pam_mysql.so
user=postfix passwd=yourpass host=127.0.0.1 db=postfix table=mailbox usercolumn=username
passwdcolumn=password crypt=1 md5=1 "yourpass" est le password d'accès à la table Postfix par le user postfix
On sécurise ce fichier car le password est stocké en clair:
chmod 640 /etc/pam.d/smtp
On crée le fichier /etc/postfix/sasl/smtpd.conf avec le contenu suivant:
pwcheck_method: saslauthd mech_list: PLAIN LOGIN log_level: 5
On édite le /etc/default/saslauthd comme ceci:
START=yes MECHANISMS="pam" OPTIONS="-c -r -m /var/spool/postfix/var/run/saslauthd"
On crée le repertoire du socket et on lui donne les droits adaptés:
mkdir /var/spool/postfix/var/
mkdir /var/spool/postfix/var/run/
mkdir
/var/spool/postfix/var/run/saslauthd chown -R root:sasl /var/spool/postfix/var/ chmod 770
/var/spool/postfix/var/run/saslauthd adduser postfix sasl
On crée un lien symbolique au cas oà¹:
Copyright ©
Page 9/32
Installation Serveur Mail Postfix, Amavisd, Mysql, Spamassassin, Dspam, Courier-IMAP
ln -s /var/spool/postfix/var/run/saslauthd /var/run/saslauthd
Copyright ©
Page 10/32
Installation Serveur Mail Postfix, Amavisd, Mysql, Spamassassin, Dspam, Courier-IMAP
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 indiquer) :
..... 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/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
On crée le 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: starbridge.org On laisse "challenge password" vide.
openssl x509 -req -days 3650 -in smtpd.csr -signkey smtpd.key -out smtpd.crt
-out smtpd.key.unencrypted
mv -f smtpd.key.unencrypted smtpd.key
openssl rsa -in smtpd.key
openssl req -new -x509 -extensions
v3_ca -keyout cakey.pem -out cacert.pem -days 3650
On ajoute ceci au /etc/postfix/main.cf:
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
On redémarre Postfix:
/etc/init.d/postfix restart
On vérifie le fonctionnement 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 @starbridge.org). Pour le type
d'authentication, il faut sélectionner "en clair" (le terme dépend du client mail). C'est le chiffrage de la connection par
le TLS qui sécurisera le transfert du password. C'est pour cela qu'il ne faut pas dissocier TLS et
authentification.
Copyright ©
Page 11/32
Installation Serveur Mail Postfix, Amavisd, Mysql, Spamassassin, Dspam, Courier-IMAP
Pour faciliter la création des users et la gestion des boîtes et des comptes, on utilise postfixadmin. La dernière
version est la 2.1.0: cd /var/www wget
http://belnet.dl.sourceforge.net/sourceforge/postfixadmin/postfixadmin-2.1.0.tgz tar xvzf postfixadmin-2.1.0.tgz mv
postfixadmin-2.1.0 postfixadmin chown -R www-data: /var/www/postfixadmin cd postfixadmin chmod 640 *.php *.css
cd /var/www/postfixadmin/admin/ chmod 640 *.php .ht* cd /var/www/postfixadmin/images/ chmod 640 *.gif *.png cd
/var/www/postfixadmin/languages/ chmod 640 *.lang cd /var/www/postfixadmin/templates/ chmod 640 *.tpl cd
/var/www/postfixadmin/users/ chmod 640 *.php cd /var/www/postfixadmin/ mv config.inc.php.sample config.inc.php
on édite le config.php: <?php // // Postfix Admin // by Mischa Peters // Copyright (c) 2002 - 2005 High5! // License
Info: http://www.postfixadmin.com/?file=LICENSE.TXT // // File: config.inc.php // if (ereg ("config.inc.php",
$_SERVER['PHP_SELF'])) header ("Location: login.php"); exit; // Postfix Admin Path // Set the location to your
Postfix Admin installation here. $CONF['postfix_admin_url'] = '../postfixadmin'; $CONF['postfix_admin_path'] =
'/var/www/postfixadmin'; // Language config // Language files are located in './languages'. $CONF['default_language']
= 'en'; // Database Config // mysql = MySQL 3.23 and 4.0 // mysqli = MySQL 4.1 // pgsql = PostgreSQL
$CONF['database_type'] = 'mysql'; $CONF['database_host'] = 'localhost'; $CONF['database_user'] = 'postfix';
$CONF['database_password'] = '*****'; $CONF['database_name'] = 'postfix'; $CONF['database_prefix'] = ''; // Site
Admin // Define the Site Admins email address below. // This will be used to send emails from to create mailboxes.
$CONF['admin_email'] = '[email protected]'; // Mail Server // Hostname (FQDN) of your mail server. // This
is used to send email to Postfix in order to create mailboxes. $CONF['smtp_server'] = 'localhost'; $CONF['smtp_port']
= '25'; // Encrypt // In what way do you want the passwords to be crypted? // md5crypt = internal postfix admin md5 //
system = whatever you have set as your PHP system default // cleartext = clear text passwords (ouch!)
$CONF['encrypt'] = 'md5crypt'; // Generate Password // Generate a random password for a mailbox and display it. //
If you want to automagically generate paswords set this to 'YES'. $CONF['generate_password'] = 'NO'; // Page Size
// Set the number of entries that you would like to see // in one page. $CONF['page_size'] = '10'; // Default Aliases //
The default aliases that need to be created for all domains. $CONF['default_aliases'] = array ( 'abuse' =>
'[email protected]', 'hostmaster' => '[email protected]', 'postmaster' => '[email protected]',
'webmaster' => '[email protected]' ); // Mailboxes // If you want to store the mailboxes per domain set this
to 'YES'. // Example: /usr/local/virtual/domain.tld/[email protected] $CONF['domain_path'] = 'NO'; // If you don't
want to have the domain in your mailbox set this to 'NO'. // Example: /usr/local/virtual/domain.tld/username
$CONF['domain_in_mailbox'] = 'YES'; // Default Domain Values // Specify your default values below. Quota in MB.
$CONF['aliases'] = '0'; $CONF['mailboxes'] = '0'; $CONF['maxquota'] = '500'; // Quota // When you want to enforce
quota for your mailbox users set this to 'YES'. $CONF['quota'] = 'YES'; // You can either use '1024000' or '1048576'
$CONF['quota_multiplier'] = '1024000'; // Transport // If you want to define additional transport options for a domain
set this to 'YES'. // Read the transport file of the Postfix documentation. $CONF['transport'] = 'YES'; // Virtual
Vacation // If you want to use virtual vacation for you mailbox users set this to 'YES'. // NOTE: Make sure that you
install the vacation module. http://high5.net/postfixadmin/ $CONF['vacation'] = 'YES'; // This is the autoreply domain
that you will need to set in your Postfix // transport maps to handle virtual vacations. It does not need to be a // real
domain (i.e. you don't need to setup DNS for it). $CONF['vacation_domain'] = 'autoreply.starbridge.org'; // Alias
Control // Postfix Admin inserts an alias in the alias table for every mailbox it creates. // The reason for this is that
when you want catch-all and normal mailboxes // to work you need to have the mailbox replicated in the alias table. //
If you want to take control of these aliases as well set this to 'YES'. $CONF['alias_control'] = 'NO'; // Special Alias
Control // Set to 'NO' if you don't want your domain admins to change the default aliases.
$CONF['special_alias_control'] = 'YES'; // Logging // If you don't want logging set this to 'NO'; $CONF['logging'] =
'YES'; // Header $CONF['show_header_text'] = 'NO'; $CONF['header_text'] = ':: Postfix Admin ::'; // Footer // Below
information will be on all pages. // If you don't want the footer information to appear set this to 'NO'.
$CONF['show_footer_text'] = 'YES'; $CONF['footer_text'] = 'Return to starbridge.org'; $CONF['footer_link'] =
'http://www.starbridge.org/postfixadmin'; // Welcome Message // This message is send to every newly created
mailbox. // Change the text between EOM. $CONF['welcome_text'] = <<<EOM Hi, Welcome to your new account.
EOM; // // END OF CONFIG FILE // ?> On sécurise ce fichier:
chown -R www-data: /var/www/postfixadmin/config.inc.php chmod 640 config.inc.php
[rouge]IMPORTANT !!!: On crée un .htaccess pour sécuriser l'accès au répertoire admin.[/rouge] On se
connecte à l'interface: http://starbridge.org/postfixadmin/admin (bien sur on remplace starbridge par votre domaine
Copyright ©
Page 12/32
Installation Serveur Mail Postfix, Amavisd, Mysql, Spamassassin, Dspam, Courier-IMAP
sinon vous vous connectez chez moi !!) On retrouve les élements entrés en ligne de commande au début du
document. On crée un nouvel utilisateur pour valider
&#45;&nbsp;bug d'affichage: pour le problème d'affichage des menus en francais il faut éditer le fichier
stylesheet.css puis rechercher:
#menu width: 750px;
et changer 750 par 1200
&#45;&nbsp;bug d'envoi de l'email: la version 2.1.0 envoie incorrectement l'email de confirmation de la création de la
boite. (pipelining). Editer le function.inc.php. Modifier toute la section function smtp_mail par: function smtp_mail
($to, $from, $data) global $CONF; $smtpd_server = $CONF['smtp_server']; $smtpd_port = $CONF['smtp_port'];
$smtp_server = $_SERVER["SERVER_NAME"]; $errno = "0"; $errstr = "0"; $timeout = "30";
$fh =
@fsockopen ($smtpd_server, $smtpd_port, $errno, $errstr, $timeout);
if (!$fh) return false; else fputs ($fh, "EHLO
$smtp_server\r\n");
$res = smtp_get_response($fh);
fputs ($fh, "MAIL FROM:<$from>\r\n");
$res =
smtp_get_response($fh);
fputs ($fh, "RCPT TO:<$to>\r\n");
$res = smtp_get_response($fh);
fputs ($fh,
"DATA\r\n");
$res = smtp_get_response($fh);
fputs ($fh, "$data\r\n.\r\n");
$res =
smtp_get_response($fh);
fputs ($fh, "QUIT\r\n");
$res = smtp_get_response($fh);
fclose ($fh); return
true; // // smtp_get_response // Action: Get response from mail server // Call: smtp_get_response (string FileHandle)
// function smtp_get_response ($fh) $res =''; do $line = fgets($fh, 256);
$res .= $line; while
(preg_match("/^\d\d\d\-/", $line)); return $res; [rouge]On rappelle que l'utilisation du SSL pour se connecter à
Postfixadmin est INDISPENSABLE si on doit passer par internet pour gérer la plateforme. Sur un réseau
local son utilisation serait préferable.[/rouge]
On l'a vu, on a compilé maildrop avec la gestion des quotas et on a parametré dans la base SQL des champs pour
les gérer. Il faut maintenant les paramétrer: On crée un message d'alerte générique pour le dépassement de quotas:
vi /etc/courier/quotawarnmsg
From: Postmaster domain.tld <[email protected]> Reply-To: [email protected] To: Valued Customer:;
Subject: Mail quota warning Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 7bit Your mailbox on the server is now more than 90% full. So that you can continue to
receive mail you need to remove some messages from your mailbox. Le reste est déjà paramétré dans maildrop,
postfix et courier-imap. Pour une explication détaillée du fonctionnement voir [cet article: Il suffit d'utiliser
postfixadmin pour régler un quota pour un utilisateur. On teste en envoyant un mail. On regarde les logs. On vérifie
qu'un fichier maildirsize soit bien crée dans le Maildir du destinataire. Voila le serveur est configuré ! A ce stade le
serveur est securisé mais ne filtre ni les virus, ni le spam.
parametrage 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 ne
détaillera pas ici les actions précises de chaque règle. (la documentation de Postfix est très précise sur le sujet). On
édite le 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
Copyright ©
Page 13/32
Installation Serveur Mail Postfix, Amavisd, Mysql, Spamassassin, Dspam, Courier-IMAP
proxy:mysql:/etc/postfix/mysql-client.cf, reject_rbl_client list.dsbl.org, reject_rbl_client zen.spamhaus.org,
permit On le voit, on a aussi paramétré des RBL (des blacklists) qui filtrent assez efficacement (parfois trop).
- * ATTENTION: Il existe d'autres RBL (Spamcop...) qui peuvent rendre le filtrage encore plus restrictif mais cela est
à déconseiller sur un serveur en production, bien que l'on puisse se servir des tables ci dessous (mysql-sender.cf et
mysql-client.cf) pour whitelister certains clients ou expéditeurs). Il vaut mieux gérer les RBL supplémentaires au
travers d'une Policy Service de Postfix qui permettra plus de souplesse. (On détaillera ce point dans un autre article)
- Ensuite il faut limiter les possibilité de spoofing des expéditeurs en vérifiant les MAIL FROM (adresses
expéditrices). Toujours dans le main.cf, on met 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 Cela permettra d'empécher des utilisateurs
de mettre une autre adresse email dans le MAIL FROM. Ils seront obligés de passer par les domaines que l'on gère.
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. (on détaillera ce fonctionnement dans le document sur la gestion du serveur).
- Il faut maintenant créer les fichiers de lookup:
- ** On crée le fichier /etc/postfix/internal_networks: On spécifie son réseau local et son adresse publique à
l'intérieur. Cala 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 egalement de préciser les IP autorisées à envoyer un mail en se
présentant avec notre HELO. On bloquera 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
On postmap ce fichier:
postmap /etc/postfix/internal_networks
- ** Ensuite on crée le fichier /etc/postfix/mysql-hello.cf qui appelle une table SQL. Celle-ci contiendra les HELO de
nos domaines email (on peut en posséder plusieurs dans le cas d'un serveur multidomaine):
user = postfix password = **** hosts = localhost dbname = postfix table = postfix_hello select_field =
access where_field = source
On postmap ce fichier et on sécurise:
postmap /etc/postfix/mysql-hello.cf 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:
user = postfix password = **** hosts = localhost dbname = postfix table = postfix_access select_field =
access where_field = source additional_conditions = and type = 'sender'
On postmap ce fichier et on sécurise:
postmap /etc/postfix/mysql-sender.cf 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):
Copyright ©
Page 14/32
Installation Serveur Mail Postfix, Amavisd, Mysql, Spamassassin, Dspam, Courier-IMAP
user = postfix password = ***** hosts = localhost dbname = postfix table = postfix_access select_field =
access where_field = source additional_conditions = and type = 'client'
Copyright ©
Page 15/32
Installation Serveur Mail Postfix, Amavisd, Mysql, Spamassassin, Dspam, Courier-IMAP
On postmap ce fichier et on sécurise:
postmap /etc/postfix/mysql-client.cf 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:
user = postfix password = ***** hosts = localhost dbname = postfix query = SELECT goto FROM alias WHERE
address='%s'
On remarquera que l'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) On
postmap ce fichier et on sécurise:
postmap /etc/postfix/mysql-sasl-sender-check.cf 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)
starbridge.orgOK <>
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é.
starbridge.org
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 -u root -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, 'starbridge.org',
'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, '[email protected]', '554 Spam not
tolerated here', 'sender'); On relance postfix
postfix reload
on vérifie les logs et on teste. On a inséré des exemples de blacklist et de whitelist. Tout le détail du
Copyright ©
Page 16/32
Installation Serveur Mail Postfix, Amavisd, Mysql, Spamassassin, Dspam, Courier-IMAP
fonctionnement se trouve dans le document gestion serveur de mail. 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, 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é (economie 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 precautions. On crée les fichiers nécessaires:
/etc/postfix/body_checks.cf /etc/postfix/header_checks.cf /etc/postfix/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:
postfix reload
On teste en envoyant un mail classique puis un autre qui contient un des mots ou type bloqué par ces règles. Le
blocage est immédiat et se traduit par un retour d'erreur au moment de l'envoi.
on installe les prérequis:
aptitude install libdb4.4-dev
On lance CPAN en console:
perl -MCPAN -e shell
Si c'est la première fois on repond par défaut aux questions qu'il pose pour la configuration de l'interface. Puis on
installe les modules: (install NOM_DU_MODULE)
Archive::Zip
Convert::TNEF
Convert::UUlib Net::Server
Time::HiRes
Unix::Syslog
BerkeleyDB
On installe aussi les softs nécessaires (les decoders ) si ils ne sont pas déjà installés:
aptitude install file libcompress-bzip2-perl nomarch arc p7zip-full arj zoo lzop freeze tnef pax
cabextract
Il est très important également d'install RAR depuis le site de rarlabs. Suivre les instructions d'installation sur le site.
Télécharger les sources chez amavisd:
wget http://www.ijs.si/software/amavisd/amavisd-new-2.5.2.tar.gz tar xvzf amavisd-new-2.5.2.tar.gz cd
amavisd-new-2.5.2
Créer le user et le groupe amavis:
addgroup amavis adduser --disabled-password --home /var/amavis --ingroup amavis amavis
Créer un home pour le user amavis :
mkdir /var/amavis mkdir /var/amavis/tmp /var/amavis/var /var/amavis/db /var/amavis/home chown -R amavis:
/var/amavis
On crée 2 lecteur tmpfs pour héberger les répertoires db et tmp d'amavis. Cela accroit notablement les performance
de traitement: Modifier /etc/fstab :
tmpfs /var/amavis/db tmpfs rw,size=10m,mode=700,uid=amavis,gid=amavis
rw,size=150m,mode=700,uid=amavis,gid=amavis
0 0 tmpfs /var/amavis/tmp tmpfs
0 0
Puis:
Copyright ©
Page 17/32
Installation Serveur Mail Postfix, Amavisd, Mysql, Spamassassin, Dspam, Courier-IMAP
mount tmpfs
Copyright ©
Page 18/32
Installation Serveur Mail Postfix, Amavisd, Mysql, Spamassassin, Dspam, Courier-IMAP
on verifie par un
mount -l
Copier l'exécutable:
cp amavisd /usr/local/sbin/ chown root /usr/local/sbin/amavisd chmod 755
/usr/local/sbin/amavisd
Copier le fichier de conf:
cp amavisd.conf /etc/ chown root:amavis /etc/amavisd.conf chmod 640 /etc/amavisd.conf
Créer la quarantaine:
mkdir /var/virusmails
chown amavis:amavis /var/virusmails
chmod 750 /var/virusmails
Editer le /etc/amavisd.conf: Ci dessous les paramètres à modifier. Le reste du fichier reste le même. Evidemment il
faut bien préciser son reseau local dans @mynetworks:
$daemon_user
= 'amavis';
$daemon_group = 'amavis';
'mail.starbridge.org'; $MYHOME = '/var/amavis';
[FE80::]/10 [FEC0::]/10
$mydomain = 'starbridge.org';
$myhostname =
$log_level = 2; @mynetworks = qw( 127.0.0.0/8 ::1]
10.0.0.0/24 );
On désactive temporairement l'antispam et l'antivirus pour tester: On décommente pour cela les lignes:
@bypass_virus_checks_maps = (1);
@bypass_spam_checks_maps
= (1);
Démarrer amavisd en console pour voir si il manque des prérequis:
/usr/local/sbin/amavisd debug
Noter les erreurs éventuelles. Si amavisd ne démarre pas, arréter la et résoudre les problemes. Si c'est ok, arréter
amavisd par CTRL + C. On configure Postfix: A la fin du 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 et dans le main.cf content_filter =
smtp-amavis:[127.0.0.1]:10024 receive_override_options = no_address_mappings Relancer postfix:
postfix reload
Surveiller les logs:
tail -f /var/log/mail.log
Si tout est ok, lancer à nouveau amavisd debug
et taper en console:
telnet 127.0.0.1 10024
Il doit répondre:
220 [127.0.0.1] ESMTP amavisd-new service ready ... ..
Copyright ©
Page 19/32
Installation Serveur Mail Postfix, Amavisd, Mysql, Spamassassin, Dspam, Courier-IMAP
quit pour sortir Pareil pour tester le retour de postfix:
telnet 127.0.0.1 10025
Il doit répondre un truc du style :
220 mail.example.com ESMTP Postfix (2.3.2)
Si les connections sont ok: Tester le fonctionnement de base (ce qu'il faut taper est préceder de
-&nbsp;&#61;&#62;&nbsp; , le reste c'est le retour du serveur):
&#45;&nbsp;&nbsp;&#61;&#62;&nbsp; telnet localhost 10024 220 [127.0.0.1] ESMTP amavisd-new service ready
&#45;&nbsp;&nbsp;&#61;&#62;&nbsp; HELO localhost 250 [127.0.0.1]
&#45;&nbsp;&nbsp;&#61;&#62;&nbsp; MAIL FROM: <> 250 2.1.0 Sender <> OK
&#45;&nbsp;&nbsp;&#61;&#62;&nbsp; RCPT TO: 250 2.1.5 Recipient OK
&#45;&nbsp;&nbsp;&#61;&#62;&nbsp; DATA 354 End data with .
&#45;&nbsp;&nbsp;&#61;&#62;&nbsp; From: virus-tester
&#45;&nbsp;&nbsp;&#61;&#62;&nbsp; To: undisclosed-recipients:;
&#45;&nbsp;&nbsp;&#61;&#62;&nbsp; Subject: amavisd test - simple - no spam test pattern
&#45;&nbsp;&nbsp;&#61;&#62;&nbsp; This is a simple test message from the amavisd-new test-messages.
&#45;&nbsp;&nbsp;&#61;&#62;&nbsp; . 250 2.6.0 Ok, id=30897-02, from MTA([127.0.0.1]:10025): 250 2.0.0 Ok:
queued as 079474CE44
&#45;&nbsp;&nbsp;&#61;&#62;&nbsp; QUIT 221 2.0.0 [127.0.0.1] amavisd-new closing transmission channel
L'aller-retour postfix/amavisd fonctionne bien ! Prérequis:
aptitude install zlib1g zlib1g-dev libgmp3 libgmp3-dev
Pour optimiser les performances de Clam, la base virale peut être localisée sur un ramdisk: Il faut créer une lecteur
tmpfs: Modifier /etc/fstab :
tmpfs
0
/var/lib/clamav
tmpfs
rw,noexec,size=30m,mode=777,uid=amavis,gid=amavis
0
Puis:
mkdir /var/lib/clamav mount tmpfs
On compile depuis les sources:
wget http://mesh.dl.sourceforge.net/sourceforge/clamav/clamav-0.91.1.tar.gz
tar xvzf clamav-0.91.1.tar.gz
cd clamav-0.91.1 ./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
Modifier le fichier de configuration de Clam comme celui (attention de nouvelles options existent qui n'apparaissent
pas dans mon exemple, l'état par défaut leur sera donc appliqué):
* [/etc/clamd.conf Modifier le fichier de
configuration freshclam pour la mise à jour automatique de l'antivirus en particulier la ligne UpdateLogFile.
*
/etc/freshclam.conf Créer 2 taches cron pour la mise à jour : /etc/cron.d/freshclam
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root
0 0,6,12,18 * * * amavis
/usr/local/bin/freshclam --log-verbose --log-verbose @reboot amavis /usr/local/bin/freshclam
Créer :
mkdir /var/log/clamav chown -R amavis:amavis /var/log/clamav
Creer un /etc/init.d/clamd #!/bin/sh # clamd case "$1" in 'start') /usr/local/sbin/clamd ;; 'stop') /usr/bin/killall clamd >
Copyright ©
Page 20/32
Installation Serveur Mail Postfix, Amavisd, Mysql, Spamassassin, Dspam, Courier-IMAP
/dev/null 2>&1 && echo -n 'Clamd stopped' ;; *) echo "Usage: $0 start | stop " ;; esac exit 0 puis:
chmod 755 /etc/init.d/clamd update-rc.d clamd defaults
On fait la mise à jour de la base virale:
freshclam
On vérifie que les fichiers soient bien présents dans le répertoire:
ls -la /var/lib/clamav
On lance clamd:
/etc/init.d/clamd start
Et on vérifie les logs:
tail -f /var/log/clamav/clamd.log
Et on vérifie bien que Clam tourne:
ps aux | grep clam
On teste le fonctionnement (le dossier "test" est dans le répertoire clamav-0.91rc2) :
cd test clamdscan -l scan.txt clamav-x.yz
clamav-x.yz etant un fichier présent dans le répertoire test On installe SA par CPAN
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::Resolver::Programmable install Error install NetAddr::IP install IP::Country::Fast install
Mail::SPF install DBI install DBD::mysql install Mail::SpamAssassin
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. On édite le /etc/mail/spamassassin/local.cf comme ceci: lock_method flock
required_score4.3 rewrite_header Subject *****SPAM***** report_safe 0 internal_networks 82.239.58.131
10.0.0/24 192.168.1/24 use_bayes 1 bayes_auto_expire 0 bayes_store_module
Mail::SpamAssassin::BayesStore::MySQL bayes_sql_dsn DBI:mysql:spam:localhost bayes_sql_usernamespam
bayes_sql_password***** bayes_sql_override_usernameamavis bayes_auto_learn 1
bayes_auto_learn_threshold_nonspam 0.1 bayes_auto_learn_threshold_spam
5.0 use_auto_whitelist0
skip_rbl_checks 0 dns_available yes ## Optional Score Increases score BAYES_99 4.300 score BAYES_80 3.000
score HTML_60_70 0.527 0.100 0.200 0.200 score HTML_SHOUTING3 0.108 0.333 0.1 0.1 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 On
sécurise:
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: On crée la base: mysql -u
root -p create database spam; GRANT SELECT, INSERT, UPDATE, DELETE ON spam.* TO 'spam'@'localhost'
IDENTIFIED BY '*****'; FLUSH PRIVILEGES; quit on importe la base sql:
Copyright ©
Page 21/32
Installation Serveur Mail Postfix, Amavisd, Mysql, Spamassassin, Dspam, Courier-IMAP
wget http://spamassassin.apache.org/full/3.2.x/dist/sql/bayes_mysql.sql wget
http://spamassassin.apache.org/gtube/gtube.txt mysql -u root -p spam < bayes_mysql.sql
Copyright ©
Page 22/32
Installation Serveur Mail Postfix, Amavisd, Mysql, Spamassassin, Dspam, Courier-IMAP
On initialise la base:
su amavis -c 'sa-learn -D --spam gtube.txt'
On peut vérifier avec phpmyadmin que la base s'est bien remplie. On améliore les performances de la base en
changeant le moteur en InnoDB: 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. Il faut donc créer une tache cron quotidienne pour
effectuer ceci:
su -c 'sa-learn --force-expire --sync' amavis
un crontab de l'user amavis fera l'affaire :
16 3 * * * sa-learn --sync --force-expire
- *SA est prêt et fonctionnel !! Il faut maintenant activer SA dans amavisd: On édite amavisd.conf et on commente
la ligne:
# @bypass_spam_checks_maps
= (1);
On démarre 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
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 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; 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. On crée un fichier /etc/init.d/amavis:
#!/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 puis:
chmod 755 /etc/init.d/amavis update-rc.d amavis defaults
on lance amavisd:
/etc/init.d/amavis start
On regarde les 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: On
édite /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 &&
Copyright ©
Page 23/32
Installation Serveur Mail Postfix, Amavisd, Mysql, Spamassassin, Dspam, Courier-IMAP
maildirmake -f SpamToLearn $DEFAULT && maildirmake -f SpamFalse $DEFAULT)` if ( /^X-Spam-Level:
\*\*\*\*\*\*\*\*\*\*/ ) log "&nbsp;&#61;&#62;&nbsp; X-Spam-toohigh." exception to
/home/virtual/[email protected]/ if ( /^X-Spam-Flag: YES/ ) log "&nbsp;&#61;&#62;&nbsp; X-Spam-Flag-ed."
to $HOME/$DEFAULT.Spam `test -r $HOME/$DEFAULT.mailfilter` if( $RETURNCODE == 0 ) log "(==) Including
$HOME/$DEFAULT.mailfilter"
exception include $HOME/$DEFAULT.mailfilter
&#45;&nbsp;Explications: Le premier If permet d'envoyer le spam dont le score est au dessus de 10 dans une boite
spécifique spamtrap qu'il faut créer (on peut utiliser postfixadmin pour ca). Le deuxième If permet d'envoyer le
spam en dessous de 10 dans le dossier Spam de l'utilisateur.
&#45;&nbsp;*Pour améliorer l'apprentissage, on crée une tache qui scanne la boîte spamtrap et les 2 dossiers
d'apprentissage SpamToLearn et SpamFalse des boîtes des utilisateurs (Dossiers crées automatiquement par
maildrop à la premiere livraison) puis envoie leur contenu vers le filtre bayesien: On crée d'abord 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
on crée un fichier /etc/sa-learn:
#!/bin/bash mv /home/virtual/[email protected]/new/* /home/spamtrap/ mv
/home/virtual/[email protected]/cur/* /home/spamtrap/ mv /home/virtual/*/.SpamToLearn/cur/*
/home/spamtrap/ mv /home/virtual/*/.SpamToLearn/new/* /home/spamtrap/ mv /home/virtual/*/.SpamFalse/new/*
/home/hamtrap/ mv /home/virtual/*/.SpamFalse/cur/* /home/hamtrap/ chown amavis:amavis /home/spamtrap/*
chown amavis:amavis /home/hamtrap/* chmod 777 /home/spamtrap/* chmod 777 /home/hamtrap/* 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/* rm /home/hamtrap/*
puis:
chmod 755 /etc/sa-learn
On crée 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)
/etc/sa-learn
Tout sera automatique. Il suffira d'indiquer aux utilisateurs de déplacer les emails non détectés comme Spam dans
le dossier SpamToLearn et les email légitimes détectés à tort comme Spam dans le Dossier SpamFalse. Le script
déplacera lors de son execution tous ces emails et en fera l'apprentissage soit comme spam soit comme ham (non
spam) Par sécurité on peut conserver les mails de la boite spamtrap (non consultables par les utilisateurs) un
certain temps. Pour cela il suffira de changer les 2 premieres lignes en copie au lieu d'un deplacement (cp). On verra
plus loin pour un script de nettoyage basé sur l'age des fichiers. On peut egalement enlever le
-D
des 2 lignes sa-learn pour limiter la sortie du script (debug). Cron envoie un mail a l'execution de la commande,
contenant la sortie. Activation de Clam dans Amavisd On paramètre ensuite l'antivirus pour fonctionner avec
amavisd: On édite le 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',
Copyright ©
\&ask_daemon, ["CONTSCAN \n",
Page 24/32
Installation Serveur Mail Postfix, Amavisd, Mysql, Spamassassin, Dspam, Courier-IMAP
"/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$/ ], ); Et on commente:
@bypass_virus_checks_maps = (1);
On relance amavisd:
/etc/init.d/amavis stop && /etc/init.d/amavis start
L'antivirus est chargé. On crée l'alias email: [email protected] vers [email protected]. On teste le
fonctionnement: &nbsp;&#61;&#62;&nbsp; $ telnet 127.0.0.1 10024
Trying 127.0.0.1...
Connected to
127.0.0.1.
Escape character is '^]'.
220 [127.0.0.1] ESMTP amavisd-new service ready
&nbsp;&#61;&#62;&nbsp; MAIL FROM:<[email protected]> 250 2.1.0 Sender [email protected] OK
&nbsp;&#61;&#62;&nbsp; RCPT TO: 250 2.1.5 Recipient postmaster OK &nbsp;&#61;&#62;&nbsp; DATA
354
End data with . &nbsp;&#61;&#62;&nbsp; Subject: test2 - virus test pattern &nbsp;&#61;&#62;&nbsp;
&nbsp;&#61;&#62;&nbsp; X5O!P%@AP[4\PZX54(P^)7CC)7$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
&nbsp;&#61;&#62;&nbsp; . &nbsp;&#61;&#62;&nbsp; QUIT
221 2.0.0 [127.0.0.1] (amavisd) closing
transmission channel
Connection closed by foreign host. On doit voir dans les logs:
Blocked INFECTED (Eicar-Test-Signature)
On peut aussi tester l'envoi d'un mail infecté dans une archive (pour tester le travail de décompression) en
récuperant des fichiers de test sur eicar.com et en les envoyant par email. Maintenance de Clam et de
Spamassassin: Il faut penser à purger régulierement le contenu de la boite spamtrap et la quarantaine de clam,
c'est à dire le dossier /home/virtual/[email protected]/new/. et le /var/virusmails. Pour cela on peut utiliser
un outil du genre tmpreaper. Il se configure très simplement dans /etc/tmpreaper.conf On modifie la ligne suivante
comme ceci:
TMPREAPER_DIRS='/tmp/. /var/virusmails/. /home/virtual/[email protected]/new/.'
Beaucoup considere Dspam comme une alternative plus performante de SA. Je trouve qu'ils sont plutot
complémentaires. Amavisd permet de gerer les 2 en parallele.
wget http://dspam.nuclearelephant.com/sources/dspam-3.8.0.tar.gz tar xvzf dspam-3.8.0.tar.gz cd
dspam-3.8.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
Modifier les droits sur les exécutables (meme user 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éer la base sql: mysql -u root -p create database dspam; GRANT SELECT, INSERT, UPDATE, DELETE ON
dspam.* TO 'dspam'@'localhost' IDENTIFIED BY '******'; FLUSH PRIVILEGES; quit On importe la base sql:
mysql -u root -p dspam < /root/dspam-3.8.0/src/tools.mysql_drv/mysql_objects-4.1.sql
Modifier le dspam.conf : [exemple de fichier fonctionnel On modifie ou on ajoute les lignes suivantes:
Trust amavis MySQLServer
****** MySQLDb
/var/run/mysqld/mysqld.sock #MySQLPort MySQLUser
dspam MySQLPass
dspam #MySQLCompresstrue
Créer le répertoire de dspam dans le home d'amavisd :
Copyright ©
Page 25/32
Installation Serveur Mail Postfix, Amavisd, Mysql, Spamassassin, Dspam, Courier-IMAP
mkdir /var/amavis/dspam chown -R amavis: /var/amavis/dspam
Copyright ©
Page 26/32
Installation Serveur Mail Postfix, Amavisd, Mysql, Spamassassin, Dspam, Courier-IMAP
Pour activer dspam, il faut décommenter la ligne suivante dans amavisd.conf:
# $dspam = 'dspam';
- *Précision: La version de amavisd 2.5.0 (et anterieures) ne fonctionnait pas correctement avec dspam 3.8.0. Mise
à Jour: Le problème est corrigé partir de la version amavisd 2.5.1 donc il n'est plus necessaire d'effectuer la
modification ci dessous si on utilise cette version Le paramètre Feature chained n'existe plus . Le problème est
qu'amavisd appelle en dur ce paramètre en ligne de commande. Il faut éditer le fichier /usr/local/sbin/amavisd:
Rechercher :
--feature=chained,noise
Et le remplacer par:
--feature=noise
--tokenizer=chained
Une fois cette modification faite, on relance amavisd:
/etc/init.d/amavis stop && /etc/init.d/amavis start
On vérifie les logs. On doit voir:
Found $dspam
at /usr/local/bin/dspam
On envoie un email: On vérifie les 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 suivant
la valeur de tag. 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 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
On peut ameliorer les performances de la base en changeant le moteur en InnoDB
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;
On crée les taches de maintenance de dspam: une tache cron avec le user amavis:
/usr/bin/mysql -u dspam -p'******' dspam
< /root/dspam-3.8.0/src/tools.mysql_drv/purge-4.1.sql
Et on modifie le fichier /root/dspam-3.8.0/src/tools.mysql_drv/purge-4.1.sql: On ajoute à la fin
START TRANSACTION; optimize table dspam_signature_data, dspam_token_data; COMMIT;
On crée une tache cron de purge des log avec le user amavis:
/usr/local/bin/dspam_logrotate -a 30 -v -d /var/amavis/dspam
Copyright ©
Page 27/32
Installation Serveur Mail Postfix, Amavisd, Mysql, Spamassassin, Dspam, Courier-IMAP
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 decodage, decompression 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 Voila le serveur de mail et le filtrage
est configuré !
Cette partie est optionelle. Policyd est un policy service de Postfix qui permet entre autres de controler les clients
qui se connectent sur le serveur de mail (nombre d'email/heures....), mais également vos propres utilisateurs en
interne en controlant le volume des email envoyés vers l'extérieur. Tous les details de ces possibilités sont dans le
README dans les sources.
- *NOTE: Il peut aussi être utilisé pour faire du greylisting. Je n'apprécie pas particulièrement le greylisting, mais si on
veut le mettre en place, il ne restera alors qu'a paramétrer policyd. Policyd est surtout très utile pour lutter contre les
mail bombing, les ddos, les spywares et les abus en tout genre (limitation entrees/sorties) On crée un user policyd:
addgroup policyd
adduser --disabled-password --ingroup policyd policyd
On compile:
cd /root wget http://policyd.sourceforge.net/policyd-v1.80.tar.gz tar xvzf policyd-v1.80.tar.gz cd
policyd-v1.80 make build make install
Créer la base sql: mysql -u root -p GRANT SELECT, INSERT, UPDATE, DELETE ON policyd.* TO
'policyd'@'localhost' IDENTIFIED BY '*****'; FLUSH PRIVILEGES; quit On importe la base sql:
mysql -u root -p < DATABASE.mysql
On modifie le /usr/local/policyd/policyd.conf comme celui ci (on modifie le UID et le GID en fonction bien sur):
policyd.conf Tout est documenté dans le fichier, on peut donc adapter à ses besoins. On sécurise le fichier:
chmod 640 /usr/local/policyd/policyd.conf
On crée un fichier /etc/init.d/policyd: #!/bin/sh case "$1" in 'start')
/usr/local/policyd/policyd -c
/usr/local/policyd/policyd.conf
;; 'stop')
/usr/bin/killall policyd > /dev/null 2>&1 && echo -n 'Policyd stopped'
;; *)
echo "Usage: $0 start | stop "
;; esac exit 0 puis:
chmod 755 /etc/init.d/policyd
update-rc.d policyd defaults
On lance le daemon:
/etc/init.d/policyd start
On vérifie qu'il tourne bien et avec le bon user:
ps aux | grep policyd
policyd
2740
0.7
0.2
32896
1416 ?
S
11:35
0:00
/usr/local/policyd/policyd -c /usr/local/policyd/policyd.conf
On ajoute au /etc/postfix/main.cf la commande de lancement apres le reject_unauth_destination:
...
reject_unauth_destination,
check_policy_service inet:127.0.0.1:10031, ...
On relance postfix:
postfix reload
Copyright ©
Page 28/32
Installation Serveur Mail Postfix, Amavisd, Mysql, Spamassassin, Dspam, Courier-IMAP
On teste en envoyant un email. il est normal de ne pas voir dans les logs l'activité de policyd sur les mails interne.
On teste en envoyant un mail de l'exterieur vers notre serveur. On crée un tache cron pour le script de nettoyage:
# crontab -e
0 * * * * /usr/local/policyd/cleanup -c /usr/local/policyd/policyd.conf
- *NOTE: en cas de défaillance de policyd, postfix ne pourra plus envoyer ni recevoir de mail. Il faut donc veiller à ce
que le processus tourne en permanence. On peut créer une tache cron pour surveiller ce dernier et le relancer le
cas échéant. (Si l'on ne sait pas comment faire, un module webmin permet cette surveillance). D'expérience je n'ai
jamais eu de problèmes de ce style avec policyd qui est très fiable.
On peut éventuellement activer un système de réponse automatique en cas absence. C'est Postfixadmin qui gérera
ce point. Note: Il est de plus en plus déconseillé d'utiliser ce genre d'autoréponse car il peut générer un trafic
illégitime. (Backscatter Mails). Voir ces liens pour plus d'informations:
http://www.spamcop.net/fom-serve/cache/329.html http://www.rfc-editor.org/rfc/rfc3834.txt Sur un site de taille réduite
cela ne posera pas de problèmes.
addgroup vacation adduser --disabled-password --ingroup vacation vacation mkdir /var/spool/vacation
touch
/var/log/vacation.log touch /var/log/vacation.debug chown vacation: /var/log/vacation.*
Le fichier vacation.pl du dossier postfixadmin est en version 3.1 et ne fonctionne pas correctement. Il faut prendre
celui ci(version 3.2): http://www.starbridge.org/spip/doc/Procmail/vacation.txt et le renommer en vacation.pl, le
mettre dans /var/spool/vacation/ Puis:
chown -R vacation: /var/spool/vacation
On édite le fichier /var/spool/vacation/vacation.pl et on paramètre les identifiants Mysql. On édite le
/etc/postfix/master.cf et on ajoute juste avant uucp:
vacation
unix
-
n
n
-
-
pipe
flags=Rq user=vacation
argv=/var/spool/vacation/vacation.pl -f $sender -- $recipient
Il faut créer un fichier /etc/postfix/transport:
autoreply.starbridge.orgvacation
puis:
postmap /etc/postfix/transport
On ajoute ceci au /etc/postfix/main.cf:
transport_maps = hash:/etc/postfix/transport
Puis:
postifx reload
On se connecte à l'interface user de postfixadmin: http://starbridge.org/postfixadmin/users/main.php et on
paramètre l'absence. Puis on teste en envoyant un mail à l'utilisateur "absent". Note: un système de mise en cache
évite que le mail d'absence ne soit envoyé plusieurs fois au même expéditeur.
Copyright ©
Page 29/32
Installation Serveur Mail Postfix, Amavisd, Mysql, Spamassassin, Dspam, Courier-IMAP
en cours de redaction: Pour suivre les logs que génèrent le serveur de mail, il est conseillé d'utiliser des outils
particuliers. on installe :
aptitude install logcheck logwatch awstats
- Logcheck son utilisation est automatique après l'installation sous debian. toutes les heures il envoie un rapport des
logs du serveurs ne contenant que les points qui doivent attirer l'attention.
- Logwatch son installation est également automatisé par la debian. Il envoie un rapport journalier sur les logs. Pour
des resultats pertinent avec postfix/amavis il faut ajouter les modifications suivantes:
wget http://www.mikecappella.com/logwatch/amavis-logwatch.tgz tar xvzf amavis-logwatch.tgz cd
amavis-logwatch cp amavis-logwatch /usr/share/logwatch/scripts/services/amavis cp amavis-logwatch.conf
/usr/share/logwatch/default.conf/services/amavis.conf cd .. wget
http://www.mikecappella.com/logwatch/postfix-logwatch.tgz tar xvzf postfix-logwatch.tgz cd postfix-logwatch
cp postfix-logwatch /usr/share/logwatch/scripts/services/postfix cp postfix-logwatch.conf
/usr/share/logwatch/default.conf/services/postfix.conf
- awstats: Après l'installation il faut configurer awstats comme ceci: /etc/awstats/awstats.spike.starbridge.org.conf le
nom du fichier est capital. C'est la connection sur le serveur web par le FQDN spike.starbridge.org/cgi-bin/awstats.pl
qui fera fonctionner awstats dans cette configuration. On crée un fichier /etc/cron.d/awstats:
0 5,12,20 * * * root /usr/lib/cgi-bin/awstats.pl -config=spike.starbridge.org -update
- *2.6 18/07/2007
- Mise à jour du lien pour clamav 0.91.1
- *2.5 09/07/2007
- Modification du master.cf pour eviter le filtrage et les body/header checks sur le pickup.
- *2.4 03/07/2007
- ajout de la modification de /etc/init.d/courier-authdaemon sous ubuntu pour éviter le changement des droits à
chaque lancement.
- simplification du paragraphe sur les RBL. Seules 2 listes restent en fonction par défaut.
- *2.3 30/06/2007
- modification du lien de clamd pour la version 0.91rc2 en raison du bug de demarrage de la version 0.90.3.
- *2.2 29/06/2007
- ajout d'un paragraphe dans courier-imap sur l'utilisation de ENHANCEDIDLE.
- ajout d'un paragraphe dans courier-imap sur le nombre de process maximum
- ajout d'un paragraphe dans courier-imap sur le fonctionnement des fichiers de configuration imapd et imapd-ssl
- *2.1 28/06/2007
- Typo
- *2.0 27/06/2007
- Partie antispam, paramétrage de postfix (stmd_recipient_restrictions..): Refonte complète du paragraphe pour
ajouter des règles pour éviter le spoofing des adresses expéditrices.
- Postfix main.cf (au début du tuto): ajout de $smtpd_sender_login_maps dans proxy_read_maps.
- Mise à jour des liens pour Amavisd-2.5.2
- *1.3 26/06/2007 Merci a Guillain pour son aide !
- Typos: type Mime
- Headers/body/tyme Mime: modification des noms de fichiers pour qu'ils aient tous la terminaison
Copyright ©
Page 30/32
Installation Serveur Mail Postfix, Amavisd, Mysql, Spamassassin, Dspam, Courier-IMAP
.cf
Copyright ©
Page 31/32
Installation Serveur Mail Postfix, Amavisd, Mysql, Spamassassin, Dspam, Courier-IMAP
- SASL: Ajout du START=yes dans le /etc/default/saslauthd
- Maildrop: ajout de libpcre3-dev dans les paquets nécessaires à installer (compatibilité Ubuntu)
- Maildrop: ajout de l'installation de la commande mail pour les systeme Ubuntu
- *1.2 06/06/2007
- Modification du script d'apprentissage SA
- ajout des boîtes email d'apprentissage Spam et Ham
- ajout des répertoires par défaut dans les boîtes imap: SpamToLearn et SpamFalse
- *1.1 31/05/2007
- Modification du Main.cf et déplacement du reject_unauth_pipelining sous smtpd_data_restrictions.
- Modification de postfixadmin pour corriger le bug d'envoi de l'email de confirmation lié a la restriction sur le
pipelining.
- *1.0 Article Original
Copyright ©
Page 32/32