Accueil > Logiciel, Tutoriel > Installation Serveur Mail Postfix, Amavisd, Mysql, Spamassassin, Dspam, Dovecot

Installation Serveur Mail Postfix, Amavisd, Mysql, Spamassassin, Dspam, Dovecot

31/12/2018 Categories: Logiciel, Tutoriel Tags: , , ,
Print Friendly, PDF & Email

Ce tutoriel a été intégralement repris du site  http://www.starbridge.org et a été réalisé par tonio. Il est distribué sous licence creativecommons  Creative Commons License

Cet article, initié en 2007, est mis à jour régulièrement.
Le système sur lequel est basé ce document est une DEBIAN stable (Wheezy).
Le tuto est aussi entièrement compatible avec la version Testing (Jessie).

Ce tuto fonctionne également sous Ubuntu mais certains paquets présentent de légères différences. On essaiera de les indiquer si possible.

Mise à jour du 5/5/2015

Table des matières

Préparation de l’environnement

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 full-upgrade

On vérifie les fichiers :

/etc/hostname : spike.starbridge.org
/etc/hosts : 127.0.0.1    spike.starbridge.org localhost.localdomain localhost spike

Cache DNS Local

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 unbound

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/unbound 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.

On installe ensuite les outils pour la compilation, ils seront nécessaires tout au long de l’installation :

aptitude install bzip2 gcc libpcre3-dev libpcre  -dev g   libtool libmysqlclient-dev make libssl-dev libmysqld-dev libdb-dev automake autoconf bzip2 lbzip2 libbz2-1.0 libbz2-dev curl libcurl3 libcurl4-openssl-dev libexpat1 libexpat1-dev

On crée le dossier de configuration général :

mkdir /etc/caremail

Postfix et Mysql

  • La version stable de Debian (Wheezy) utilise postfix 2.9.6.
  • La dernière version de Postfix est la 2.11.
    La version Testing de Debian utilise la version 2.11.

Un paramètre important a fait son apparition en 2.10 et il est nécessaire de modifier la configuration pour ceux qui utiliseront la 2.10. On le précisera plus bas.
Le fait de rester en 2.9.6 n’impacte pas les autres fonctionnalités mises en place dans le tuto, donc pour le moment il n’est pas forcément nécessaire de passer en 2.10 pour ceux qui sont en Debian stable
On peut aussi utiliser les backports de la version stable qui proposent la 2.11.2

On lance l’installation de postfix :

aptitude install postfix-mysql postfix-pcre

l’installeur va demander l’effacement de exim que l’on valide
puis il va demander le type d’installation pour postfix, on laisse tout par défaut.

on installe ensuite les autres paquets nécessaires :

aptitude install mysql-client-5.5 mysql-server-5.5 libsasl2-2 libsasl2-modules sasl2-bin openssl ntp

voir le sujet sur le forum concernant l’optimisation de mysql :
https://www.starbridge.org/support/viewtopic.php?f=6&t=1599

On installe apache php5 pour gérer plus tard le tout avec l’interface postfixadmin.

aptitude install libapache2-mod-php5 php5-mysql

Note : Il est fortement conseillé d’installer le SSL avec Apache pour sécuriser les échanges. Cette configuration sera détaillée plus loin lors de l’installation de Postfixadmin.

Pour ceux qui le préfère, on peut tout de suite installer Phpmyadmin pour effectuer l’étape suivante.
(on ne détaillera pas cette installation, en dehors du scope de ce document)

On passe donc à la création de la base sql Postfix :

Note : Si l’on a mis un password lors de l’installation du paquet mysql, il faut sauter la première commande ci dessous et exécuter directement la seconde.

mysqladmin -u root 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 '******';

On crée les tables suivantes dans la base Postfix :


Évidemment on modifie la commande sed pour inclure son domaine
.

cd ~
wget http://www.starbridge.org/spip/doc/Procmail/postfix/postfix.sql
sed -i 's/starbridge.org/toto.com/g' postfix.sql
mysql -u root -p < postfix.sql

Explications :
Seules 3 tables sont nécessaires à Postfix.
Le reste est pour l’interface Postfixadmin que l’on installera plus tard.

Le password (MD5) est « secret »

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 pointant vers un user de la table mailbox. Cet alias vers lui même sera utilisé par Postfixadmin.

le 4ème INSERT est un simple alias virtuel.

Le 7ème INSERT est un compte (boite email) virtuel, qui utilise un mot de passe encrypté en MD5.

Les deux derniers INSERT permettent de créer le superadministrateur que l’on utilisera plus tard dans Postfixadmin.
#PAGINATION

Paramétrage de Postfix

