Mise en place Serveur Mail

Systèmes & Réseaux

Mise en place Serveur Mail
Post by Clément, le Saturday 10 June 17

Installation serveur Mail : Postfix Dovecot

Prérequis :

Un serveur Linux,

Un serveur tournant sous Linux évidement. Dans mon cas j'utiliserai et présenterai les commandes au sein d'une distribution Debian.

Un nom de domaine,

Si vous souhaitez que votre serveur mail soit accessible sur internet vous allez à voir besoin d'un nom de domaine (ou plusieurs) qui est (sont) plus sympa qu'une adresse IP.

Un serveur DNS,

Si vous avez un nom de domaine il y a de forte chance pour que vous ayez, sur votre machine ou chez un hébergeur, un serveur DNS afin de résoudre votre IP. Voir même un DynamicDNS tels que DynDNS ou No-IP. Et il faut ajouter à votre domaine un MX Record vers un sous-domaine tel que "mail", ce qui fait que tout mail dirigé vers "example.org" sera envoyé à "mail.example.org".

Des connaissance en Linux,

Des connaissances basique dans le système d'exploitation Linux, afin de comprendre et de pouvoir adapter votre configuration, en Shell notamment car toutes les étapes se réalisent en terminale. Ainsi que des connaissance dans l'utilisation d'un éditeur en terminale tels que vi ou nano. Dans mon cas ce sera vi.

Une Base De Données,

Vous allez avoir besoin d'une base de données MySQL car ce tuto présente le fonctionnement pour des utilisateurs virtuels, une méthode plus compliquée mais aussi plus intéressante.

Mise à jour du système :

    apt-get update
    apt-get upgrade

Débuguage des services :

Le fichier de log pour les services postfix, et dovecto est /var/log/mail.log

Installation de PostfixAdmin :

PostfixAdmin est un module web permettant de gérer la base de données contenant les différents utilisateurs virtuels, les différents domaines ainsi que les alliasses.

Installation :

    apt-get install postfixadmin

Utilisez la configuration automatique avec Apache, postfixadmin créer son propre utilisateur et laissez le générer un mot de passe aléatoire.

Création de la Base De Données :

Lors de l'installation de postfixadmin, la base de donnée à été créée automatiquement. Pour y accéder, en utilisant phpmyadmin (http://example.org/phpmyadmin par défaut), connectez y vous en root. Puis allez dans l'onglet utilisateurs et ajoutez un utilisateur,

je l'appellerai "mailuser" avec le mot de passe "azerty",

pour le type de client sélectionnez "local" pour que l'utilisateur ne soit accessible qu'en local ("localhost"),

quant aux privilèges ne donnez uniquement des droits sur les données, j'ai choisi d'attribuer les 4 utiles "SELECT", "INSERT", "UPDATE" et "DELETE" pour une question de facilité mais cochez au moins le privilège "SELECT".

Configuration de la BDD et création des tables :

Rendez vous à l'adresse du site : http://example.org/postfixadmin/setup.php (où example.org est votre nom de domaine ou adresse IP).

La connexion est un peu longue car la création de l'ensemble des tables de la base de données postfixadmin est créée, puis le résultat s'affiche, il faut qu'il y ai "OK" ou "done" partout.

Ensuite on vous invite à rentré un nouveau mot de passe pour le setup. Cela génère un hash du mot de passe et comme indiquer, si vous souhaitez l'utiliser il faut le copier comme indiquer dans le fichier :

    vi /etc/posfixadmin/config.inc.php

Configuration de PostfixAdmin :

Ensuite connectez-vous à l'adresse : http://example.org/postfixadmin/login.php

Sélectionnez "Nouveau domaine" dans l'onglet "Liste domaines", puis pour "Domaine" inscrivez votre domaine, par exemple example.org, vous pouvez écrire une description si vous le souhaitez et mettez 0 pour "Alias" et "Comptes courriels" afin de pouvoir utiliser une infinité d'alias et de compte, mais si vous souhaitez définir un nombre maximum vous le pouvez.

Si vous avez un autre domaine tel que example.com, réitérez l'opération pour votre(vos) autre(s) domaine (s).

Après avoir validé vous pouvez le(s) voir dans "Liste domaines".

Ajout des utilisateurs :

Vous pouvez maintenant ajouter un ou plusieurs utilisateurs, pour ce faire il suffit de sélectionner "Ajouter un compte courriel" dans l'onglet "Liste virtuels". Il suffit de remplir le formulaire comme indiquer, vous pouvez décocher l'envoie d'un message de bienvenue car le service smtp n'est pas encore mis en place pour l'instant, pour les prochains utilisateurs vous pouvez laisser le mail de bienvenue.

Vous pouvez aussi créer des alias, ce sont des adresses mails qui redirigerons vers une autre adresse, pour ce faire dans le même onglet selectionnez "Ajouter un alias".

Mise en place de Postfix :

Postfix est le serveur SMTP, c'est à dire que c'est un système qui permet la livraison des courriers électroniques. Postfix permet donc l'échange des mails entre les serveurs.

Installation :

Installation de postfix avec la couche mysql, les utilisateurs virtuels seront en base de données et sasl2 pour l'authentification.

    apt-get install postfix postfix-mysql libsasl2-modules sasl2-bin

Répondez "site internet" à la première question (les autres ne nous intéressent pas), puis donnez le nom de domaine que vous avez pris (example.org par exemple) à la suivante. L'ensemble de la configuration se fait dans le répertoire : /etc/postfix/.

Configuration :

Modifiez le fichier main.cf et modifier :

    myhostname = mail.example.org
    mydomain = example.org 
    myorigin = example.org
    # mailbox_command = procmail -a "$EXTENSION"

Relier postfix à la BDD :

Il faut que postfix puisse savoir si le mail lui est destiné et que le destinataire existe réellement, pour cela il faut relier postfix à la base de données. Toujours dans le fichier main.cf ajouter ou modifier les lignes :

    virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
    virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
    virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf

Vérifier le domaine

Ajouter le fichier mysql-virtual-mailbox-domains.cf et dedans écrivez :

    user = mailuser
    password = azerty
    hosts = 127.0.0.1
    dbname = postfixadmin
    query = SELECT 1 FROM domain WHERE domain='%s'

Ce fichier va permettre à postfix, quand il reçoit un mail destiné à user@example.org, de terminer si notre serveur est bien en charge du domaine example.org depuis la base de données. Pour activer utilisez la commande suivante :

    postconf -e virtual_mailbox_domains=mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf

Et pour tester utilisez cette commande :

    postmap -q example.org mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf

Si elle ne retourne rien elle a échoué, si elle retourne 1 alors c'est bon.

Vérifier la boîte mail

Ensuite on vérifie que la boîte mail (l'utilisateur virtuel) existe, dans le fichier mysql-virtual-mailbox-maps.cf écrivez :

    user = mailuser
    password = azerty
    hosts = 127.0.0.1
    dbname = postfixadmin
    query = SELECT 1 FROM mailbox WHERE username='%s'

Puis activez et testez :

    postconf -e virtual_mailbox_maps=mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf   
    postmap -q user@example.org mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf

Gestion des alias

Il faut rediriger les alias vers la bonne boîte mail, dans le fichier mysql-virtual-alias-maps.cf:

    user = mailuser
    password = azerty
    hosts = 127.0.0.1
    dbname = postfixadmin
    query = SELECT goto FROM alias WHERE address='%s'

Et enfin activez et testez le fichier, le test doit retourner l'adresse mail qui correspond :

    postconf -e virtual_alias_maps=mysql:/etc/postfix/mysql-virtual-alias-maps.cf
    postmap -q alias@example.org mysql:/etc/postfix/mysql-virtual-alias-maps.cf

Changer les droits des fichiers :

Il faut modifier les droits de ce fichier car il contient en clair le mot de passe SQL.

chgrp postfix /etc/postfix/mysql-*.cf
chmod u=rw,g=r,o= /etc/postfix/mysql-*.cf

Activation des ports :

Modifiez le fichier master.cf en ajoutant ou décommentant les lignes suivantes :

    submission inet n       -       -       -       -       smtpd
      -o syslog_name=postfix/submission
      -o smtpd_tls_security_level=encrypt
      -o smtpd_sasl_auth_enable=yes
      -o smtpd_client_restrictions=permit_sasl_authenticated,reject
      -o milter_macro_daemon_name=ORIGINATING
    smtps     inet  n       -       -       -       -       smtpd
      -o syslog_name=postfix/smtps
      -o smtpd_tls_wrappermode=yes
      -o smtpd_sasl_auth_enable=yes
      -o smtpd_client_restrictions=permit_sasl_authenticated,reject
      -o milter_macro_daemon_name=ORIGINATING

Activation du SASL :

Sasl permet de forcer l'authentification pour envoyer des mails, pour éviter à un spammer d'utiliser votre serveur comme relai. Modifier le fichier main.cf en ajoutant les lignes suivantes :

    smtpd_sasl_type = dovecot
    smtpd_sasl_path = private/auth
    smtpd_sasl_auth_enable = yes
    smtpd_tls_security_level = may
    smtpd_tls_auth_only = yes
    smtpd_recipient_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination

Dans le fichier /etc/default/saslauthd modifier START en START = yes, puis relancer le service :

    service saslauthd restart   

Mise en place du relai :

Le relayhost permet d'envoyer et de recevoir des mails depuis internet en passant par son FAI, ici Orange, ajoutez dans le fichier main.cf.

    smtp_sasl_security_options = noanonymous
    smtp_sasl_tls_security_options = noanonymous
    smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
    sender_canonical_maps = hash:/etc/postfix/sender_canonical
    [..le reste du fichier..]
    relayhost = smtp.orange.fr  

Ensuite créez un nouveau fichier pour définir l'authentification SMTP /etc/postfix/sasl_passwd et ajouter votre identifiant (mail ou numéro télephone) et mot de passe orange :

    smtp.orange.fr [utilisateur]:[mot de passe]

Créer un fichier pour définir le mapping des expéditeurs : /etc/postfix/sender_canonical, ajoutez l'utilisateur et le nom d'utilisateur virtuel qu'il prendra :

    root [adresse expéditeur]

Puis exécutez ces commandes :

    postmap hash:/etc/postfix/sasl_passwd
    postmap hash:/etc/postfix/sender_canonical
    /etc/init.d/postfix restart

Maintenant vous pouvez envoyer des mails avec la commande mail et en recevoir.

Préparation de Postfix :

Il faut préparer postfix pour qu'il transmette les mails qu'il reçoit à dovecot, qui les rangera correctement, pour cela il faut modifier le fichier master.cf en ajoutant à la fin :

    dovecot unix    -   n   n   -   -   pipe
      flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/dovecot-lda -f ${sender} -d ${recipient}

Lancement :

Redémarrez le service postfix :

    service postfix restart 

Mise en place de Dovecot :

Dovecot est un service qui permet de, une fois les mails récupérés, il faut les classer dans les dossier correspondant aux utilisateurs virtuels car sinon ils sont envoyés à la mailbox de l'utilisateur physique s'il existe sinon ils sont perdu.

Installation :

Installation des paquets Dovecot.

    apt-get install dovecot-mysql dovecot-pop3d dovecot-imapd dovecot-managesieved

A partir de là tout ce passe dans le répertoire /etc/dovecot, ainsi que dans le sous-répertoire /etc/dovecot/conf.d.

Configuration de l'authentification :

Il faut ensuite permettre la connexion, pour cela il faut modifier le fichier 10-auth.confdans le sous-répertoire, et modifier la ligne en :

    auth_mechanisms = plain login

Ensuite il faut modifier le type d'authentification avec les "include" à la fin de ce fichier avec l'authentification sql :

    #!include auth-system.conf.ext
    !include auth-sql.conf.ext
    #!include auth-ldap.conf.ext
    #!include auth-passwdfile.conf.ext
    #!include auth-checkpassword.conf.ext
    #!include auth-vpopmail.conf.ext
    #!include auth-static.conf.ext

Configuration de SQL :

Pour cela il suffit de modifier le fichier auth-sql.conf.ext que nous avons sélectionné à l'étape précédente. Pour cela les seuls lignes qui doivent être dans le fichier sont :

    passdb {
        driver = sql
        args = /etc/dovecot/dovecot-sql.conf.ext
    }

    userdb {
         driver = sql
        args = /etc/dovecot/dovecot-sql.conf.ext
    }

Ces lignes disent que pour l'authentification, lorsque dovecot souhaite authentifier l'utilisateur, il peut vérifier le mot de passe et le pseudo grâce au fichier dovecot-sql.conf.ext.

Il faut donc configurer ce fichier, ajouter à la fin :

    driver = mysql
    connect = host=127.0.0.1 dbname=postfixadmin user=mailuser password=azerty
    default_pass_scheme = MD5
    password_query = SELECT username as user, password FROM mailbox WHERE username='%u';
    user_query = SELECT maildir, 5000 AS uid, 5000 AS gid FROM mailbox WHERE username = '%u' AND active='1'

Donc lorsque dovecot voudra vérifier le mot de passe il appellera la user_query en utilisant les données de connexion connect pour une base de données de type driver. Et pour vérifier le mot de passe dovecot uilisera la password_query et vu que dans la base de données le mot de passe est crypté, il faut avant de le comparer à celui de la base de données aussi le crypté en utilisant la méthode default_pass_scheme, qui correspond au même mode que dans la base de données évidement.

Configuration mail :

Pour gérer les mails, où ils seront placés, il faut éditer le fichier 10-mail.conf dans le sous-répertoire, et vérifier que les lignes ci-dessous sont décommentés et existes :

    mail_location = maildir:/var/vmail/%d/%n
    namespace inbox {
        separator = /
        inbox = yes
    }
    mail_privileged_group = mail    

Quelques petites explications :

Tout d'abord on configure avec mail_location, là où ils seront placés, ils seront donc dans ce cas dans le répertoire /var/vmail/ puis dans le répertoire %d qui correspond au nom de domaine, dans ce tuto c'est example.org. Puis dans le répertoire %n qui correspond au nom d'utilisateur par exemple toto.

Ensuite on définit pour l'espace/le fichier ou seront enregistrés les mails de tels manière que le séparateur soit un '/' et non un point '.' comme ça peut l'être ce qui fait que les mails seront dans le répertoire /var/vmail/%d/%n et non dans un répertoire du genre vmail.%d.%n. C'est une affaire de goût mais je préfère une arborescence, c'est plus clair et plus propre.

Configuration SSL :

Ensuite nous configurons la sécurité du service dans le fichier 10-ssl.conf du sous-répertoire avec :

    ssl = yes
    ssl_cert = </etc/ssl/certs/mailserver.pem
    ssl_key = </etc/ssl/private/mailserver.pem  

La propriété ssl peut valoir 'no' si vous ne voulais pas crypter en RSA, 'yes' si vous laissez le choix au client ou 'required' si vous voulez forcer le client à utiliser de la cryptographie RSA.

Les certificats ne sont pas encore créés, pour se faire exécutez la commande suivante, si vous avez installez le paquet openssl avant :

    openssl req -new -x509 -days 3650 -nodes -newkey rsa:4096 -out /etc/ssl/certs/mailserver.pem -keyout /etc/ssl/private/mailserver.pem    

Configuration LDA : (A vérifier l'utilité)

Pour pouvoir déplacer les fichier il faut activer le plugin 'sieve' dans le fichier 15-lda.conf trouvez puis modifier ou écrivez le code suivant :

    protocol lda {
        mail_plugins = $mail_plugins sieve
    }   

Protection et lancement :

Modifier les droits des différents fichiers et relancer le démon.

    chown root:root /etc/dovecot/dovecot-sql.conf.ext
    chmod go= /etc/dovecot/dovecot-sql.conf.ext
    chgrp vmail /etc/dovecot/dovecot.conf
    chmod g+r /etc/dovecot/dovecot.conf
    service dovecot restart

Règles iptables :

Afin que l'on puisse utiliser l'ensemble des services que nous avons mis en place il faut que les différents ports paramétrés soient ouverts. Pour ce faire il faut modifier la table iptable, ajoutez dans un fichier (ici /etc/iptables.rules) les lignes suivantes pour chacun des services que vous avez mis en place :

# Allows SMTP access
-A INPUT -p tcp -m tcp --dport 25 -j ACCEPT

# Allows pop and pops connections
-A INPUT -p tcp -m tcp --dport 110 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 995 -j ACCEPT

# Allows imap and imaps connections
-A INPUT -p tcp -m tcp --dport 143 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 993 -j ACCEPT

A chaque redémarrage de la machine, la table iptables se réinitialise et supprime donc les règles que nous ajoutons, il faut donc que ces règles ce remettent en place à chaque redémarrage de la machine. Pour ce faire nous allons ajouter à la fin du fichier /etc/network/interfaces, qui paramètre entre autres la connexion réseau, la ligne suivante :

pre-up iptables-restore < /etc/iptables.rules

Cette ligne permet qu'à chaque redémarrage, une fois que les règles réseaux sont mises en place les règles du fichier /etc/iptables.rules sont appliquées.

Attention malgré tout à cela s'il y a d'autres règles importantes, je ne suis pas certain de la pleine efficacité de cela. Mais dans utilisation normal, c'est-à-dire pour un utilisateur qui ne modifie pas déjà cette table, cela fonctionne parfaitement.

Sinon il est possible d'écrire un script :

iptables -D INPUT -p tcp -m tcp --dport 25 -j ACCEPT
iptables -D INPUT -p tcp -m tcp --dport 110 -j ACCEPT
iptables -D INPUT -p tcp -m tcp --dport 995 -j ACCEPT
iptables -D INPUT -p tcp -m tcp --dport 143 -j ACCEPT
iptables -D INPUT -p tcp -m tcp --dport 993 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 25 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 110 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 995 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 143 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 993 -j ACCEPT

est de l'exécuter quand c'est nécessaire.

Voilà et maintenant vous avez un magnifique serveur mail fonctionnel, ne vous reste plus qu'à configurer votre boîte de messagerie préféré ou d'installer un web mail sur votre serveur


Commenter