Table des matières
Disposer d'un serveur de messagerie assurant:
-
Gestion des utilisateurs et domaines virtuels en BDD
-
Les échanges en TLS et SSL
-
Le filtrage des virus et spams
-
Interface d'administration
-
Webmail
pré requis : Une Debian Etch fraîchement installée sur une machine dédiée et un nom de domaine déposé
L'installation du serveur se fera de manière progressive avec à chaque étape des points de contrôle permettant de s'assurer du fonctionnement correct des options.
Commençons par l'installation toute simple du serveur :
apt-get install postfix procmail
Divers configurations sont proposées, celle qui nous intéresse est "Site internet". Ensuite il s'agit de fournir le nom de domaine : ' catapulse.org ' dans cet article.
Un utilisateur de test devra être créé sur le système :
adduser gaston
On teste le fonctionnement du serveur de messagerie avec un simple telnet :
telnet localhost 25 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 www.catapulse.org ESMTP Postfix (Debian/GNU) ehlo catapulse.org 250-www.catapulse.org 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-STARTTLS 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN mail from: root@catapulse.org 250 2.1.0 Ok rcpt to: gaston@catapulse.org 250 2.1.5 Ok data 354 End data with <CR><LF>.<CR><LF> Hello Gaston, Ceci est un test . 250 2.0.0 Ok: queued as B3AD41640DD quit
Le message est bien transmis, on peut le verifier avec la
présence du fichier
/var/mail/gaston
Jusque là tout va bien mais ça se corse lorsque l'on procède avec la même méthode mais à distance:
telnet www.catapulse.org 25 Trying 88.191.38.118...
Et rien ne se passe :( pas d'ouverture de port ??? Le port 25 est pourtant bien ouvert sur le Firewall.
Mon fournisseur Orange a fait des siennes :( ... Ces $%@#% bloquent tous les accès à destination du port 25 excepté pour leurs propres serveurs de messagerie, ceci dans le but affiché de réduire le Spam ... ce que je vois moi c'est que ça m'empêche de disposer d'un serveur privé de messagerie !!! De plus la fermeture de ce port a été faite de manière autoritaire sans même en informer ses utilisateurs. Free a une toute autre politique, certes le port 25 est stoppé par défaut mais ils offrent la possibilité de le débloquer ... Choisis ton camp camarade :)
Réduire le spam pfffff ... J'utliserai donc un autre port : le 587
normalisé par la
rfc4409.txt
. Ce
protocole permet de soumettre des messages comme sur le port 25 mais en
y ajoutant des couches restrictives. Mais juste pour rire on peut très
bien l'utiliser en plus du port 25 pour transmettre nos messages, pour
cela il suffit d'ajouter la ligne suivante au fichier
/etc/postfix/master.cfg
:
submission inet n - - - - smtpd
Qui nous dit d'écouter sur le port 'submission' (587) sans restriction. En remplacant le port 25 par le 587 dans le client de messagerie il est à nouveau possible de transmettre des mails :) ... et donc le fait de bloquer le port 25 n'a jamais empêcher un spammeur de nuire.
La configuration et le comportement de Postfix est enregistré dans
les deux fichiers
main.cfg
et
master.cfg
que nous allons détailler. Pour cela
nous repartierons de deux fichiers vierges qui seront renseignés
progressivement.
Notre nouveau fichier
main.cfg
sera:
# Banniere d'acceuil smtpd_banner = $myhostname ESMTP # Envoi notification 'nouveau message' (biff -y sous unix) biff = no # Non c'est l'affaire du MUA append_dot_mydomain = no # le nom qualifié de la machine myhostname = smtp.catapulse.org # le domaine mydomain = catapulse.org mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain # Les alias locaux ( a supprimer lors de l'utilisation de mysql, ceux-ci # deviennent virtuels) alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases # RELAY # Les réseaux autorisés à relayer (seule la machine en a le droit ) # Notre serveur n'est surtout pas openrelay ! mynetworks = 127.0.0.0/8 # Ou livrer le courier (si vide livraison directe) relayhost = # Pas de domaine étranger relay_domains = # Commande externe utilisée pour la livraison des messages mailbox_command = procmail -a "$EXTENSION" # No limit mailbox_size_limit = 0 # Séparateur entre nom et extension recipient_delimiter = + # 2coute sur toute les interfaces réseaux inet_interfaces = all
Pour plus d'infos sur ces directives voir en référence la traduction française de la doc Postfix .
Au tour de
master.cfg
. Ce fichier défini les
'
services
' éxécutés sous le contrôle du daemon
'
master
'. (man 5 master).
# ========================================================================== # service type private unpriv chroot wakeup maxproc command + args # (yes) (yes) (yes) (never) (100) # ========================================================================== smtp inet n - - - - smtpd submission inet n - - - - smtpd -v pickup fifo n - - 60 1 pickup cleanup unix n - - - 0 cleanup qmgr fifo n - n 300 1 qmgr tlsmgr unix - - - 1000? 1 tlsmgr 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 showq unix n - - - - showq error unix - - - - - error discard unix - - - - - discard local unix - n n - - local virtual unix - n n - - virtual #lmtp unix - - - - - lmtp anvil unix - - - - 1 anvil scache unix - - - - 1 scache
Sans entrer dans les détails, un message lorsqu'il arrive sur le serveur est filtré par des directives qui dépendent de 'services' dont voilà le minimum vital.
Nota : J'ai ajouté un ' smtpd -v ' sur le port submission pour débugger les accès.
A ce niveau il est possible de transmettre des mails sur les ports smtp (25) et submission (587). On peut le vérifier avec l'envoi, à partir d'un autre domaine (un webmail ?), d'un mail à gaston@catapulse.org. Aucune authentification n'est cependant requise ! Pas bon ça
Il est temps d'ajouter une couche de virtualité pour la gestion des domaines et utilisateurs virtuels.
L'ennui avec la méthode précédente est l'obligation de créer autant d'utilisateur qu'il y a de compte mail. Nous allons cette fois-ci procéder de manière radicalement différente, les utilisateurs et les noms de domaines seront stockés en base. Notre serveur deviendra multi domaines et multi utilisateurs. L'authentification se fera alors directement sur la base de donnée.
apt-get install postfix-mysql
Bien sûr il sera nécessaire de disposer d'une base Mysql.
La base ' postfix ' sera créée. Nous devrons aussi créer un utilisateur 'postfix' et lui fournir les droits de lecture sur la base 'postfix' :
mysql -u root -p mysql> CREATE DATABASE postfix; mysql> GRANT SELECT ON postfix.* TO postfixadmin@localhost IDENTIFIED BY 'posfixPW'; mysql> FLUSH PRIVILEGES; mysql> exit
Ensuite nous créerons le SQL postfixmysql.sql des trois tables nécessaires au stockage des domaines, utilisateurs et alias (les autres le sont pour Postfixadmin que nous verrons plus tard)
USE postfix; # # Table structure for table admin # 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 int(10) 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';
mysql -u root -p postfix < postfixmysql.sql
On y insère un domaine, en l'occurence ' catapulse.org ' et un administrateur 'admin'
mysql> INSERT INTO domain (domain, description) VALUES ('catapulse.org', 'Domaine privé'); mysql> INSERT INTO admin (username, password, active) VALUES ('admin@catapulse.org', '$1$sK7MLB8p$6MgSK7FuqHGdE98diqlty.', '1'); mysql> INSERT INTO domain_admins (username, domain, active) VALUES ('admin@catapulse.org', 'ALL', '1'); mysql> INSERT INTO mailbox (username, password, name, maildir, domain, active) VALUES ('admin@catapulse.org', '$1$sK7MLB8p$6MgSK7FuqHGdE98diqlty.', 'Gaston Lagaffe', '/home/virtual', 'catapulse.org', '1');
Pour créer le mot de passe d'admin j'ai utilisé le script php suivant:
<?php
echo crypt ('mypassword');
?>
Ce dernier sera utilisé lors de la connexion à l'interface d'aministration de Postfix (Postfixadmin)
Voilà tout est prêt pour s'authenfier avec Mysql, cependant pour bien en être sûr supprimons tout de suite l'utilisateur système gaston précédmeent créé.
userdel -f gaston
Le courrier ne sera plus livré localement par Postfix mais par le mail delivery agent (MDA) de Dovecot, aussi appelé "Dovecot LDA", qui pour ceux que ça intéresse intègre un plugin supportant le langage Sieve. Dovecot nous permettra aussi d'interroger le serveur en pop3, imap, pop3s et imaps, avec bien sur une authentification sur la base Mysql.
L'installation se fait simplement:
apt-get install dovecot-imapd dovecot-pop3d
Tous les mails seront gérés par l'utilisateur vmail qu'il nous faut créer:
groupadd -g 5000 vmail useradd -g vmail -u 5000 vmail -d /home/vmail -m -s /bin/false -c "Virtual mailbox"
On doit indiquer à Postfix quels seront les uid et gid de cet utilisateur virtuel:
postconf -e virtual_uid_maps=static:5000 postconf -e virtual_gid_maps=static:5000
Pour que
Postfix
utilise l'agent
Dovecot LDA il faut l'ajouter en tant que service dans
master.cfg
:
dovecot unix - n n - - pipe
flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient}
Il faut aussi indiqué à Postfix d'utiliser ce service pour le courier à destination des utilisateurs virtuels:
postconf -e virtual_transport=dovecot postconf -e dovecot_destination_recipient_limit=1
Postfix utilise des tables de mappage pour rechercher les utilisateurs, domaines et alias en base. Pour cela les fichiers suivants doivent être constitués:
/etc/postfix/mysql_virtual_domains_maps.cf
:
user = postfixadmin password = postfixPW hosts = 127.0.0.1 dbname = postfix query = SELECT domain FROM domain WHERE domain = '%s' and active = '1'
/etc/postfix/mysql_virtual_mailbox_maps.cf
:
user = postfixadmin password = postfixPW hosts = 127.0.0.1 dbname = postfix query = SELECT maildir FROM mailbox WHERE username = '%s' and active = '1'
/
etc/postfix/mysql_virtual_alias_maps.cf
:
user = postfixadmin password = postfixPW hosts = 127.0.0.1 dbname = postfix query = SELECT goto FROM alias WHERE address = '%s' and active = '1'
Les commandes suivantes activent leurs prises en compte:
postconf -e virtual_mailbox_domains=proxy:mysql:/etc/postfix/mysql_virtual_domains_maps.cf postconf -e virtual_mailbox_maps=proxy:mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf postconf -e virtual_alias_maps=proxy:mysql:/etc/postfix/mysql_virtual_alias_maps.cf
Redémarrage de Postfix et verification de la configuration:
/etc/init.d/postfix restart postmap -q catapulse.org mysql:/etc/postfix/mysql_virtual_domains_maps.cf catapulse.org postmap -q admin@catapulse.org mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf /home/virtual postmap -q admin@catapulse.org mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf /home/virtual
Et un peu de sécurité:
chgrp postfix /etc/postfix/mysql_*.cf chmod u=rw,g=r,o= /etc/postfix/mysql_*.cf
Voilà s'en est
terminé du paramétrage de Postfix pour la prise en compte d'utilisateurs
et de domaines vituels. Il reste cependant quelques autres détails à
régler. Puisque le domaine '
catapulse.org
' est devenu
virtuel il ne doit plus apparaitre dans la variable
mydestination
du fichier
main.cfg
:
mydestination = $myhostname, localhost.$mydomain, localhost
Postfix sait qu'il doit remettre les mails "virtuels" à Dovecot, il
est donc temps de le paramétrer pour qu'il délivre aussi ces derniers. Son
second rôle est d'assurer la disponibilité des mails via les protocoles
imap(s) et pop3(s). Dans
/etc/dovecot/dovecot.conf
nous choisissons les protocoles utilisés:
protocols = imap pop3 imaps pop3s
L'autre paramètre important est mail_location (dans le répertoire personnel de vmail ) :
mail_location = maildir:/home/vmail/%d/%n/Maildir
Les
mails seront stockés dans des répertoires de la forme
/home/vmail/DOMAIN/USER
.
Pour continuer à gérer les utilisateurs système on ajoute les lignes:
# Au cas ou l'on ne peut mieux
disable_plaintext_auth = no
namespace private {
separator = .
prefix = INBOX.
inbox = yes
}
Dans la section " auth default " on définit les mécanismes d'authentificaton, la définition de la base de données et oû seront stockés les mails
auth default {
mechanisms = plain login
passdb sql {
args = /etc/dovecot/sql.conf
}
userdb static {
args = uid=5000 gid=5000 home=/home/vmail/%d/%n allow_all_users=yes
}
passdb pam {
# use /etc/pam.d/imap and /etc/pam.d/pop3
args = *
}
...
C'est dans cette section que nous pouvons choisir de nombreux mode d'authentification ( fichier passwd, PAM, BDD, LDAP ...). Pour que les utilisateurs locaux se connecte nous utilisons " passdb pam ".
Les sockets utilisées lors de l'authentification sont décrites dans la section ' socket listen ' :
socket listen {
master {
path = /var/run/dovecot/auth-master
mode = 0600
user = vmail
}
client {
path = /var/spool/postfix/private/auth
mode = 0660
user = postfix
group = postfix
}
}
La section ' master ' indique à Dovecot comment accéder aux informations de l'utilisateur vmail et la section ' client ' créé une socket dans le chroot de Postfix.
Et enfin pour finir le protocol LDA (local delivry agent) nous y ajoutons:
protocol lda {
log_path = /home/vmail/dovecot-deliver.log
auth_socket_path = /var/run/dovecot/auth-master
postmaster_address = admin@catapulse.org
mail_plugins = cmusieve
global_script_path = /home/vmail/globalsieverc
}
On edite ensuite le fichier
/etc/dovecot/sql.conf
pour renseigner Dovecot du
moyen à utiliser pour checher les utilisateurs et leurs mots de
passe.
# Default password scheme. # # List of supported schemes is in # http://wiki.dovecot.org/Authentication/PasswordSchemes default_pass_scheme = CRYPT driver = mysql connect = host=127.0.0.1 dbname=postfix user=postfix password=postfixPW password_query = SELECT email as username, password FROM mailbox WHERE email='%u'
Et enfin on redémarre Dovecot:
/etc/init.d/dovecot restart
Dans
/var/log/mail.log
doit apparaitre :
Dec 29 02:39:15 sd-6588 dovecot: Dovecot v1.0.rc15 starting up Dec 29 02:39:17 sd-6588 dovecot: auth-worker(default): mysql: Connected to 127.0.0.1 (postfix)
Ok la connexion à la base se fait correctement :)
Pour terminer quelques permissions sont fixées :
chgrp vmail /etc/dovecot/dovecot.conf chmod g+r /etc/dovecot/dovecot.conf
A ce niveau il est désormais possible de tester le serveur pour qu'il réponde aux protocoles imap, pop3 et bien sur smtp. Nous pouvons effectuer nos tests à partir d'un client de messagerie quelconque en le paramétrant avec le compte ' admin@catapulse.org ' et le mot de passe ' mypasswd '. Les interrogations imap et pop3 répondent correctement par contre pop3s et imaps ne fonctionnent pas :( De même lors de l'envoi d'un mail aucune authentification ne bous est encore réclamée !
La rfc4409 oblige l'authentification lors de la soumission de message. Cela peut se faire au travers des méthodes suivantes:
Pour prendre en charge l'authentification SASL il suffit d'ajouter
des restrictions au service '
submission
' du fichier
/etc/postfix/master.cf
:
submission inet n - - - - smtpd -o smtpd_etrn_restrictions=reject -o smtpd_sasl_auth_enable=yes -o smtpd_sasl_authenticated_header=yes
Et celles-ci au
fichier
/etc/postfix/main.cfg
:
# SASL smtpd_sasl_type=dovecot smtpd_sasl_path=private/auth smtpd_sasl_auth_enable=yes
Maintenant si l'on force le client de messagerie à utiliser SALS et que l'on tente l'envoi d'un message, la fenêtre d'authentification apparait et le message tranmis.
Et voilà l'authentification via dovecot fonctionne maintenant correctement :)
Maintenant on peu constaté que l'accès sans authentification fonctionne toujours :( pour y remédier modifions le service 'submission' du fichier master.cfg en y ajoutant:
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
Ah ouf, seul les accès SASL fonctionnent :)
Pour le vérifier nous pouvons encore une fois utiliser telnet mais cette fois ci l'authentification est codé en base64 le login/pass doit donc l'être préalablement :
perl -MMIME::Base64 -e 'print encode_base64("admin\@catapulse.org\0admin\@catapulse.org\0mypasswd")'; YWRtaW5AY2F0YXB1bHNlLm9yZwBhZG1pbkBjYXRhcHVsc2Uub3JnAG15cGFzc3dk
La chaîne d'authentification est codée en base64, utilisons la :
postconf -e mynetworks= telnet localhost smtp Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 www.catapulse.org ESMTP Postfix (Debian/GNU) ehlo abc 250-www.catapulse.org 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-STARTTLS 250-AUTH PLAIN LOGIN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN auth plain YWRtaW5AY2F0YXB1bHNlLm9yZwBhZG1pbkBjYXRhcHVsc2Uub3JnAG15cGFzc3dk 235 2.0.0 Authentication successful mail from: dab@catapulse.org 250 2.1.0 Ok rcpt to: dab@free.fr 250 2.1.5 Ok data bla bla bla
En modifiant ' mynetworks ', l'accès en local est soumis aux mêmes règles que pour les accès distants dont l'authentification obligatoire.
OK l'authentification fonctionne correctement. Vérifions si le mail est transmis sans cette ci:
telnet localhost smtp Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 www.catapulse.org ESMTP Postfix (Debian/GNU) ehlo catapulse.org 250-www.catapulse.org 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-STARTTLS 250-AUTH PLAIN LOGIN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN mail from: dab@catapulse.org 250 2.1.0 Ok rcpt to: dab@free.fr 554 5.7.1 <dab@free.fr>: Relay access denied quit 221 2.0.0 Bye postconf -e mynetworks=127.0.0.0/8
et dans
/var/log/mail.log
:
postfix/smtpd[24576]: warning: ... [x.x.x.x]: SASL PLAIN authentication failed:
Le minimum de requis en terme de sécurité est en place.
Je conserve ce chapitre mais il doit manquer quelque chose qui m'échappe ... j'y reviendrai surement ....
Un peu de cryptage n'a jamais nuit.
Quelques lignes suffieront à cette mise en oeuvre. au fichier
master.cfg
nous ajouterons (port 465 et 587)
smtps inet n - - - - smtpd -o smtpd_enforce_tls=yes -o smtpd_etrn_restri



Commentaires: