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] - => MAIL FROM: <> 250 2.1.0 Sender OK - => RCPT TO: <[email protected]> 250 2.1.5 OK - => DATA 354 End data with . - => . 250 2.0.0 Ok: queued as 079474CE44 - => QUIT 221 2.0.0 Bye Connection closed by foreign host On regarde les logs pour vérifier. - *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: - 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: - * il faut que le client de messagerie supporte cette fonction. C'est le cas d'Outlook et de Thunderbird. - * 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: - 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. - /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 - 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 - 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 - => , 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: 250 2.1.5 Recipient OK - => DATA 354 End data with . - => 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 ! 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 " => X-Spam-toohigh." exception to /home/virtual/[email protected]/ if ( /^X-Spam-Flag: YES/ ) log " => 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 - 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. - *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: => $ 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 => MAIL FROM:<[email protected]> 250 2.1.0 Sender [email protected] OK => RCPT TO: 250 2.1.5 Recipient postmaster OK => DATA 354 End data with . => Subject: test2 - virus test pattern => => X5O!P%@AP[4\PZX54(P^)7CC)7$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H* => . => 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