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).

  1. Installation de postfix et configuration de postfix-mysql
  2. Configuration des certificats SSL pour postfix
  3. Configuration du serveur IMAP avec dovecot
  4. Configuration du SMTP distant
  5. Configuration de fetchmail pour récupérer ses emails sur un autre serveur mail
  6. Configuration du client pour envoyer/recevoir des emails depuis votre ordinateur personnel
  7. 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),

  1. créer une base de données nommée maildatabase ;
  2. créer un utilisateur virtuel nommé mailuser avec les privilèges “select” sur la base de données maildatabase ;
  3. 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 et aliasespour 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;
  4. 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 et domain-name.org et deux deux utilisateurs tuxette@domain-name.org et tuxette@server.domain-name.org tuxette@server.domain-name.org est un alias de tuxette@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'
    );
  5. 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.cfcontenant 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 :

  1. un groupe et un utilisateur mailusersont 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
  2. 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’utilisateur mailsuser:
    mkdir /home/mail
    chown -R mailuser:mailuser /home/mail
    chmod 740 -R /home/mail
  3. Le fichier /etc/dovecot/dovecot.confest é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 ligne protocols = imaps.
    • préciser le dossier contenant les emails virtuels : mail_location = maildir:/home/mail/%d/%n/Maildir qui assure que les emails pour l’utilisateur tuxette@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 sqlet en ajoutant
      userdb 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.

  4. Dovecot est ensuite configuré pour pouvoir utiliser la base de données MySQL : le fichier /etc/dovecot/dovecot-sql.confest é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';
  5. 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
  6. Dovecot et postfix sont ensuite respectivement configurés pour communiquer entre eux :
    • pour dovecot, le fichier /etc/dovecot/master.cfest é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’utilisateur tuxette@domain-name.org dans lequel le message test a été stocké.

  7. 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’exemple tuxette@domain-name.org) et en exécutant à nouveau la commande
    find /home/mail

    qui doit faire apparaître le nouvel email.

  8. 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.

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.

  1. Éditer le fichier /etc/postfix/main.cfet 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.

  2. 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
  3. 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

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 :

  1. Sur le serveur MySQL, créer une base de données “roundcubedb” avec un utilisateur “roundcubeuser” ayant tous les droits sur cette base.
  2. Éditer le fichier /etc/roundcubeet 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 ou https://www.domain-name.org/roundcube en sécurisé si vous avez configuré les certificats SSL pour apache (ce que je conseille : voir ce post).

  3. Il faut ensuite configurer la connexion de roundcube à la base de données en éditant le fichier /etc/roundcube/debian-db.phpde la manière suivante :
    $dbuser='roundcubeuser';
    $dbpass='roundcubeuser-passwd';
    $basepath='';
    $dbname='roundcubedb';
    $dbserver='localhost';
    $dbport='';
    $dbtype='mysql';
  4. Enfin, il faut permettre à roundcube la connexion au serveur IMAP par le port 993 en éditant le fichier /etc/roundcube/main.inc.phpdans lequel on inscrit :
    $rcmail_config['default_host'] = 'ssl://localhost:993';