====== Email ======
Comment configurer un hébergement d'email sur un serveur Debian (ou autre).
Les caractéristiques du serveur mail en bref :
* Postfix
* Dovecot
* SALS-auth
* maildrop
* multi-domaine
* multi-utilisateur
* pas de base de donnée
* OpenDKIM
* SpamAssassin
Se base sur le tutoriel [[http://www.postfix.org/VIRTUAL_README.html#virtual_mailbox|Postfix virtual MAILBOX example: separate domains, non-UNIX accounts]] et [[https://help.ubuntu.com/community/PostfixVirtualMailBoxClamSmtpHowto|Ubuntu.com - PostfixVirtualMailBoxClamSmtpHowto]]
L'idée est d'avoir un utilisateur (ici ''vmail'') qui va gérer tous les mails. Ils seront stocké selon la hiérarchie suivante :
/home/vmail/
example.com/
alice/
bob/
domain.net/
eve/
Avant de commencer, quelques limites importantes à garder en tête
* Tous les mails sont en clair, lisible par l'administrateur du système
* Le choix du mot de passe des comptes se fait via un script bash (pas pratique pour créer un compte pour toute la famille par ex)
* Les mots de passes sont hashés mais non salés (deux mots de passes égaux possèdent le même hash)
A la fin de la configuration, voici les paramètres avec lesquels on pourra authentifier notre adresse email dans le client (Thunderbird par exemple).
* IMAP
* Serveur: imap.example.com
* Port: 993
* Login: alice@example.com
* Sécurité: SSL/TLS
* Méthode: Mot de passe chiffré (CRAM-MD5)
* SMTP
* Serveur: smtp.example.com
* Port: 465
* Login: alice@example.com
* Sécurité: SSL/TLS
* Méthode: Mot de passe chiffré (CRAM-MD5)
//Avertissement: J'ai écrit tout ceci après avoir fait l'installation. Il se peut que j'ai oublié ou me suis trompé quelque part. Si vous repérez un problème, n'hésitez pas à me le signaler. Bien entendu n'exécutez pas de script ou commande sans les avoir comprises. Je vous rappelle que c'est un wiki et qu'un petit malin à pu ajouter un ''rm -rf /'' au milieu d'un script pendant la nuit. A bon entendeur...//
===== DNS =====
Pour chacun de vos domaine, créez les records suivants en replaçant l'adresse IP par celle de votre serveur :
example.com MX 1 smtp.example.com
smtp.example A 1.2.3.4
imap.example A 1.2.3.4
//Note: je vois partout l'utilisation d'un sous-domaine pour le champ MX mais ne connaît pas exactement la raison. Si tout est sur le même serveur, il me semble que ce n'est pas nécessaire. Sans savoir, respectons les conventions.//
===== Postfix =====
Postfix est le serveur SMTP.
==== /etc/postfix/main.cf ====
Le fichier de config principal est ''/etc/postfix/main.cf''
Voici les options importantes (ou à modifier) par rapport au fichier par défaut
# Les domaines depuis lesquels on va recevoir des mails
virtual_mailbox_domains = example.com, domain.net, monsite.org
# Dossier de base de stockage des mails
virtual_mailbox_base = /home/vmail
# C'est là qu'on va stocker la liste des emails
virtual_mailbox_maps = hash:/etc/postfix/vmaps
virtual_minimum_uid = 100
# UID du user et group vmail
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_alias_maps = hash:/etc/postfix/virtual
# 5GB de taille max des boites virtuelles
virtual_mailbox_limit = 5368709120
# la liste des ip depuis lesquelles on peut accéder au serveur smtp
# on commente car on va utiliser SASL-auth pour contrôler
# mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
# 5GB de mailbox max
mailbox_size_limit = 5368709120
# faire du dot addressing
recipient_delimiter = +
# 50MB de piece jointe max, on est plus en 2000
message_size_limit = 52428800
# SASL
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noplaintext,noanonymous
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth-client
smtpd_sender_restrictions = reject_unlisted_sender,reject_unknown_sender_domain,reject_non_fqdn_sender,reject_sender_login_mismatch,reject_authenticated_sender_login_mismatch
smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination
smtpd_client_restrictions = permit_sasl_authenticated,sleep 1,reject_unauth_pipelining
# Ajoute une ligne désignant l'utilisateur authentifié dans le header.A décommenter pour lutter contre les emails forgés.
#smtpd_sasl_authenticated_header = yes
# Table d'autorisation d'adresse mail par login SASL
smtpd_sender_login_maps = hash:/etc/postfix/sender_login
# pour refuser les adresses non définies
local_transport = virtual
local_recipient_maps = $virtual_mailbox_maps
# Trick IPv6 pour résoudre le problème de "address not listed for hostname"
import_environment = MAIL_CONFIG MAIL_DEBUG MAIL_LOGTAG TZ XAUTHORITY DISPLAY LANG=C RESOLV_MULTI=on
==== SMTPS ====
En plus du port 25 (non protégé), on veut accéder au mail depuis le port 465 via SSL. Décommentez en plus les lignes suivantes dans le fichier ''/etc/postfix/master.cf''. La première ligne concernant SMTP "simple" doit rester décommentée pour accepter les connexions des serveurs n'utilisant pas SMTPS.
smtps inet n - - - - smtpd
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
N'oubliez pas d'ouvrir les ports avec iptable
iptables -t filter -A INPUT -p tcp --dport 25 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 25 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 465 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 465 -j ACCEPT
Un complément sur le chiffrement SSL/TLS est présent dans [[startssl|Certificats avec StartSSL]].
==== vmail ====
C'est l'utilisateur qui gère le tout
groupadd -g 5000 vmail
useradd -m -u 5000 -g 5000 -s /bin/false vmail
//Note : l'utilisateur vmail est créé de façon à ne pas avoir d'accès shell pour plus de sécurité. En fonction de votre configuration, il est cependant possible que vous ayez besoin d'en activer un.//
==== /etc/postfix/vmaps ====
Un peu plus loin dans le tuto, on a un script qui rempli ce fichier pour vous mais vous pouvez le remplir à la main maintenant.
alice@example.com example.com/alice/
bob@example.com example.com/bob/
eve@domain.net domain.net/eve/
Dans le fichier ''/etc/postfix/virtual'', vous pouvez indiquer des redirections comme
bob@domain.net bob@example.com
postmaster@example.com bob+postmaster@example.com
Pour que tout les mails de Bob reçu à la première adresse soit reçu par la deuxième (ça fonctionne aussi pour les adresses sur des domaines externes. Notez que selon la [[https://tools.ietf.org/html/rfc5321#section-4.5.1|RFC5321]] demande d'avoir une adresse ''postmaster@'' existante pour chaque domaine.
Pour générer la base de donnée de vmaps et virtual.
postmap /etc/postfix/vmaps
postmap /etc/postfix/virtual
Et on redémarre le serveur !
systemctl restart postfix
=== Astuce anti-spam ===
Via le fichier ''virtual'', vous pouvez facilement créer des alias et faire votre service d'email jetables. En vous inscrivant sur un site suspect, ajoutez une ligne ''nom-site-suspect@example.com compte-principal+nom-site=suspect@example.com'' et régénérez le fichier via ''postmap''. Tous les emails seront delivres a votre adresse principale et vous pourrez facilement identifier la source de spam et la supprimer en enlevant la ligne ou la redirigeant vers un autre compte.
==== Test SMTP ====
=== mail ===
On teste que la réception de mail fonctionne bien. La commande ''mail'' va permettre d'envoyer un email à un utilisateur créé. On veut vérifier que Postfix fonctionne bien et va stocker le mail reçu au bon endroit.
$ mail alice@example.com
Cc:
Subject: Un email
Ceci est un email
Le mail doit être dans ''/home/vmail/example.com/alice/new/''
En cas de problème gardez un œil sur le fichier ''/var/log/mail.info''.
=== telnet ===
Un peu plus poussé. On veut essayer d'envoyer un email vers l'extérieur en exécutant directement des commandes SMTP.
$ telnet localhost 25
ehlo example.com
mail from:alice@example.com
rcpt to:machin@autre.com
data
Bonjour machin, voici ma nouvelle adresse
-Alice
.
quit
Si tout va bien, machin@autre.com doit avoir reçu votre email. Vous serez peut être tenté de tester telnet sur le port 465 (sécurisé) mais en raison de la règle ''-o smtpd_tls_wrappermode=yes'' mise dans le fichier ''master.cf'', la connexion sur ce port doit être chiffrée en TLS, ce qui est vachement difficile en telnet (je dirais même impossible).
Si vous testez de vous connecter depuis l'extérieur, vous aurez besoin de vous authentifier. Configurez d'abord Dovecot (suite du tutoriel). Un exemple de communication SMTP avec authentification est donné [[http://gerardnico.com/wiki/smtp_telnet|ici]].
==== Maildrop ====
//TODO remplacer cette section par sieve//
Cette section est **optionnelle**. Le serveur mail fonctionnera très bien si vous laissez Postfix gérer la réception des mails. Seulement, si l'on veut appliquer des filtres, SpamAssassin et autres, l'utilisation de maildrop peut être utile. Si vous utilisez maildrop, le contenu du fichier ''/etc/postfix/vmaps'' change de rôle. Il est nécessaire de continuer à lister chaque adresse email présente dans ce fichier (sinon les mail reçu seront rejetés) mais la seconde partie de la ligne (le dossier de destination), n'a plus d'importance.
On veut faire le tri des mails via [[http://www.courier-mta.org/maildrop.html|maildrop]] (alternative à [[http://www.procmail.org/|procmail]] qui n'est plus maintenu depuis 2001). On va suivre la manière expliquée [[http://www.postfix.org/MAILDROP_README.html|par postfix.org]].
Installez le paquet **maildrop**.
Dans ''/etc/postfix/main.cf'', ajoutez (ou modifier si déjà présentes), les lignes suivantes
virtual_transport = maildrop
maildrop_destination_recipient_limit = 1
#mailbox_command = /usr/bin/procmail
Parfois la dernière ligne est décommentée mais il est important qu'on utilise pas procmail ici (ou alors supprimez ce qui se trouve après le ''='', ça fonctionne aussi). On va ensuite configurer les règles dans ''/etc/postfix/master.cf''. Encore une fois, modifiez les lignes si déjà existantes.
maildrop unix - n n - - pipe
# flags=ODRhu user=vmail argv=/usr/bin/maildrop -d ${recipient}
flags=ODRhu user=vmail argv=/usr/bin/maildrop /etc/postfix/maildroprc ${domain} ${user} ${extension} ${recipient} ${user} ${nexthop}
La première ligne commentée est la forme habituelle où l'on utilise l'adresse email complète comme nom de dossier. Cependant ça ne correspond pas à notre structure et l'on aimerait être capable d'utiliser des emails sous la forme ''user+extension@domaine''. On va donc utiliser des règles spécifiées dans ''/etc/postfix/maildroprc'' en passant les arguments dans l'ordre d'apparition (les inutilisés sont ignorés). Sur certains systèmes ce fichier se trouve dans ''/etc/maildroprc'' (changez la commande ci dessus en conséquence) et doit appartenir à ''vmail:vmail'' avec un chmod à ''600'' sous peine de provoquer une erreur.
DEFAULT="/home/vmail/$1/$2"
Le [[http://en.gentoo-wiki.com/wiki/Maildrop#Configuration|wiki de Gentoo]] (down ? [[http://web.archive.org/web/20130404224643/http://en.gentoo-wiki.com/wiki/Maildrop|archive]]) donne plusieurs exemples de règles de filtrage que l'on peut mettre. Voici par exemple, une que j'utilise pour rediriger les mails venant d'une instance StatusNet dans le sous dossier StatusNet et une autre pour rediriger sur base de l'adresse de la personne qui envoie.
# Redirect to statusnet subdomain
if (/^X-StatusNet-Domain: */)
{
to $DEFAULT/.statusnet/
}
# Redirect mail from friends to the folder .Personal/
if ( /^From:.*(friend_1|friend_2|friend_3)/ )
{
exception {
to $DEFAULT/.Personal/
}
}
Les dossiers mentionnés peuvent être créé avec la commande suivante:
maildirmake.dovecot /home/vmail/example/alice/.statusnet 5000:5000
Le ''.'' devant le nom du dossier permet d'être détecté par votre client de messagerie.
Il existe également la commande ''maildirmake.maildrop'' cependant celle-ci ne semble pas tenir compte du propriétaire spécifié, et l'on aura besoin de faire un ''chown -R vmail:vmail'' après.
===== Dovecot =====
Dovecot se charge de IMAP. Installez le paquet **dovecot-imapd**. Si vous voulez configurer du POP3 (mais franchement, je vois pas pourquoi vous voudriez faire ça), c'est Dovecot qui vous sera utile également (à adapter de la config IMAP).
==== /etc/dovecot/dovecot.conf ====
Le fichier de config principal de Dovecot. On va utiliser des fichiers ''/etc/dovecot/users'' et ''/etc/dovecot/passwd'' qui fonctionnent comme les fichiers ''/etc/users'' et ''/etc/passwd'' pour les utilisateurs normaux.
**Avertissement** la version 2 est nécessaire pour faire fonctionner ces règles (pour les Debian-users, backport est votre ami). Cependant, certaines de ces règles sont dépréciées. Je n'ai pas été capable de trouver la correction, si vous la connaissez -> me [at] mart-e [point] be).
## Dovecot configuration file
auth_mechanisms = plain login
auth_username_format = %Lu
base_dir = /var/run/dovecot/
log_timestamp = "%Y-%m-%d %H:%M:%S "
mail_location = maildir:/home/vmail/%d/%n
mail_privileged_group = mail
protocols = imap
ssl_cert =
==== Multidomaine et SSL ====
Si vous avez plusieurs domaines email, il y a des chances que vous ayez également plusieurs certificats SSL. Si vous voulez éviter les grosses alertes de sécurité lorsque vous accédez à vos emails, vous pouvez modifier la configuration Dovecot pour utiliser des certificats en fonction du domaine.
ssl_cert =
Et pour vérifier que le bon certificat est bien sélectionné: ''openssl s_client -connect imap.domaine2.org:993 -servername imap.domaine2.org''.
Attention que le filtre est fait sur le //TLS SNI (Server Name Indication)//, une fonctionnalité que tous les clients mail n'implémentent pas. Thunderbird le fait, pas K9 mail (Android) par exemple. Dans le cas d'un client qui ne l'implémente pas, vous retomberez sur le certificat global. Il suffit de retirer le ''-servername imap.domaine2.org'' dans la commande openssl pour voir le résultat.
==== Création d'utilisateur ====
Plutôt que de tout faire à la main, on va utiliser des scripts pour créer un supprimer des utilisateurs. Ce script va créer des dossiers, ajouter un alias dans vmaps (n'oubliez pas de supprimer les doublons) et enregistrer l'utilisateur dans les deux fichiers adéquats.
Utilisez simplement avec ''./newuser.sh alice@example.com''
wget http://paste.mart-e.be/raw/curireqale -O ~/newuser.sh
#!/bin/sh
if [ ! $# = 1 ]
then
echo "Usage: $0 username@domain"
exit 1
else
user=`echo "$1" | cut -f1 -d "@"`
domain=`echo "$1" | cut -s -f2 -d "@"`
if [ -x $domain ]
then
echo "No domain given\nUsage: $0 username@domain"
exit 2
fi
echo "Adding user $user@$domain to /etc/dovecot/users"
echo "$user@$domain::5000:5000::/home/vmail/$domain/$user/:/bin/false::" >> /etc/dovecot/users
# Create the needed Maildir directories
echo "Creating user directory /home/vmail/$domain/$user"
# maildirmake.dovecot does only chown on user directory, we'll create domain directory instead
if [ ! -x /home/vmail/$domain ]
then
mkdir /home/vmail/$domain
chown 5000:5000 /home/vmail/$domain
chmod 700 /home/vmail/$domain
fi
/usr/bin/maildirmake.dovecot /home/vmail/$domain/$user 5000:5000
# Also make folders for Drafts, Sent, Junk and Trash
/usr/bin/maildirmake.dovecot /home/vmail/$domain/$user/.Drafts 5000:5000
/usr/bin/maildirmake.dovecot /home/vmail/$domain/$user/.Sent 5000:5000
/usr/bin/maildirmake.dovecot /home/vmail/$domain/$user/.Junk 5000:5000
/usr/bin/maildirmake.dovecot /home/vmail/$domain/$user/.Trash 5000:5000
# To add user to Postfix virtual map file and relod Postfix
echo "Adding user to /etc/postfix/vmaps"
echo $1 $domain/$user/ >> /etc/postfix/vmaps
postmap /etc/postfix/vmaps
# Add user's mail address to the list of addresses he is allowed to use
echo "Adding user to /etc/postfix/sender_login"
echo $1 $1 >> /etc/postfix/sender_login
postmap /etc/postfix/sender_login
postfix reload
fi
echo "Create a password for the new email user"
#SWAP THE FOLLOWING passwd LINES IF USING A UBUNTU VERSION PRIOR TO 12.04
#passwd=`dovecotpw`
passwd=`doveadm pw -u $user`
echo "Adding password for $user@$domain to /etc/dovecot/passwd"
if [ ! -x /etc/dovecot/passwd ]
then
touch /etc/dovecot/passwd
chmod 640 /etc/dovecot/passwd
fi
echo "$user@$domain:$passwd" >> /etc/dovecot/passwd
# Register special mailboxes (Junk, Trash...)
for mailbox in `doveadm mailbox list -u $user@$domain`
do
doveadm mailbox subscribe -u $user@$domain $mailbox
done
exit 0
==== Suppression d'utilisateur ====
La même chose pour la suppression, ''./deluser.sh alice@example.com''.
wget http://paste.mart-e.be/raw/hewisesido -O ~/deluser.sh
#!/bin/bash
#
# deldovecotuser - for deleting virtual dovecot users
#
if [ ! $# = 1 ]
then
echo -e "Usage: $0 username@domain"
exit 1
else
user=`echo "$1" | cut -f1 -d "@"`
domain=`echo "$1" | cut -s -f2 -d "@"`
if [ -x $domain ]
then
echo -e "No domain given\nUsage: $0 username@domain: "
exit 2
fi
fi
read -n 1 -p "Delete user $user@$domain from dovecot? [Y/N]? "
echo
case $REPLY in
y | Y)
new_users=`grep -v $user@$domain /etc/dovecot/users`
new_passwd=`grep -v $user@$domain /etc/dovecot/passwd`
new_vmaps=`grep -v $user@$domain /etc/postfix/vmaps`
new_sender=`grep -v "^$1" /etc/postfix/sender_login`
echo "Deleting $user@$domain from /etc/dovecot/users"
echo "$new_users" > /etc/dovecot/users
echo "Deleting $user@$domain from /etc/dovecot/passwd"
echo "$new_passwd" > /etc/dovecot/passwd
echo "Deleting $user@$domain from /etc/postfix/vmaps"
echo "$new_vmaps" > /etc/postfix/vmaps
echo "Deleting $user@$domain from /etc/postfix/sender_login"
echo "$new_sender" > /etc/postfix/sender_login
postmap /etc/postfix/sender_login
postmap /etc/postfix/vmaps
postfix reload
read -n1 -p "Delete all files in /home/vmail/$domain/$user? [Y/N]? " DELETE
echo
case $DELETE in
y | Y)
echo "Deleting files in /home/vmail/$domain/$user"
rm -fr /home/vmail/$domain/$user
;;
* )
echo "Not deleting files in /home/vmail/$domain/$user"
;;
esac
;;
* )
echo "Aborting..."
;;
esac
Et on redémarre !
systemcl restart dovecot
===== Score de spam =====
Le principe des filtres anti-spam (dont [[https://wiki.apache.org/spamassassin/|spamassain]] est le plus connu) est très simple. Vous partez d’un score de zéro. Lorsque le filtre détecte quelque chose de suspect votre score augmente, lorsque vous avez un comportement que n’aurait pas un spammeur, vous perdez des points. Arrivé à une certaine limite, vous devenez un spam.
Évidement toute la difficulté réside à bien pondérer et trouver les bons critères. Le fait d’utiliser des mots comme « viagra » va vous faire gagner des points. Les spammeurs l’ayant comprit, ils utiliseront v1agra par exemple. Les critères faisant perdre des points ne doivent pas non plus être simples où un spammeur les utilisera pour passer inaperçu.
Il existe également le filtre bayésien plus complexe mais très puissant qui va utiliser des probabilités statistiques. Ce filtre se base sur le contenu du message et l’on a donc pas d’influence coté serveur. Évitez juste de parler de vente de médicament en ligne dans vos messages.
Voici un exemple de résultat SpamAssassin donné par un serveur mail. N'hésitez pas à faire de nombreux tests, tous ne sont pas réglés de la même façon et j'en ai rencontré des beaucoup plus sévères que d'autres.
X-SGSI-SpamCheck: n'est pas un polluriel, SpamAssassin (score=-0.119, requis 5,
autolearn=not spam, DKIM_SIGNED 0.10, DKIM_VALID -0.10, DKIM_VALID_AU -0.10,
DKIM_VERIFIED -1.00, RDNS_DYNAMIC 0.98, SPF_HELO_PASS -0.00)
En compte mails gratuits, je n'ai trouvé qu'[[http://mail.opera.com|Opera]] qui donnait le détail du score SpamAssasin sans être très bavard non plus (mais toujours mieux que Google ou Yahoo).
==== Reverse DNS ====
La résolution DNS classique est de faire correspondre une URL à une IP. Le reverse DNS est le chemin inverse. S'il n'est pas configuré, vous aurez le « bonus » RDNS_DYNAMIC 0.98.
En mettant votre nom de domaine à la place, le problème est réglé. Vous pouvez vérifier que vous avez la bonne valeur via la commande ''$ dig -x 11.22.33.44'' dans le champ PTR. J’ai remarqué que certains serveurs prenaient beaucoup de temps à mettre à jour leurs reverse DNS donc prenez votre mal en patience.
Si vous possédez comme moi plusieurs domaines pointant sur la même IP, sachez qu’il est inutile de mettre plusieurs entrées DNS PTR, cela pourrait être même contre productif ([[http://serverfault.com/a/66060/61652|source]]).
Si votre serveur de mail est amené à utiliser de l'IPv6 il faut aussi mettre à jour de reverse DNS de la ou des adresse(s) IPv6.
==== SPF ====
[[http://www.openspf.org/|SPF]] pour //Sender Policy Framework// est une méthode pour certifier l'envoie d'un email et diminuer le risque de tomber dans le dossier spam de certains filtres.
Certains registars comme OVH (ndlr: je ne fais pas de la pub pour eux, juste que c'est le seul que j'utilise et je ne peux pas dire si c'est une pratique courante ou non) proposent de configurer un champ spf automatiquement. Autrement le site [[http://www.openspf.org/|openspf.org]] explique en détail la marche à suivre. Un exemple très simple de record SPF serait:
v=spf1 a mx ~all
Attention, il est important de configurer un reverse DNS pour votre adresse IP vers votre nom de domaine. Certains serveurs mails vérifient cela et autant ne pas en partir.
**Attention**: SPF [[http://www.openspf.org/FAQ/Forwarding|casse la redirection]] ! Si vous envoyez un mail à machin@gmail.com sur laquelle votre correspondant a réglé une redirection automatique vers machin@myopera.com, c'est l'adresse IP de Google qui apparaîtra et pas la votre. La vérification SPF échouera donc. Cependant, ce n'est pas si grave que ça parce que le filtre anti-spam de Opera doit avoir l'habitude de recevoir tous les emails venant de machin@gmail.com qui a des bonnes chances d'être dans une liste blanche. Donc si le serveur du correspondant est bien fait, ça ne devrait pas poser de problèmes.
==== DKIM ====
Comme SPF, DKIM (pour //DomainKeys Identified Mail//) est un standard pour certifier l'envoie d'un email et diminuer le risque de tomber dans le dossier spam de certains filtres. En comparaison SPF va donner la liste des adresses IP pouvant envoyer un courrier tandis que DKIM va signer les headers avec une clef asymétrique. La clef privée est connue uniquement du serveur mail et la clef publique est publiée dans les DNS. Étant donné que la clé publique est stockée dans une entrée DNS il est recommandé d'activer DNSSEC sur votre zone autrement votre signature sera classé comme ''insecure''.
La méthode utilisée vient de ce tutoriel: [[http://blog.tjitjing.com/index.php/2012/03/guide-to-install-opendkim-for-multiple-domains-with-postfix-and-debian.html|
Guide to Install OpenDKIM for multiple domains with Postfix and Debian]]. Il existe dk-filter mais on va utiliser ici OpenDKMI (pas spécialement de raison).
Commencez par installer le paquet **opendkim** et **opendkim-tools**. La version dans Debian stable, la 2.0, date de 2010, j'ai donc préféré installer celle venant des backports plus à jour.
Modifiez le fichier ''/etc/opendkim.conf'' et ajoutez à la fin les quatres lignes suivantes:
KeyTable /etc/opendkim/KeyTable
SigningTable /etc/opendkim/SigningTable
ExternalIgnoreList /etc/opendkim/TrustedHosts
InternalHosts /etc/opendkim/TrustedHosts
Créez le dossier mentionné (''/etc/opendkim'') et les trois fichiers contenant ceci.
**KeyTable**
default._domainkey.example.com example.com:default:/etc/opendkim/keys/example.com/default.private
**SigningTable**
example.com default._domainkey.example.com
**TrustedHost**
127.0.0.1
localhost
11.22.33.44
En remplaçant les ''example.com'' par votre nom de domaine et le ''11.22.33.44'' par l'adresse IP de votre serveur, vous pouvez aussi ajouter une IPv6. Créez une ligne par domaine que vous désirez signer dans les deux premiers fichiers.
Pour générer les clefs mentionnées, exécutez les commandes suivantes à répéter et adapter pour chaque domaine que vous possédez
# mkdir -p /etc/opendkim/keys/example.com
# cd /etc/opendkim/keys/example.com
# opendkim-genkey -r -d example.com
# chown opendkim:opendkim default.private
Votre clef privée se trouve dans ''default.private'' (chhhht secret) et la clef publique se trouve dans ''default.txt''. Dans la configuration de votre zone DNS pour chacun des domaines, créez un champ TXT pour le sous-domaine ''selector._domainkey'' et mettez la valeur indiquée dans le fichier. Mon entrée DNS est par exemple:
selector._domainkey.mart-e.be TXT IN "k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4 GNADCBiQKBgQChUywElHkvIJwgp9B Yce97yhv0ImwK5+2Jm0CHBCfjYpeV7 pSaAh/aYmX9+BJcSupVnJYBPf4DT/A FbV7O6snG6rGf3bnJSHdfyGa7Zq8a/ 7ERdTYo6/W5LJvaenDAxqlWPlgVafQt ncRt+4/iF133FXLpC4VL6NmbMirK0yM RKQIDAQAB"
Spécifiez l'adresse et port sur lequel on va écouter en décommentant la ligne suivante dans ''/etc/default/opendkim'' (vous pouvez bien entendu changer le numéro de port à répercuter par la suite).
SOCKET="inet:12345@localhost" # listen on loopback on port 12345
Dans la configuration Postfix (''/etc/postfix/main.cf'' pour ceux qui ne suivent pas), ajoutez maintenant simplement les quatre lignes suivantes :
milter_default_action = accept
milter_protocol = 6
smtpd_milters = inet:localhost:12345
non_smtpd_milters = inet:localhost:12345
Toujours pour Postfix, dans le fichier ''master.cf'', ajoutez le champ ''smtpd_milters'' pour chaque type activé (smtp, submission et smtps selon votre configuration). Pour smtps, on obtient donc :
smtps inet n - - - - smtpd
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
-o smtpd_milters=inet:127.0.0.1:12345
Redémarrez opendkim et postfix
# /etc/init.d/opendkim restart
# /etc/init.d/postfix restart
Pour vérifier votre signature DKIM, envoyez un email à ''autorespond+dkim@dk.elandsys.com''. Vous receverez un rapport
DKIM Signature validation: pass
DKIM Author Domain Signing Practices: no DNS record for _adsp._domainkey.mart-e.be
===== Vérification de spam =====
**Avertissement**: cette section n'est encore qu'à l'état de commencement. Fiez vous y avec un regarde critique.
Si les règles ci-dessus évitent de se faire passer pour un spam voyons comment on peut éviter de crouler sous le spam. On va utiliser le célèbre [[http://spamassassin.apache.org/|SpamAssassin]] histoire de faire comme tout le monde.
==== Installation et intégration ====
Sous Debian, installez le paquet **spamassassin**. On va créer un utilisateur **spamd** responsable du démon spamassassin.
//Note: l'on utilise ici spamassassin en mode client-démon. Il est également possible de faire tourner spamassassin en standalone à la place du couple spamc/spamd. Cela peut être intéressant si vous avez un faible volume de mail (pour éviter de faire tourner un service inutilement). Il faudrait tester à quel point c'est consommateur en ressources.//
$ groupadd -g 5001 spamd
$ useradd -u 5001 -g spamd -s /sbin/nologin -d /var/lib/spamassassin spamd
$ mkdir /var/lib/spamassassin
$ chown spamd:spamd /var/lib/spamassassin
Modifiez le fichier ''/etc/default/spamassassin'' pour y mettre ceci
ENABLED=1
SAHOME="/var/lib/spamassassin/"
OPTIONS="--create-prefs --max-children 5 --username spamd --helper-home-dir ${SAHOME} -s ${SAHOME}spamd.log"
PIDFILE="${SAHOME}spamd.pid"
Pour que les mails soient vérifiés par maildrop, ajouter dans le fichier de configuration ''/etc/postfix/maildroprc'', avant les règles de filtrage :
# Filter spamassassin pour moins de 25Mo
if ( $SIZE < 26144 )
{
exception {
xfilter "/usr/bin/spamc -u spamd"
}
}
# Uniquement désirez déplacer les spam dans un dossier
if (/^X-Spam-Flag: YES/)
{
exception {
to $DEFAULT/.spam/
}
}
Le fichier de configuration principal est ''/etc/spamassassin/local.cf''. Lisez le et décommentez les lignes pour activer les options qui vous intéresse. On a par exemple :
# mettre SPAM dans le sujet du message suspecté
rewrite_header Subject *****SPAM*****
# Les headers des mails entrants vont être modifié avec des x-spam
report_safe 0
# le score requis avant d'être considéré comme spam
required_score 6.0
# activer le filtre baysien
use_bayes 1
La [[https://spamassassin.apache.org/full/3.3.x/doc/Mail_SpamAssassin_Conf.html|documentation SpamAssassin]] décrit les différentes règles qui peuvent être intéressantes.
Après cela démarrez spamassassin (''service spamassassin start'') qui va se mettre à scanner vos mails. Surveillez les headers de vos messages ainsi que le fichier de ''/var/log/mail.log''.
Pour accélérer la procédure, vous pouvez compilez vos règles SA (spamassassin 3.2 min) avec la commande ''sa-compile''. Décommentez ensuite la ligne ''loadplugin Mail::SpamAssassin::Plugin::Rule2XSBody'' dans ''/etc/spamassassin/v320.pre''.
Vous pourrez désormais, voir passer des superbes échantillons de spam [[http://paste.mart-e.be/bugodivoce|comme celui-ci]] (efficace n'est ce pas).
==== Vérification SPF ====
Pour faire simple, installez le paquet **libmail-spf-perl**. Si vous ne possédez pas ce paquet ou que vous aimez compilez tout à la main, on va utiliser CPAN (attention, c'est lent), package manager perl.
Pour que SA vérifie les champs SPF, on a besoin du plugin ''Mail::SPF::Query''.
$ perl -e 'require Mail::SPF::Query'
Si la commande retourne une erreur "Can't locate Mail/SPF/Query.pm in @INC..." , vous avez besoin d'installer le plugin.
$ perl -MCPAN -e shell
...
> install Mail::SPF::Query
==== Vérification DKIM ====
Pour que SA vérifie la signature DKIM il faut le paquet ''libmail-dkim-perl''.
De plus il est préférable de récupérer les enregistrements DNS des mails que vous vérifiez avec DNSSEC.
==== Debug ====
Pour débugger SpamAssassin, plusieurs choses peuvent être faites. Tout d'abord, regardez le fichier de log spécifié dans ''/etc/default/spamassassin''. Si vous avez appliqué la config proposé, il se trouvera dans ''/var/lib/spamassassin/spamd.log''.
Un moyen de tester si votre détection de spam fonctionne bien est de vous envoyer un mail contenant :
''XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X''.
Cette chaîne vous donne un "bonus" de 1000 et déclenchera donc le filtrage spam.
Par défaut, le détail de l'analyse n'est affiché qu'en cas de spam. Si vous désirez l'afficher également pour les messages normaux, modifiez le fichier ''/etc/spamassassin/local.cf''.
# decommentez si vous désirez effacer toutes les regles de headers pour utiliser les votres
#clear_headers
# ajouter le rapport en cas de ham
add_header ham Report _REPORT_
# vous pouvez meme en inventer tant que ca respecte le format
# add_headers { spam | ham | all } header_name string
# https://spamassassin.apache.org/full/3.3.x/doc/Mail_SpamAssassin_Conf.html#template_tags
add_header spam Waw c'est du spam _STARS(*)_ ca
==== fail2ban ====
Installer le package **fail2ban** et activer dans ''/etc/fail2ban/jail.conf'' les regles ''postfix'', ''dovecot'' et ''sasl''.
===== Autre =====
==== plus-addressing ====
Une fonctionnalité intéressante dans Gmail est le "plus-addressing", le fait de pouvoir créer une infinité d'adresse email de type nom+alias@serveur.com. Dans postfix, c'est facilement reproductible (sans doute même activé par défaut il me semble).
Dans le fichier ''/etc/postfix/main.cf'', chercher la ligne suivante (l'ajouter si inexistante)
recipient_delimiter = +
Cela spécifie que le symbole + sera considéré comme délimiteur. Si vous changez le "+" par ".", "_" ou autre, il deviendra le nouveau délimiteur. Cela vous permet donc de crever des adresses de type nom.alias@serveur.com a la place. Certains formulaires refusant les + ou les retirant automatiquement, vous servez ainsi paré (évidement ne fonctionne pas si votre adresse est prenom.nom@serveur.com).
==== Prolongements ====
La page [[fonction_mail_php|msmtp]] explique comment envoyer des mails en ligne de commande et avec PHP après avoir configuré ce serveur mail.
==== Liens utiles ====
[[http://www.emailsecuritygrader.com/|Email Security Grader]] permet de tester son serveur mail. Fait la vérification de SPF, reverse DNS, quelques points de sécurité... Pratique pour s'assurer qu'on a rien oublié. Si vous suivez l'ensemble de ce tuto, vous devriez décrocher le rang de "VERY STRONG SECURITY", pas mal hein ;-)
[[http://www.checktls.com|CheckTLS]] permet de tester la connexion sécurisée de votre serveur de mail en testant la validité de votre certificat et permet la visualisation complète du déroulement du protocole SMTP.