On remplace tout le /etc/postfix/main.cf par le contenu ci dessous :
n’oubliez pas de remplacer myhostname = spike.starbridge.org par votre domaine

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 = $mydomain
mydestination = $myhostname, localhost.$mydomain, localhost
mynetworks = 127.0.0.0/8
recipient_delimiter =  
home_mailbox = Maildir/ 
notify_classes = 2bounce, bounce, delay, policy, protocol, resource, software
smtpd_helo_required = yes
strict_rfc821_envelopes = yes
relay_domains = proxy:mysql:/etc/postfix/mysql_relay_domains_maps.cf
relay_recipient_maps = proxy:mysql:/etc/postfix/mysql_relay_recipients_maps.cf
virtual_alias_maps = proxy:mysql:/etc/postfix/mysql_virtual_alias_maps.cf,proxy:mysql:/etc/postfix/mysql_virtual_alias_domain_maps.cf,proxy:mysql:/etc/postfix/mysql_virtual_alias_domain_catchall_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_maps = proxy:mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf,proxy:mysql:/etc/postfix/mysql_virtual_alias_domain_mailbox_maps.cf
virtual_minimum_uid = 20001
virtual_uid_maps = static:20001
transport_maps = proxy:mysql:/etc/postfix/mysql_transport.cf,proxy:mysql:/etc/postfix/mysql_transport2.cf
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 $has_our_domain_as_sender
message_size_limit = 50240000

smtpd_recipient_restrictions =
        permit_mynetworks,
        reject_unauth_destination,
        permit
smtpd_data_restrictions =
        reject_unauth_pipelining,
        permit

Ceux qui sont en postfix 2.10 et supérieur doivent ajouter cette ligne au dessus du bloc smtpd_recipient_restrictions

smtpd_relay_restrictions =

ce qui donne :

smtpd_relay_restrictions =
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 :

#
# Postfix master process configuration file.  For details on the format
# of the file, see the master(5) manual page (command: "man 5 master").
#
# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command   args
#               (yes)   (yes)   (yes)   (never) (100)
# ==========================================================================
smtp      inet  n       -       n       -       -       smtpd
#smtp      inet  n       -       n       -       1       postscreen
#smtpd     pass  -       -       n       -       -       smtpd
#dnsblog   unix  -       -       n       -       0       dnsblog
#tlsproxy  unix  -       -       n       -       0       tlsproxy
#submission inet n       -       n       -       -       smtpd
587      inet    n    -    n    -    -    smtpd 
    -o smtpd_tls_security_level=encrypt
    -o smtpd_sasl_auth_enable=yes
    -o smtpd_etrn_restrictions=reject
    -o smtpd_client_restrictions=permit_sasl_authenticated,reject
#smtps     inet  n       -       -       -       -       smtpd
# -o smtpd_tls_wrappermode=yes
# -o smtpd_sasl_auth_enable=yes
# -o smtpd_client_restrictions=permit_sasl_authenticated,reject
#628      inet  n       -       -       -       -       qmqpd
pickup    fifo  n       -       n       60      1       pickup
        -o receive_override_options=no_header_body_checks
        -o content_filter=
cleanup   unix  n       -       n       -       0       cleanup
qmgr      fifo  n       -       n       300     1       qmgr
#qmgr     fifo  n       -       -       300     1       oqmgr
tlsmgr    unix  -       -       n       1000?   1       tlsmgr
rewrite   unix  -       -       n       -       -       trivial-rewrite
bounce    unix  -       -       n       -       0       bounce
defer     unix  -       -       n       -       0       bounce
trace     unix  -       -       n       -       0       bounce
verify    unix  -       -       n       -       1       verify
flush     unix  n       -       n       1000?   0       flush
proxymap  unix  -       -       n       -       -       proxymap
proxywrite unix -       -       n       -       1       proxymap
smtp      unix  -       -       n       -       -       smtp
# When relaying mail as backup MX, disable fallback_relay to avoid MX loops
relay     unix  -       -       n       -       -       smtp
#       -o fallback_relay=
#       -o smtp_helo_timeout=5 -o smtp_connect_timeout=5
showq     unix  n       -       n       -       -       showq
error     unix  -       -       n       -       -       error
retry     unix  -       -       n       -       -       error
discard   unix  -       -       n       -       -       discard
local     unix  -       n       n       -       -       local
virtual   unix  -       n       n       -       -       virtual
lmtp      unix  -       -       n       -       -       lmtp
anvil     unix  -       -       n       -       1       anvil
scache    unix  -       -       n       -       1       scache
#
# # See the Postfix UUCP_README file for configuration details.
#
uucp      unix  -       n       n       -       -       pipe
 flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)

On crée le groupe et le user vmail avec l’uid et gid 20001, ainsi que le répertoire des mails :

groupadd -g 20001 vmail
useradd -g vmail -u 20001 vmail -d /home/virtual -m

On sécurise :

chown -R vmail: /home/virtual
chmod 770 /home/virtual

On crée les fichiers d’appel des tables par Postfix :
(la commande sed permet de spécifier votre password d’accès à la base, dans l’exemple ici c’est toto)

cd /etc/postfix
wget http://www.starbridge.org/spip/doc/Procmail/postfix/mysql_virtual_alias_maps.cf
wget http://www.starbridge.org/spip/doc/Procmail/postfix/mysql_virtual_domains_maps.cf
wget http://www.starbridge.org/spip/doc/Procmail/postfix/mysql_virtual_mailbox_maps.cf
wget http://www.starbridge.org/spip/doc/Procmail/postfix/mysql_relay_domains_maps.cf
wget http://www.starbridge.org/spip/doc/Procmail/postfix/mysql_relay_recipients_maps.cf
wget http://www.starbridge.org/spip/doc/Procmail/postfix/mysql_virtual_alias_domain_maps.cf
wget http://www.starbridge.org/spip/doc/Procmail/postfix/mysql_virtual_alias_domain_catchall_maps.cf
wget http://www.starbridge.org/spip/doc/Procmail/postfix/mysql_virtual_alias_domain_mailbox_maps.cf
wget http://www.starbridge.org/spip/doc/Procmail/postfix/mysql_transport.cf
wget http://www.starbridge.org/spip/doc/Procmail/postfix/mysql_transport2.cf
sed -i 's/****/toto/g' mysql_virtual_alias_maps.cf mysql_virtual_domains_maps.cf mysql_virtual_mailbox_maps.cf mysql_relay_domains_maps.cf mysql_relay_recipients_maps.cf mysql_virtual_alias_domain_maps.cf mysql_virtual_alias_domain_catchall_maps.cf mysql_virtual_alias_domain_mailbox_maps.cf mysql_transport.cf mysql_transport2.cf

On sécurise le tout :

chmod 640 /etc/postfix/mysql_*
chgrp postfix /etc/postfix/mysql_*

Activation du TLS

Pour un serveur en production, il serait préférable d’utiliser un véritable certificat fourni et signé par une autorité de certification de confiance.

On édite la configuration de ssl pour pouvoir signer des certificats sur 10 ans, au lieu de 1 an par défaut :

vi /etc/ssl/openssl.cnf

on change la ligne default_days en

default_days    = 3650

On crée le Certificat Racine :

cd ~
/usr/lib/ssl/misc/CA.pl -newca

on entre les parametres requis, on choisis un pass phrase de son choix et on laisse « challenge password » vide.

CA certificate filename (or enter to create)

Making CA certificate ...
Generating a 1024 bit RSA private key
.......  
.........................................  
writing new private key to './demoCA/private/cakey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:

You are about to be asked to enter information that will be incorporated
into your certificate request.



What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.

Country Name (2 letter code) [AU]:FR
State or Province Name (full name) [Some-State]:Paris 
Locality Name (eg, city) []:Paris
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Starbridge 
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:starbridge.org
Email Address []:tonio@starbridge.org

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /usr/lib/ssl/openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number:
            84:7c:ce:d2:f7:cf:df:6c
        Validity
            Not Before: Nov 13 16:44:33 2007 GMT
            Not After : Nov 12 16:44:33 2010 GMT
        Subject:
            countryName               = FR
            stateOrProvinceName       = Paris
            organizationName          = Starbridge
            commonName                = starbridge.org
            emailAddress              = tonio@starbridge.org
        X509v3 extensions:
            X509v3 Subject Key Identifier: 
                B9:04:A3:81:E5:5D:D6:82:72:F4:6E:0C:FB:3F:E2:62:1B:EF:B9:57
            X509v3 Authority Key Identifier: 
                keyid:B9:04:A3:81:E5:5D:D6:82:72:F4:6E:0C:FB:3F:E2:62:1B:EF:B9:57
                DirName:/C=FR/ST=Paris/O=Starbridge/CN=starbridge.org/emailAddress=tonio@starbridge.org
                serial:84:7C:CE:D2:F7:CF:DF:6C

            X509v3 Basic Constraints: 
                CA:TRUE
Certificate is to be certified until Nov 12 16:44:33 2010 GMT (1095 days)

Write out database with 1 new entries
Data Base Updated

Ce certificat racine sert à signer les certificats. Il est localisé dans le répertoire /demoCA.

On crée maintenant une clé privée pour le serveur ainsi qu’un csr (Certificate Signing Request : demande de signature de certificat).

mkdir ~/CERT
cd ~/CERT
openssl req -new -nodes -keyout starbridge-key.pem -out starbridge-req.pem -days 3650

et on entre les paramètres comme ci dessous :

Generating a 1024 bit RSA private key
.............  
.............  
writing new private key to 'starbridge-key.pem'

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.

Country Name (2 letter code) [AU]:FR
State or Province Name (full name) [Some-State]:Paris
Locality Name (eg, city) []:Paris
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Starbridge
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:spike.starbridge.org
Email Address []:tonio@starbridge.org

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Note : le paramètre le plus important est le Common Name qui doit être le même que le nom avec lequel se connecte les clients sur le serveur. Ici il s’agit du FQDN : spike.starbridge.org.

cela génère 2 fichiers :
la clé privée, à protéger absolument
la demande de certificat, qui est pour faire simple un certificat public non signé

On signe maintenant notre certificat public avec le certificat racine :

cd ~
openssl ca -out CERT/starbridge-cert.pem -infiles CERT/starbridge-req.pem

Voici la sortie de la signature :

Using configuration from /usr/lib/ssl/openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number:
            84:7c:ce:d2:f7:cf:df:6d
        Validity
            Not Before: Nov 13 16:51:32 2007 GMT
            Not After : Nov 10 16:51:32 2017 GMT
        Subject:
            countryName               = FR


            stateOrProvinceName       = Paris
            organizationName          = Starbridge
            commonName                = spike.starbridge.org
            emailAddress              = tonio@starbridge.org
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                05:2A:A9:90:6F:2A:80:F7:E3:EF:2B:F9:44:9D:8E:CF:C3:16:18:EF
            X509v3 Authority Key Identifier: 
                keyid:B9:04:A3:81:E5:5D:D6:82:72:F4:6E:0C:FB:3F:E2:62:1B:EF:B9:57

Certificate is to be certified until Nov 10 16:51:32 2017 GMT (3650 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

On copie maintenant le certificat et la clé dans postfix :

mkdir /etc/postfix/tls
cp demoCA/cacert.pem CERT/starbridge-key.pem CERT/starbridge-cert.pem /etc/postfix/tls/
chmod 644 /etc/postfix/tls/starbridge-cert.pem /etc/postfix/tls/cacert.pem 
chmod 400 /etc/postfix/tls/starbridge-key.pem
chmod 400 ~/CERT/*

On ajoute ceci au /etc/postfix/main.cf :

smtp_tls_CAfile = /etc/postfix/tls/cacert.pem
smtp_tls_security_level = may
smtp_tls_session_cache_database = btree:${data_directory}/smtp_tls_session_cache
smtpd_tls_security_level = may
smtpd_tls_auth_only = yes
smtpd_tls_key_file = /etc/postfix/tls/starbridge-key.pem
smtpd_tls_cert_file = /etc/postfix/tls/starbridge-cert.pem
smtpd_tls_CAfile = /etc/postfix/tls/cacert.pem
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_tls_session_cache
tls_random_source = dev:/dev/urandom
smtpd_tls_protocols = !SSLv2,!SSLv3

On redémarre Postfix :

postfix reload

on testera le fonctionnement après l’installation de dovecot.

Dovecot : SASL, LDA, IMAP et SIEVE

De « simple » serveur imap, Dovecot est devenu un ensemble d’outils indispensables pour la messagerie :
il permet de gérer le SASL très simplement au travers de Postfix afin de fournir à ce dernier un moyen d’authentifier les transactions SMTP,
il fournit un agent de livraison de mail très performant et parfaitement intégré à Postfix,
il permet de prendre en charge le langage Sieve pour le filtrage des mails lors de la livraison,
et bien sur, il demeure un serveur imap rapide et léger.

On va détailler ici son installation, fonction par fonction.

Installation de Dovecot :

On va utiliser la version 2.2 de Dovecot.
On compilera depuis les sources.

Créer les users pour dovecot :

adduser --system --group --home /usr/lib/dovecot --gecos "Dovecot mail server" --disabled-password --quiet dovecot
adduser --system --home /nonexistent --gecos "Dovecot login user"  --disabled-password --quiet dovenull

on compile :

cd ~
mkdir dovecot
cd dovecot
wget http://dovecot.org/releases/2.2/dovecot-2.2.16.tar.gz
wget http://pigeonhole.dovecot.org/releases/2.2/dovecot-2.2-pigeonhole-0.4.7.tar.gz
tar xvzf dovecot-2.2.16.tar.gz
tar xvzf dovecot-2.2-pigeonhole-0.4.7.tar.gz
cd dovecot-2.2.16
./configure --prefix=/usr/ --sysconfdir=/etc/ --with-mysql --libexecdir=/usr/lib/ --localstatedir=/var --with-moduledir=/usr/lib/dovecot/modules --disable-rpath --disable-static --with-zlib --with-bzlib --with-solr
make
make install
cd ../dovecot-2.2-pigeonhole-0.4.7
./configure --with-dovecot=/usr/lib/dovecot/ --prefix=/usr/ --sysconfdir=/etc/ --libexecdir=/usr/lib/ --disable-static
make
make install

On copie les fichiers de configuration nécessaires :

cd /etc/dovecot/
wget http://www.starbridge.org/spip/doc/Procmail/dovecot/dovecot.conf 
wget http://www.starbridge.org/spip/doc/Procmail/dovecot/dovecot-sql.conf
wget http://www.starbridge.org/spip/doc/Procmail/dovecot/dovecot-dict-quota-sql.conf
chown vmail:dovecot dovecot-dict-quota-sql.conf
chmod 600 dovecot-sql.conf 
chmod 640 dovecot-dict-quota-sql.conf

On indique le password de la table postfix :

sed -i 's/*****/toto/g' dovecot-sql.conf dovecot-dict-quota-sql.conf

on ne relance pas encore dovecot pour le moment

La livraison des emails : Dovecot LDA

Nous avons maintenant 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 possibilité 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 méthode répandue pour les quotas est l’application du patch VDA sur Postfix, option que nous ne choisirons pas pour des raisons de fiabilité.

Maildrop convient bien, il a d’ailleurs longtemps été utilisé dans ce tuto, mais nous l’avons maintenant remplacé par le MDA inclus dans Dovecot, plus performant et surtout très bien maintenu.

C’est donc Dovecot LDA (Local Delivery Agent, le MDA de dovecot) qui s’occupera de la livraison des mails dans les home.

Il faut configurer Postfix pour qu’il utilise Dovecot comme MDA :

On ajoute ceci au /etc/postfix/main.cf :

dovecot_destination_recipient_limit = 1
virtual_transport = dovecot

et on ajoute un transport dovecot au /etc/postfix/master.cf :

A noter que la configuration du tuto permet de choisir son transport par domaine. Il faut pour cela choisir Dovecot dans la configuration de domaine dans Postfixadmin.
Le domaine par défaut, crée par le script sql du tuto, est déja paramétré pour utiliser Dovecot.

Dovecot est également préconfiguré pour utiliser les mêmes certificats SSL que Postfix, que l’on a généré dans l’étape précédente.
Il n’y a donc rien de particulier à configurer pour le SSL sauf si vous avez modifié les noms de fichiers des certificats ssl à l’étape postfix.

il faut maintenant créer un fichier /etc/init.d/dovecot :

cd /etc/init.d/
wget http://www.starbridge.org/spip/doc/Procmail/init.d/dovecot
chmod 755 /etc/init.d/dovecot
insserv -v /etc/init.d/dovecot

On lance Dovecot :

/etc/init.d/dovecot start

on relance Postfix :

postfix reload

On verifie dans les logs que tout a démarré correctement.

On teste cette première configuration de base en envoyant un mail a user@starbridge.org

mail user@starbridge.org

note : il faut taper un . (un point seul sur la ligne) pour terminer le message.

On regarde les logs pour les erreurs.
Si tout a fonctionné on devrait trouver dans une ligne :

...dovecot: lda(user@starbridge.org)...

note : si la commande mail n’existe pas sur le système (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édé de —>, le reste c’est le retour du serveur) :

---> telnet localhost 25
220 [127.0.0.1] ESMTP Postfix
---> HELO localhost
250 [127.0.0.1]
---> MAIL FROM: <>
250 2.1.0 Sender  OK
---> RCPT TO: <user@starbridge.org> 
250 2.1.5  OK
---> DATA
354 End data with <CR><LF>.<CR><LF>
---> .
250 2.0.0 Ok: queued as 079474CE44
---> QUIT
221 2.0.0 Bye
Connection closed by foreign host

On regarde les logs pour vérifier.

on regarde dans le dossier /home/virtual/user@starbridge.org : on devrait trouver les dossiers suivants :

drwx------ 9 vmail vmail  4096 11 sept. 18:20 .
drwxrwx--- 4 vmail vmail  4096 11 sept. 18:13 ..

-rw------- 1 vmail vmail   384 11 sept. 18:20 dovecot.mailbox.log
-rw------- 1 vmail vmail   291 11 sept. 18:20 dovecot-quota
drwx------ 2 vmail vmail  4096 11 sept. 18:20 mailboxes

En regardant dans mailboxes on trouvera les dossiers par défaut qui sont crées automatiquement.

Sieve

Dovecot LDA permet d’utiliser le langage de filtrage Sieve.
Celui-ci offre la possibilité d’appliquer des règles spécifiques pour les utilisateurs (redirection dans les répertoires, etc).
Mais avant cela, nous avons besoin d’un fichier de filtre Sieve global (son utilisation est paramétrée dans dovecot.conf) qui permettra de rediriger les spams dans un dossier de l’utilisateur :

mkdir /home/virtual/sieve
chown vmail: /home/virtual/sieve
chmod 750 /home/virtual/sieve

on crée le fichier global.sieve :

vi /home/virtual/sieve/global.sieve

require ["fileinto", "envelope", "subaddress"];
if envelope :detail "to" "spam"{
  fileinto "Spam";
}

on sécurise :

chown vmail: /home/virtual/sieve/global.sieve
 chmod 600 /home/virtual/sieve/global.sieve
  • NOTE : Le fichier global.sieve 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 sieve dans son Maildir. On pourra par exemple rediriger des emails dans des répertoires spécifiques de cette façon. Dovecot cherche pour cela le fichier dovecot.sieve dans le maildir de l’utilisateur.

Pour la création assistée et autonome (par les utilisateurs eux-mêmes) des fichiers Sieve personnels on pourra utiliser un module du Webmail horde.
L’article sur l’installation du Webmail traite ce point en détail.

Il est également possible d’utiliser le protocole Sieve pour créer/modifier les scripts depuis un client lourd, Thunderbird propose par exemple un plugin pour la gestion des scripts Sieve.
Le port de connection par défaut est le 4190.
Les users seront ainsi totalement autonomes sur la gestion de leur paramètres de filtrage.

Consultation des emails par IMAP

On teste l’imap en TLS sur le port 143 depuis un client mail.
Si tout fonctionne correctement on doit accéder aisément aux messages de tests précédents depuis le client mail.

Prise en charge du SASL par Dovecot :

Enfin, on passe à la configuration SASL :

On ajoute ceci au /etc/postfix/main.cf :

smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = 
broken_sasl_auth_clients = yes
smtpd_sasl_authenticated_header = yes

On ajoute également « permit_sasl_authenticated » dans « smtpd_recipient_restrictions » pour valider les restrictions (attention à bien placer le paramètre exactement à l’endroit indiqué) :

.....
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
......

on relance Postfix :

postfix reload

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 connexion IMAP (ne pas oublier le @starbridge.org).
Pour le type d’authentification, il faut sélectionner « en clair » (le terme dépend du client mail).

C’est le chiffrage de la connexion par le TLS qui sécurisera le transfert du password.
C’est pour cela qu’il ne faut pas dissocier TLS et authentification.

Note : la directive smtpd_tls_auth_only = yes impose l’usage d’une connexion sécurisée pour l’authentification SASL, ce qui limitera les erreurs de configuration des utilisateurs.

Installation PostfixAdmin

Pour faciliter la création des users et la gestion des boîtes et des comptes, on utilise Postfixadmin.

Nous utiliserons une version modifiée que nous prendrons par SVN.

Activation du SSL dans Apache

Le SSL est indispensable pour sécuriser les échanges, en particulier les mots de passe utilisateurs.

On active le SSL par la commande :

a2enmod ssl.conf

Puis on crée le virtual host :

vi /etc/apache2/sites-available/ssl.conf

Et on colle :

NameVirtualHost *:443
<VirtualHost *:443>
        ServerAdmin webmaster@starbridge.org
        ServerName www.starbridge.org
        DocumentRoot /var/www/
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        ErrorLog /var/log/apache2/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog /var/log/apache2/access.log combined
        ServerSignature On

SSLEngine On
SSLCertificateFile /etc/apache2/ssl/starbridge-certkey-www.pem

SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
</VirtualHost>

puis on active le virtual host :

a2ensite ssl

Génération des certificats :

Il est important de créer un certificat avec le même nom que celui utilisé pour la connection.
Par exemple si on se connecte au serveur web par www.starbridge.org il faut créer un certificat avec un Common Name enwww.starbridge.org.

On part du principe que l’on utilise www.starbridge.org.

On crée donc un certificat public non signé et une clé, puis on le signe avec le CA :

cd ~/CERT
openssl req -new -nodes -keyout starbridge-key-www.pem -out starbridge-req-www.pem -days 3650

On entre les informations en prenant soin de bien spécifier le Common Name en www.starbridge.org.
Il faut également respecter les informations entrées plus tôt dans le CA.

cd ~ 
openssl ca -out CERT/starbridge-cert-www.pem -infiles CERT/starbridge-req-www.pem
chmod 400 ~/CERT/*
cd CERT/
cat starbridge-key-www.pem starbridge-cert-www.pem >starbridge-certkey-www.pem
mkdir /etc/apache2/ssl
cp starbridge-certkey-www.pem /etc/apache2/ssl/
chmod 600 /etc/apache2/ssl/starbridge-certkey-www.pem
chmod 400 ~/CERT/*

On redémarre Apache :

/etc/init.d/apache2 restart

On teste la connexion par

https://www.starbridge.org

Le navigateur va demander la validation du certificat car celui ci n’est pas reconnu par une autorité de confiance. Ceci est normal (c’est un certificat self-signed).

Pour un serveur en production, il serait donc préférable d’utiliser un véritable certificat (payant).

aptitude install subversion
cd /var/www
svn co http://smtp04.spamguard.fr/svn/Procmail/mailstorm/postfixadmin-relay postfixadmin-relay
chown -R www-data: /var/www/postfixadmin-relay
cd postfixadmin-relay
chmod 640 *.php
cd /var/www/postfixadmin-relay/admin/
chmod 640 *.php
cd /var/www/postfixadmin-relay/images/
chmod 640 *.png
cd /var/www/postfixadmin-relay/languages/
chmod 640 *.lang
cd /var/www/postfixadmin-relay/templates/
chmod 640 *.php
cd /var/www/postfixadmin-relay/users/
chmod 640 *.php
cd /var/www/postfixadmin-relay/

Il faut remplacer toutes les entrées starbridge dans le fichier de configuration par celles correspondantes à votre domaine.
(toto est le password pour la base sql postfix et toto.com votre domaine) :

sed -i "s/password'] = '*****'/password'] = 'toto'/" config.inc.php
sed -i 's/www.starbridge.org/www.toto.com/g' config.inc.php
sed -i 's/starbridge.org/toto.com/g' config.inc.php

On sécurise ce fichier :

chown www-data: /var/www/postfixadmin-relay/config.inc.php
 chmod 640 config.inc.php

On se connecte ensuite à l’interface :

https://www.starbridge.org/postfixadmin-relay

(bien sur on remplace starbridge par votre domaine sinon vous vous connectez chez moi !!)

On s’identifie avec @starbridge.org (on l’a créé plus tôt lors des inserts sql – on rappelle que le password est ’secret’)

On retrouvera les éléments entrés en ligne de commande au début du document.
On crée un nouvel utilisateur pour valider.

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éférable.

La gestion des Quotas

On l’a vu, on a installé dovecot LDA qui prend en charge les quotas et on a paramétré 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 :
(on pensera à l’adapter a ses besoins mais il faut être prudent dans la mise en forme du fichier)

cd /usr/bin
wget  http://www.starbridge.org/spip/doc/Procmail/dovecot/quota-warning.sh
chmod  x /usr/bin/quota-warning.sh

Le reste est déjà paramétré dans Dovecot.

Il suffit d’utiliser Postfixadmin pour régler un quota pour un utilisateur.
Le faire avec l’utilisateur user@starbridge.org qui par défaut n’a pas de quota.

On teste en envoyant un mail.

On regarde les logs.

Voila le serveur est configuré !

A ce stade le serveur est sécurisé mais ne filtre ni les virus, ni les spams.

Antispam / Antivirus

Paramétrage de Postfix :

Une grande majorité des spams ne respecte 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 complète sur le sujet et l’article sur la gestion du serveur de mail revient sur tous les points en les détaillant).

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 proxy:mysql:/etc/postfix/mysql_not_our_domain_as_sender.cf,
        check_helo_access proxy:mysql:/etc/postfix/mysql-hello.cf,
        check_sender_access proxy:mysql:/etc/postfix/mysql-sender.cf,
        check_client_access proxy:mysql:/etc/postfix/mysql-client.cf,
        permit

on va aussi paramétrer 4 RBL (des blacklists) qui filtrent très efficacement.
Pour cela, on va se servir d’une fonctionnalité apparue depuis la version 2.8 de postfix : postscreen.

Toujours dans le main.cf, on ajoute tout en bas du fichier :

postscreen_dnsbl_threshold = 2
postscreen_dnsbl_sites = zen.spamhaus.org*2 
       bl.spamcop.net*2 b.barracudacentral.org*1 bl.mailspike.net*1
postscreen_dnsbl_action = enforce
postscreen_greet_action = enforce

Dans le master.cf, on commente la première ligne :

#smtp      inet  n       -       n       -       -       smtpd

et on décommente les suivantes :

smtp      inet  n       -       n       -       1       postscreen
smtpd     pass  -       -       n       -       -       smtpd
dnsblog   unix  -       -       n       -       0       dnsblog
tlsproxy  unix  -       -       n       -       0       tlsproxy
  • ATTENTION : Il existe d’autres RBL qui peuvent rendre le filtrage encore plus restrictif mais je déconseille de les installer dans Postfix 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 de Spamassassin.

A noter que Postscreen effectue egalement une autre vérification (greet_action) qui est particulièrement efficace (voir la doc de Postfix pour en comprendre le fonctionnement)

Ensuite il faut limiter les possibilités de forging des expéditeurs en vérifiant les MAIL FROM (adresses expéditrices).

Toujours dans le main.cf, on place au dessus du bloc smtpd_recipient_restrictions = :

smtpd_sender_login_maps = proxy:mysql:/etc/postfix/mysql-sasl-sender-check.cf,proxy:mysql:/etc/postfix/mysql_virtual_alias_domain_maps.cf

smtpd_sender_restrictions = 
    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 proxy:mysql:/etc/postfix/mysql_our_domain_as_sender.cf,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 suivants :

    • On crée le fichier /etc/postfix/internal_networks :
cd /etc/postfix/
 wget http://www.starbridge.org/spip/doc/Procmail/postfix/internal_networks

On édite ce fichier et on spécifie son réseau local et son adresse publique à l’intérieur :

10.0.0           has_our_domain_as_sender

Cela permet de spécifier la ou les plages IP de notre réseau, qui seront autorisées à envoyer un mail avec nos domaines dans le MAIL FROM.
Cela permet également de préciser les IP autorisées à envoyer un mail en se présentant avec notre HELO.
On bloquera ainsi les clients SMTP extérieurs qui se présentent avec un HELO qui est le notre :

    • Ensuite on crée les fichier suivants qui appellent les tables SQL.
cd /etc/postfix/
 wget http://www.starbridge.org/spip/doc/Procmail/postfix/mysql-hello.cf
 wget http://www.starbridge.org/spip/doc/Procmail/postfix/mysql-sender.cf
 wget http://www.starbridge.org/spip/doc/Procmail/postfix/mysql-client.cf
 wget http://www.starbridge.org/spip/doc/Procmail/postfix/mysql-sasl-sender-check.cf
 wget http://www.starbridge.org/spip/doc/Procmail/postfix/mysql_our_domain_as_sender.cf
 wget http://www.starbridge.org/spip/doc/Procmail/postfix/mysql_not_our_domain_as_sender.cf
 wget http://www.starbridge.org/spip/doc/Procmail/postfix/our_domain_as_sender

Pour info voici leurs fonctions :

      • /etc/postfix/mysql-hello.cf : Cette table SQL listera les HELO de nos domaines email (on peut en posséder plusieurs dans le cas d’un serveur multidomaine).
      • /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.
      • /etc/postfix/mysql-client.cf : Il sert à blacklister ou whitelister les clients par leur connection (ip/domaine).
      • /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.
        On remarquera que l’on fait appel à la table alias. En effet c’est le meilleur endroit pour connaître les MAIL FROM d’un utilisateur, car un mail from valide doit être une adresse valide pour cet utilisateur. (donc un de ces alias)
      • /etc/postfix/mysql_our_domain_as_sender.cf : 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)
      • /etc/postfix/our_domain_as_sender : Il sert à spécifier le null sender pour la regle du dessus.

On postmape les fichiers qui le nécessitent :

postmap /etc/postfix/internal_networks
postmap /etc/postfix/our_domain_as_sender

On modifie le password des fichiers de lookup (la commande sed permet de spécifier votre password d’accès à la base, dans l’exemple ici c’est toto) :

sed -i 's/****/toto/g' mysql-hello.cf mysql-sender.cf mysql-client.cf mysql-sasl-sender-check.cf mysql_our_domain_as_sender.cf mysql_not_our_domain_as_sender.cf

Et on sécurise les fichiers de lookup :

chown -R root:postfix /etc/postfix/mysql*
 chmod 640 /etc/postfix/mysql*

On crée les tables en question :

Evidemment, on modifie la commande sed pour inclure son domaine. Ici c’est toto.com

cd ~
 wget http://www.starbridge.org/spip/doc/Procmail/postfix/postfix_access.sql
 sed -i 's/starbridge.org/toto.com/g' postfix_access.sql
 mysql -u root -p < postfix_access.sql

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 fonctionnement se trouve dans le document gestion serveur de mail.

On peut utiliser PhpMyadmin pour gérer ces tables SQL.

Vérification des Headers, du Body et du Type Mime par Postfix.

Postfix peut vérifier les mails entrants très simplement en analysant le header, le body et le type mime des pièces jointes.

Ce type de blocage est très efficace, plus rapide que de laisser faire Amavisd ou SA, mais manque de souplesse.

Il s’avère cependant très efficace pour bloquer des types de fichiers par exemple sans que le mail ne soit envoyé au serveur puis traité (économie de bande passante et de CPU).

Cependant une trop grande quantité de règles et un fort trafic aurait l’effet inverse sur les performances.

Il faut donc utiliser ces règles avec précaution.

On crée les fichiers nécessaires :

cd /etc/postfix/
 wget http://www.starbridge.org/spip/doc/Procmail/postfix/body_checks.cf
 wget http://www.starbridge.org/spip/doc/Procmail/postfix/header_checks.cf
 wget http://www.starbridge.org/spip/doc/Procmail/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és par ces règles.

Le blocage est immédiat et se traduit par un retour d’erreur au moment de l’envoi.

Amavisd et SA

on installe les prérequis d’amavisd :

aptitude install file libcompress-bzip2-perl nomarch arc p7zip-full arj zoo lzop tnef pax cabextract

et les modules Perl :

Pour ceux qui le souhaitent, on peut installer tous les modules perl nécessaires par CPAN ce qui permet d’avoir les versions les plus récentes : Modules Perl Amavisd par CPAN

aptitude install libarchive-tar-perl libarchive-zip-perl libberkeleydb-perl libcompress-zlib-perl libconvert-tnef-perl libconvert-uulib-perl libdigest-md5-perl libio-stringy-perl libmailtools-perl libmime-base64-perl libmime-perl libnet-perl perl-modules libnet-server-perl libtime-hires-perl libunix-syslog-perl libmail-dkim-perl liblog-log4perl-perl liblog-dispatch-perl libgetopt-argvfile-perl libconvert-binhex-perl libemail-sender-perl libnet-libidn-perl

On installe les dépendances de SA :

Pour ceux qui le souhaitent, on peut installer tous les modules perl nécessaires par CPAN ce qui permet d’avoir les versions les plus récentes : Modules perl pour SA par CPAN

aptitude install razor pyzor libhtml-parser-perl libnet-dns-resolver-programmable-perl liberror-perl libmail-spf-perl libmail-sendmail-perl libnetaddr-ip-perl libdbi-perl libdbd-mysql-perl liblocale-subcountry-perl libwww-perl libimage-base-bundle-perl libimage-base-perl libimage-info-perl libnet-cidr-lite-perl libmime-encwords-perl libemail-valid-perl libencode-detect-perl

Note : IP ::Country n’existe pas en paquet, il faut l’installer par CPAN

Installation Spamassassin

On installe SA depuis les sources :

cd ~
 wget http://mirror.ibcp.fr/pub/apache//spamassassin/source/Mail-SpamAssassin-3.4.1.tar.gz
 tar xvzf Mail-SpamAssassin-3.4.1.tar.gz
 cd Mail-SpamAssassin-3.4.1
 perl Makefile.PL PREFIX=/usr
 make
 make install

On lance toute de suite l’update des règles de SA (obligatoire depuis la version 3.3.0) :

sa-update -D

Cela aura pour effet de télécharger les règles à jour. Elles seront installées dans /var/lib/spamassassin/3.004001 (ce qui correspond à la version 3.4.1 de SA)

Installation Amavisd

Télécharger les sources d’amavisd :

cd ~
 wget http://amavis.org/amavisd-new-2.10.1.tar.xz
 tar xvf amavisd-new-2.10.1.tar.xz
 cd amavisd-new-2.10.1

Créer le user et le groupe amavis :

groupadd -g 1002 amavis
 useradd -g amavis -u 1002 amavis -d /var/amavis