Installation pas à pas d’un serveur Ubuntu 10.04 : serveur mail
Le cinquième post concerne l’installation et la configuration d’un serveur mail avec postfix, postfix-mysql, dovecot.
Tutoriel utile : http://workaround.org/ispmail/
Voir aussi ce post (installation de postfixadmin et utilisation via postfix) et ce post (mise à jour vers la version 12.04 du serveur mail en fin de post).
- Installation de postfix et configuration de postfix-mysql
- Configuration des certificats SSL pour postfix
- Configuration du serveur IMAP avec dovecot
- Configuration du SMTP distant
- Configuration de fetchmail pour récupérer ses emails sur un autre serveur mail
- Configuration du client pour envoyer/recevoir des emails depuis votre ordinateur personnel
- Configuration du webmail roundcube
Installation de postfix et configuration de postfix-mysql
L’installation du serveur mail postfix se fait, en mode super utilisateur, via :
apt-get install postfix postfix-mysql
Lors de l’installation du serveur mail, il faut préciser le nom de domaine de votre serveur ; dans la suite nommé domain-name.org
.
La deuxième étape de l’installation consiste à installer et créer la base de données du serveur mail qui contiendra les informations sur les utilisateurs et les noms de domaines du serveur. Sur MySQL (via PhpMyAdmin, par exemple),
-
créer une base de données nommée
maildatabase
; -
créer un utilisateur virtuel nommé
mailuser
avec les privilèges “select” sur la base de donnéesmaildatabase
; -
trois tables doivent ensuite être créées sur la base de données
maildatabase
:domains
pour les noms de domaine virtuels,users
pour les utilisateurs virtuels etaliases
pour lister les alias d’adresses. Le code SQL permettant la création de ces trois tables est donné ci-dessous :CREATE TABLE `domains` ( `domain_id` int(11) NOT NULL auto_increment, `domain_name` varchar(50) NOT NULL, PRIMARY KEY (`domain_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `users` ( `user_id` int(11) NOT NULL auto_increment, `d_id` int(11) NOT NULL, `passwd` varchar(32) NOT NULL, `user_email` varchar(100) NOT NULL, PRIMARY KEY (`user_id`), UNIQUE KEY `user_email` (`user_email`), FOREIGN KEY (d_id) REFERENCES domains(domain_id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `aliases` ( `alias_id` int(11) NOT NULL auto_increment, `d_id` int(11) NOT NULL, `from` varchar(100) NOT NULL, `to` varchar(100) NOT NULL, PRIMARY KEY (`alias_id`), FOREIGN KEY (d_id) REFERENCES domains(domain_id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-
les informations concernant le serveur sont ensuite à insérer dans les tables correspondantes. Dans la suite, nous prenons l’exemple de deux domaines virtuels :
serveur.domain-name.org
etdomain-name.org
et deux deux utilisateurstuxette@domain-name.org
ettuxette@server.domain-name.org
oùtuxette@server.domain-name.org
est un alias detuxette@domain-name.org
. Ces données sont insérées dans les tables correspondantes par les requêtes SQL suivantes :INSERT INTO `maildatabase`.`domains` ( `domain_id` , `domain_name` ) VALUES ( '1' , 'server.domain-name.org'),( '2', 'domain-name.org' );
INSERT INTO `maildatabase`.`users` ( `user_id` , `d_id` , `passwd` , `user_email` ) VALUES ( '1', '1', MD5('the-first-passwd'), 'tuxette@server.domain-name.org' '2', '2', MD5('the-second-passwd'), 'tuxette@domain-name.org' );
INSERT INTO `maildatabase`.`aliases` ( `alias_id` , `d_id` , `from` , `to` ) VALUES ( '1', '1', 'tuxette@server.domain-name.org', 'tuxette@domain-name.org' );
-
Il faut ensuite configurer le serveur postfix pour qu’il soit capable de lire ces informations : pour cela, créer un fichier
/etc/postfix/mysql-virtual-domains.cf
contenant les informations suivantes :user=mailuser password=the-mailuser-passwd hosts=127.0.0.1 dbname=maildatabase query=SELECT 1 FROM domains WHERE domain_name='%s'
puis exécuter le script suivant (en super utilisateur) :
postconf -e virtual_mailbox_domains=mysql:/etc/postfix/mysql-virtual-domains.cf
Vérifier que tout fonctionne par :
postmap -q domain-name.org mysql:/etc/postfix/mysql-virtual-domains.cf
qui doit retourner la valeur “1”.
De même, créer les fichiers/etc/postfix/mysql-virtual-users.cf
et/etc/postfix/mysql-virtual-aliases.cf
contenant, respectivement,user = mailuser password = the-mailuser-passwd hosts = 127.0.0.1 dbname = maildatabase query = SELECT 1 FROM users WHERE user_email='%s'
et
user = mailuser password = the-mailuser-passwd hosts = 127.0.0.1 dbname = maildatabase query = SELECT to FROM aliases WHERE from='%s'
puis exécuter les scripts :
postconf -e virtual_mailbox_maps=mysql:/etc/postfix/mysql-virtual-users.cf postconf -e virtual_alias_maps=mysql:/etc/postfix/mysql-virtual-aliases.cf
Enfin, pour assurer que quelqu’un non autorisé n’aille lire ces fichiers, modifier les propriétaires et droits :
chgrp postfix /etc/postfix/mysql-*.cf chmod u=rw,g=r,o= /etc/postfix/mysql-*.cf
Enfin, éditez le fichier /etc/postfix/main.cf
et régler la taille maximale souhaitée pour les emails (en envoi et réception) :
message_size_limit = 10485760
(pour 10 Mo)
Configuration des certificats SSL pour postfix
Afin d’assurer le cryptage des données entre le serveur server.domain-name.org
et le client (votre ordinateur personnel), des certificats de sécurité SSL sont mis en place. Ceux-ci sont générés comme décrit dans ce post et postfix est configuré pour utiliser ces certificats en exécutant les lignes de commande suivantes :
postconf -e "smtpd_tls_key_file = /etc/ssl/private/apache-enc-key.pem" postconf -e "smtpd_tls_cert_file = /etc/ssl/certs/apache-cert.pem" postconf -e "smtpd_tls_CAfile = /usr/share/ca-certificates/self/root-cacert.crt" postconf -e "smtpd_tls_received_header = yes" postconf -e "mydomain = domain-name.org" postconf -e "myorigin = server.domain-name.org" postconf -e "myhostname = server.domain-name.org" postconf -e "mydestination = server.domain-name.org, localhost"
À ce stade, vous pouvez vérifier l’état de la configuration par :
/etc/init.d/postfix start
ou
/etc/init.d/postfix reload
si postfix était déjà démarré. Le serveur doit démarrer sans erreur…
Configuration du serveur IMAP avec dovecot
Dovecot est installé par :
apt-get install dovecot-imapd
La configuration de dovecot est ensuite effectuée comme suit :
-
un groupe et un utilisateur
mailuser
sont créés qui seront les seuls à avoir des droits sur les boîtes mail virtuelles (pour assurer la confidentialité des données :groupadd -g 5000 mailuser useradd -g mailuser -u 5000 mailuser -d /var/vmail -m
-
Le dossier dans lesquels les boîtes mail virtuelles seront stockées est ensuite créé (dans
/home/mail
) et les droits sur ces dossier sont donnés à l’utilisateurmailsuser
:mkdir /home/mail chown -R mailuser:mailuser /home/mail chmod 740 -R /home/mail
-
Le fichier
/etc/dovecot/dovecot.conf
est édité pour-
assurer l’utilisation obligatoire de imaps (qui est la version sécurisée de imap). Pour cela, la ligne
protocols = imap imaps
est commentée et remplacée par la ligneprotocols = imaps
. -
préciser le dossier contenant les emails virtuels :
mail_location = maildir:/home/mail/%d/%n/Maildir
qui assure que les emails pour l’utilisateurtuxette@domain-name.org
seront stockés dans le dossier/home/mail/domain-name.org/tuxette/Maildir
-
configurer les certificats de sécurité pour imaps :
ssl_ca_file = /usr/share/ca-certificates/self/root-cacert.crt ssl_cert_file = /etc/ssl/certs/dovecot-cert.pem ssl_key_file = /etc/ssl/private/dovecot-enc-key.pem ssl_verify_client_cert = no verbose_ssl = yes
-
autoriser dovecot à utiliser la base de données postfix en décommentant la ligne
passdb sql
et en ajoutantuserdb static { args = uid=5000 gid=5000 home=/home/mail/%d/%n/Maildir allow_all_users=yes }
-
permettre la communication entre dovecot et postfix en ajoutant les lignes suivantes :
socket listen { master { path = /var/run/dovecot/auth-master mode = 0600 user = mailuser } client { path = /var/spool/postfix/private/auth-client mode = 0660 user = postfix group = postfix } } protocol lda { auth_socket_path = /var/run/dovecot/auth-master postmaster_address = tuxette@domain-name.com log_path = }
Commenter également la partie «
passdb pam
» pour éviter les erreurs d’authentification pam (que l’on n’utilise pas) dans le fichier de log.</li> </ul> </li> -
Dovecot est ensuite configuré pour pouvoir utiliser la base de données MySQL : le fichier
/etc/dovecot/dovecot-sql.conf
est édité de la manière suivante :driver=mysql connect = host=127.0.0.1 dbname=maildatabase user=mailuser password=the-mailuser-passwd default_pass_scheme = PLAIN-MD5 password_query = SELECT user_email as user, user_passwd FROM users WHERE user_email='%u';
-
Les derniers points de sécurité sont ajoutés en définissant les droits sur les fichiers de configuration de dovecot :
chgrp usermail /etc/dovecot/dovecot.conf chmod g+r /etc/dovecot/dovecot.conf chown root:root /etc/dovecot/dovecot-sql.conf chmod go= /etc/dovecot/dovecot-sql.conf
-
Dovecot et postfix sont ensuite respectivement configurés pour communiquer entre eux :
-
pour dovecot, le fichier
/etc/dovecot/master.cf
est édité et les lignes suivantes sont ajoutées :dovecot unix - n n - - pipe flags=DRhu user=usermail:usermail argv=/usr/lib/dovecot/deliver -f ${sender} -d ${recipient}
-
pour postfix, les lignes suivantes sont exécutées :
postconf -e virtual_transport=dovecot postconf -e dovecot_destination_recipient_limit=1
et la configuration est testée en relançant dovecot et postfix :
/etc/init.d/dovecot restart /etc/init.d/postfix restart
Pour tester la réception des emails et leur tri en local, on lance les commandes suivantes :
find /home/mail echo test | mail tuxette@domain-name.org find /home/mail
la deuxième commande
find
doit faire apparaître la création du dossier mail virtuel pour l’utilisateurtuxette@domain-name.org
dans lequel le message test a été stocké.</li> -
pour dovecot, le fichier
-
Si le test précédent est un succès, il est temps de rediriger les mails de votre nom de domaine
domain-name.org
vers votre serveur (à ce stade, OVH les redirige vers ses propres boîtes mail. Pour cela, se connecter à son manager OVH et cliquer sur “Domaines et champ DNS” ; dans la rubrique “Zone DNS” du domaine concerné, effacer les champs MX existants. Cliquer ensuite sur “Type A” et ajouter un champ comme ci-dessous :sous-domaine : domain-name.org sélectionner une IP : adresse_IP_du_serveur_de_mailCliquez sur “Validez” pour confirmer l’opération. Ensuite, choisissez “Type MX” et ajoutez un champ comme ci-dessous :Sous-domaine : domain-name.org Destination: mail2.domain-name.orgTester la réception d’emails depuis l’extérieur en envoyant un email à votre adresse (dans l’exempletuxette@domain-name.org
) et en exécutant à nouveau la commandefind /home/mail
qui doit faire apparaître le nouvel email.</li>
-
Un dernier test de lecture peut être pratiqué avec l’utilitaire mutt :
-
en local en lecture directe :
mutt -f /home/mail/domain-name.org/tuxette/Maildir
; -
en local en lecture imaps :
mutt -f imaps://home/mail/domain-name.org/tuxette/Maildir
qui doit demander la validation de 2 certificats de sécurité puis le mot de passe de l’utilisateur ; -
à distance par imaps :
mutt -f imaps://tuxette@domain-name.org@domain-name.org
qui doit demander la validation de 2 certificats de sécurité puis le mot de passe de l’utilisateur.
</ol>
-
en local en lecture directe :
-
Éditer le fichier
/etc/postfix/main.cf
et y faire figurer les informations suivantes :smtpd_sasl_type=dovecot smtpd_sasl_path=private/auth smtpd_sasl_auth_enable=yes smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated reject_unauth_destination smtpd_use_tls=yes smtpd_tls_auth_only=yes smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
qui permet les envois selon les conditions suivantes : en local toujours, à distance si l’utilisateur est authentifié. Ces paramètres obligent l’authentification via le protocole TLS qui sécurise les échanges par la mise en place d’un cryptage SSL. Ainsi, l’utilisateur commence par négocier l’établissement de la connexion sécurisée TLS (et doit donc accepter le certificat de sécurité SSL) puis envoie son login et son mot de passe via cette connexion sécurisée. Il peut ensuite envoyer un email.</li>
-
Le serveur doit ensuite accepter les envois via le port 465 (car ce port est généralement utilisée pour les connexions sécurisées : il est probable que vous puissiez l’utiliser à peu près avec n’importe quelle connexion internet, contrairement au port 25) : pour cela, il faut éditer le fichier /etc/postfix/master.cf et décommenter la ligne commençant par “submission” ainsi que la ligne commençant par “smtps”. Une fois ces réglages effectués, redémarrer postfix :
/etc/init.d/postfix restart
-
Finalement, on teste l’envoi d’emails à distance. La première chose pour ce faire est de récupérer l’encodage en base64 des informations de connexion (login utilisateur et mot de passe) :
perl -MMIME::Base64 -e 'print encode_base64("\000tuxette\@domain-name.org\000the-first-passwd")'
qui renvoie une chaîne de caractères du type :
AHR1eGV0dGVAZG9tYWluLW5hbWUub3JnAHRoZS1maXJzdC1wYXNzd2Q=
que l’on note soigneusement pour la suite.
On commence ensuite par vérifier que le serveur accepte l’authentification via TLS :telnet mail2.domain-name.org 465
ce à quoi le serveur doit répondre
Trying xx.xx.xx.xx... Connected to mail2.domain-name.org. Escape character is '^]'. 220 server.domain-name.org ESMTP Postfix (Ubuntu Lynx)
On envoie alors la commande EHLO pour se connecter au serveur :
EHLO example.com
à laquelle le serveur répond
250-server.domain-name.org 250-PIPELINING 250-SIZE 10485760 250-VRFY 250-ETRN 250-STARTTLS 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN
Par la ligne “STARTTLS”, le serveur indique que la connexion via TLS est autorisée. On tape
quit
pour quitter telnet et faire un essai d’envoi d’email sécurisé. Celui-ci est effectué en lançant la commande
openssl s_client -starttls smtp -crlf -connect mail2.domain-name.org:465
Le serveur commence par envoyer le certificat de sécurité pour négocier le cryptage de la connexion. Envoyer alors la commande EHLO
EHLO example.com
à laquelle le serveur répond
250-server.domain-name.org 250-PIPELINING 250-SIZE 10485760 250-VRFY 250-ETRN 250-AUTH PLAIN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN
L’authentification est autorisée (“AUTH PLAIN”) ; on lance donc celle-ci :
AUTH PLAIN AHR1eGV0dGVAZG9tYWluLW5hbWUub3JnAHRoZS1maXJzdC1wYXNzd2Q=
à laquelle le serveur doit répondre
235 ok, go ahead (#2.0.0)
On peut alors tester l’envoi d’un email :
mail from: 250 ok rcpt to: 250 ok data 354 go ahead From: Moi To: Personne Subject: Rien du tout... Salut! . 250 ok 1113954693 qp 29052 quit 221 server.domain-name.org NO UCE
Si dans la partie “rcpt to:”, vous précisez une adresse email valide, le serveur doit envoyer l’email qui doit être reçue dans la boîte mail correspondante.
Ref : http://qmail.jms1.net/test-auth.shtml</li> </ol>
Configuration de fetchmail pour récupérer ses emails sur un autre serveur mail
Le programme fetchmail permet de rappatrier votre courrier électronique situé sur un autre serveur mail (par exemple, un compte free comme tuxettechix@free.fr). L’installation de fetchmail est effectuée par :
apt-get install fetchmail
et la configuration se fait en créant un fichier
.fetchmailrc
dans votre dossier utilisateur (/home/tuxette
, par exemple). Le fichier contient les informations sur la boîte email dont le courrier doit être récupéré :poll pop.free.fr proto pop3 user "tuxettechix@free.fr" pass "tuxettechix-passwd" is "tuxette@domain-name.org"
qui indique que le courrier de tuxettechix@free.fr est récupéré pour le compte de l’utilisateur virtuel tuxette@domain-name.org. Avec cette configuration, le courrier électronique n’est pas conservé sur le serveur d’origine (free) ; pour en laisser une copie, ajouter l’option
keep
. Enfin, régler la confidentialité du fichier.fetchmailrc
(qui contient le mot de passe du compte email tuxettechix@free.fr) par :chown nathalie:nathalie .fetchmailrc cmod 710 .fetchmailrc
puis démarrez le démon fetchmail
fetchmail -d 60
pour relever le courrier toutes les 60 secondes.
Configuration du client pour envoyer/recevoir des emails depuis votre ordinateur personnel
Cette partie décrit la configuration pour paramétrer votre client de messagerie préféré pour envoyer et recevoir des emails via le serveur. La configuration de 3 clients de messagerie est décrite :
- thunderbird (le plus détaillé)
- apple mail
- TODO: outlook (au cas très improbable où vous voudriez utiliser ce programme :-p…)
Configurer thunderbird
Dans Édition -> Paramètres des comptes, cliquez sur le menu “Gestion des comptes” puis “Ajouter un compte de messagerie” que vous configurer comme sur la figure ci-dessous :
Lorsque vous validez, thunderbird recherche des serveurs dont le nom correspond à votre adresse électronique. Ne conservez pas les propositions par défaut et cliquez sur “Configuration manuelle” et remplissez les champs comme ci-dessous :
puis cliquer sur “Re-tester“. Lorsque thunderbird a effectué les vérification, vous pouvez appuyer sur “Créer le compte“. Lors de la première connexion au compte puis lors du premier envoi d’email via le serveur SMTP, il vous sera demandé d’accepter le certificat de sécurité puis de rentrer votre mot de passe (celui de tuxette@domain-name.org dans la base de données postfix). Une fois le compte créé, vous pouvez aller dans les paramètres du compte “Gérer les identités” pour ajouter des identités correspondant à des adresses emails que vous rapatriez sur votre serveur (par exemple, tuxettechix@free.fr). Vérifiez également, dans l’onglet “Serveur sortant” de Édition -> Paramètres des comptes que le serveur smtp utilise le port 465 (sinon modifier ce paramètre) et “Mot de passe normal” pour l’authentification.
Configurer apple mail
Cliquer sur l’icône “timbre” dans le menu d’Apple Mail et commencer par donner les spécifications du compte :
Full name: Tuxette Chix
Email Address: tuxette@domain-name.org
Password: the-first-passwd
Dans la partie “Account Type“, choisir “IMAP” puis
Description: Domain-Name mail server
Incomming Mail Server: mail2.domain-name.org
User name: tuxette
Password: the-first-passwd
Cocher la case “Use Secure Socket Layer (SSL)” et choisir comme méthode d’authentification “Password“. Pour configurer ensuite le serveur SMTP, ajoutez dans la partie “Outgoing Mail Server” :
Description: Domain-Name mail server
Outgoing Mail Server: mail2.domain-name.org
cocher “Use authentification” et remplir:
User: tuxette@domain-name.org
Passwd: the-first-passwd
Cocher enfin la case “Use Secure Socket Layer (SSL)“. Au premier redémarrage d’Apple Mail après la création du compte, un message apparaît informant que le certificat n’est pas sécurisé (si vous utilisez un certificat auto-signé, du moins). Cliquez sur “Show Certificate” pour vérifier le certificat en vue de l’approuver. Dans la partie “When using this certificate“, cliquer sur “Always trust” puis cliquer sur “Connect” et “OK” (après avoir entré le mot de passe administrateur de votre mac).
Il peut s’avérer nécessaire de redémarrer l’ordinateur pour que la configuration fonctionne.
Configurer Outlook
Dans “Fichier“, choisir “Ajouter un compte“. Remplir les champs comme suit :
Nom : Tuxette Chix
Adresse de messagerie : tuxette@domain-name.org
Mot de passe : the-first-passwd
Outlook recherche les paramètres du serveur. TODO
Configuration du webmail roundcube
roundcube est un webmail simple qui peut être installé sur votre serveur pour consulter et envoyer vos emails avec un simple navigateur. Il s’installe par :
apt-get install roundcube roundcube-mysql
La configuration de roundcube s’effectue de la manière suivante :
- Sur le serveur MySQL, créer une base de données “roundcubedb” avec un utilisateur “roundcubeuser” ayant tous les droits sur cette base.
-
Éditer le fichier
/etc/roundcube
et modifier les deux premières lignes pour décommenter les alias. Relancer apache :/etc/init.d/apache2 reload
À ce stade, roundcube est accessible à l’url
http://www.domain-name.org/roundcube
ouhttps://www.domain-name.org/roundcube
en sécurisé si vous avez configuré les certificats SSL pour apache (ce que je conseille : voir ce post).</li> -
Il faut ensuite configurer la connexion de roundcube à la base de données en éditant le fichier
/etc/roundcube/debian-db.php
de la manière suivante :$dbuser='roundcubeuser'; $dbpass='roundcubeuser-passwd'; $basepath=''; $dbname='roundcubedb'; $dbserver='localhost'; $dbport=''; $dbtype='mysql';
-
Enfin, il faut permettre à roundcube la connexion au serveur IMAP par le port 993 en éditant le fichier
/etc/roundcube/main.inc.php
dans lequel on inscrit :$rcmail_config['default_host'] = 'ssl://localhost:993';
</ol>
Configuration du SMTP distant
Cette partie explique comment configurer postfix pour envoyer des emails depuis une machine distante (votre ordinateur personnel). L’envoi se fera en SMTPs (protocole sécurisé utilisant SSL) via le port 465 pour les utilisateurs listés dans la base de données de postfix.
-
assurer l’utilisation obligatoire de imaps (qui est la version sécurisée de imap). Pour cela, la ligne