Debian - Installer et sécuriser un serveur mails complet (Mails, SMTP, Auth via SASL, IMAP, POP3, webmail, TLS et SSL)

Page 1 / 5
  • Publié le : 25 février 2015 à 16:52
  • Par Lionel Eppe

Vous avez acheté un VPS ou un serveur dédié où vous souhaitez y installer un serveur de mails complet pour pouvoir envoyer vos e-mails directement depuis votre serveur. Alors, ce tutoriel va vous permettre de le faire.
Note : Vous pouvez aussi suivre ce tutoriel pour créer un serveur de mails local (c'est à dire l'envoi de mails uniquement sur votre réseau local). L'envoi de mails vers l'extérieur peut ne pas fonctionner dans ce cas. C'est notamment le cas du serveur de Google qui rejette automatiquement les connexions depuis les serveurs qui ne sont pas accessibles depuis l'extérieur.

 

Prérequis :
- Un serveur VPS ou dédié sous Debian (version 7.7.0 utilisée pour ce tutoriel)
- Serveur sur Internet : Un nom de domaine enregistré sur Internet.
- Serveur local : Un nom de domaine enregistré sur Internet géré ou non sur un serveur DNS local (Attention : Votre serveur d'emails doit être visible de l'extérieur pour que l'envoi de mails vers l'extérieur fonctionne).
- Etre à l'aise avec Linux. Car ce tutoriel est assez compliqué.

  1. Installation du serveur de mails (+ protocole SMTP) : Postfix
  2. Création de la base de données de Postfix
  3. Installation et configuration de la base de données de postfix
  4. Configuration de Postfix (mappage de la base de données)
  5. Test du serveur de mails via telnet (initialisation de l'adresse mail)
  6. Installation des protocoles POP3 et IMAP (Courier)
  7. Fix : Erreur IMAP
  8. Conseil : protocole POP (POP3)
  9. Installation du Webmail "RoundCube Webmail"
  10. Connexion à Roundcube
  11. Sécurisation du serveur SMTP par une authentification grâce à SASL
  12. Test telnet
  13. Activation du port de soumission (587)
  14. Génération ou achat des certificats SSL
  15. Sécuriser le webmail via HTTPS
  16. Sécurisation du SMTP via TLS
  17. Sécurisation des protocoles IMAP et POP3 avec SSL
  18. Rappel des paramètres de configuration
  19. Facultatif : Utiliser IMAPS et SMTPS avec RoundCube

1. Installation du serveur de mails (+ protocole SMTP) : Postfix

Pour commencer ce long tutoriel, nous allons d'abord installer le serveur de mail "Postfix".
Etant donné que Postfix supporte également les bases de données "MySQL", nous allons installer le paquet "postfix-mysql" qui installera postfix avec son extension MySQL.

Code : Bash

apt-get install postfix-mysql

Note : Sous debian, vous devrez utiliser cette commande au lieu de celle ci-dessus :

Code : Bash

apt-get install postfix postfix-mysql

Appuez sur les touches TAB puis ENTER pour passer cet écran

Choisissez "Site Internet".

Indiquez ensuite votre nom de domaine. (Ce qui se trouvera derrière le @ des adresses mail)

Une fois le serveur installé, ouvrez le fichier "/etc/postfix/master.cf" et vérifiez que vous avez un tiret pour la ligne SMTP dans la colonne "chroot".
Si ce n'est pas le cas, indiquez un tiret pour activer le chroot de postfix.

 

2. Création de la base de données de Postfix

Par sécurité, nous allons créer un utilisateur postfix avec un mot de passe différent des autres utilisateurs de MySQL et nous lui donnerons tous les droits sur la base de données "postfix" uniquement.

Pour cela, accédez à l'interface de phpMyAdmin et cliquez sur "Base de données" dans le menu du haut.
Tapez ensuite "postfix" dans la case prévue à cet effet et sélectionnez "utf8_general_ci" dans la liste. Cliquez ensuite sur "Créer".

Maintenant que la base de données est créée, vérifiez que vous l'avez sélectionnée (voir image ci-dessous) et cliquez ensuite sur l'onglet "Privilèges".

Cliquez ensuite sur "Ajouter un utilisateur" en bas de la liste affichée.

Indiquez maintenant les informations suivantes :
- Nom d'utilisateur : postfix
- Client : localhost (ou sélectionnez Local dans la liste)
- Mot de passe : **** (cliquez sur le bouton "générer" situé en dessous, par sécurité)

Vérifiez enfin que la case 'Donner tous les privilèges sur la base de données "postfix"' est bien sélectionnée et cliquez sur "Exécuter" en bas de page.

 

3. Installation et configuration de la base de données de postfix

Pour créer correctement la base de données MySQL pour Postfix, nous allons utiliser l'outil "Postfix Admin" écrit en PHP.
Note : Vous pouvez évidemment la créer vous même si vous le souhaitez.

Pour installer "Postfix Admin", récupérez le lien de téléchargement de la dernière version et faites un clic droit sur le lien "lien direct (direct link)".
Cliquez ensuite sur "copier l'adresse du lien". Vous aurez un lien de ce genre :

Code : Plain Text

http://downloads.sourceforge.net/project/postfixadmin/postfixadmin/postfixadmin-2.3.6/postfixadmin-2.3.6.tar.gz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fpostfixadmin%2Ffiles%2Fpostfixadmin%2F&ts=1391266659&use_mirror=switch

Supprimez ce qui se trouve derrière le ".tar.gz" et tapez ensuite les commandes suivantes :

On se déplace dans le dossier personnel de root

Code : Bash

cd ~

Téléchargement de la dernière version de "Postfix Admin" pour Linux (.tar.gz).

Code : Bash

wget http://downloads.sourceforge.net/project/postfixadmin/postfixadmin/postfixadmin-2.3.6/postfixadmin-2.3.6.tar.gz

On décompresse l'archive que l'on vient de télécharger, dans le dossier www d'apache.

Code : Bash

tar xzvf postfixadmin-2.3.6.tar.gz -C /var/www/

On se déplace dans le dossier "/var/www"

Code : Bash

cd /var/www

On renomme le dossier "postfixadmin-x.x.x" en "postfixadmin"

Code : Bash

mv postfixadmin-2.3.6 postfixadmin

On donne les droits à l'utilisateur apache "www-data" sur le dossier "postfixadmin" (et son contenu : -R)

Code : Bash

chown -R www-data:www-data postfixadmin

On sauvegarde le fichier "config.inc.php" de "postfixadmin"

Code : Bash

cp postfixadmin/config.inc.php postfixadmin/config.inc.php.bak

On remplace toutes les occurrences de "change-this-to-your.domain.tld" par votre domaine (dans notre cas : informatiweb-tuto.net) dans le fichier "postfixadmin/config.inc.php"
Note : Vous devez indiquer votre nom de domaine et non un sous domaine comme mail ou autre. C'est d'ailleurs ce domaine qui sera indiqué derrière le @ des adresses mail du serveur.

Code : Bash

sed -i 's/change-this-to-your.domain.tld/informatiweb-tuto.net/g' postfixadmin/config.inc.php

Modifiez ensuite ce même fichier (postfixadmin/config.inc.php) pour configurer les informations de connection à la base de données :

Code : Bash

vi postfixadmin/config.inc.php

Code : PHP

$CONF['configured'] = true; // Active l'utilisation du programme d'installation de Postfixadmin
...
$CONF['default_language'] = 'fr';
...
$CONF['database_type'] = 'mysqli'; // Extension utilisée par PHP. Dans notre cas mysqli. (si vous mettez mysql, un avertissement s'affichera sur la page "setup.php" de "postfixadmin".)
$CONF['database_host'] = 'localhost'; // Adresse du serveur MySQL. localhost si apache et MySQL se trouve sur le même ordinateur.
$CONF['database_user'] = 'postfix'; // Nom d'utilisateur MYSQL (l'utilisateur postfix que l'on a créé au point 2)
$CONF['database_password'] = 'son_mot_de_passe'; // Son mot de passe
$CONF['database_name'] = 'postfix'; // Base de donnée à utiliser
...
$CONF['encrypt'] = 'md5crypt'; // Cryptage à utiliser

Maintenant que la configuration manuelle est terminée, accédez à la page : http://www.votre-domaine.com/postfixadmin/setup.php

Le script php va maintenant tester votre configuration et tenter de créer les tables de la base de données "postfix".
Si tout se passe bien, vous n'aurez que des lignes terminant par des OK sans aucun message d'erreurs.

Si vous obtenez une erreur "Warning: Depends on: IMAP functions", installez le paquet "php5-imap" (si besoin).
Il se peut que ce paquet soit déjà installé mais désactivé.

Code : Bash

apt-get install php5-imap
php5enmod imap
service apache2 restart

En bas de page, vous trouverez un formulaire dans lequel vous devrez indiquer un mot de passe.
Vous devrez ensuite indiquer le mot de passe crypté qui vous sera affiché, dans le fichier "postfixadmin/config.inc.php".

Une fois que vous aurez indiqué le mot de passe crypté dans le fichier de configuration, créez le compte administrateur en remplissant le formulaire proposé.
Note : Comme indiqué dans le formulaire, le nom d'utilisateur doit être une adresse e-mail.

Maintenant que "Postfix admin" est configuré, connectez-vous à l'adresse "http://www.votre-domaine.com/postfixadmin/".

Une fois connecté, cliquez sur : Liste domaines --> Nouveau domaine.
Puis indiquez :
- Domaine : votre-domaine.com
- Description : Ce que vous voulez
- Alias : Nombre d'alias maximum pour ce domaine.
- Comptes courriels : Nombre d'adresses mail maximum pour ce domaine.

Allez ensuite dans le menu "Liste virtuels --> Ajouter un compte courriel" pour créer des adresses e-mail dans votre serveur de mail.
Puis indiquez :
- Nom d'utilisateur @ domaine : Ce que vous voulez @ votre-domaine.com
- Mot de passe : Mot de passe du compte
- Nom : Nom et prénom de la personne

La base de données de "Postfix" est maintenant configurée.

 

4. Configuration de Postfix (mappage de la base de données)

Maintenant que le serveur de mail "postfix" et sa base de données (créée correctement via Postfix Admin) sont créés et configurés, il nous reste à configurer Postfix pour qu'il puisse utiliser cette base de données correctement.
Note : Nous allons donc indiquer à postfix où se trouvent telles ou telles informations. C'est ce qu'on appelle : le mappage.

Pour stocker les mails, nous allons créer un utilisateur "vmail" qui se trouvera dans le groupe du même nom, et nous leurs attribuerons l'id 4000 (par facilité).

Code : Bash

groupadd -g 4000 vmail
useradd -g vmail -u 4000 vmail -d /var/spool/vmail -m

Déplacez vous ensuite dans le dossier "/etc/postfix" :

Code : Bash

cd /etc/postfix

Nous allons maintenant créer les fichiers de "mappage" suivants :
- mysql_virtual_mailbox_domains.cf
- mysql_virtual_mailbox_maps.cf
- mysql_virtual_alias_maps.cf
- mysql_relay_domains.cf

Ces fichiers contiendront tous la structure suivante :
- hosts : adresse du serveur MySQL
- user : utilisateur de MySQL
- password : mot de passe de cet utilisateur
- dbname : le nom de la base de données de postfix
- query : La requête SQL que "Postfix" devra envoyer au serveur, pour récupérer l'information dont il a besoin.

Voici le contenu de ces fichiers (les lignes "vi ..." permettent de créer les fichiers listés ci-dessus) :

Code : Bash

vi mysql_virtual_mailbox_domains.cf

Code : Bash

hosts = 127.0.0.1
user = postfix
password = monmotdepasse2
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%s' and backupmx = 0 and active = 1

Code : Bash

vi mysql_virtual_mailbox_maps.cf

Code : Bash

hosts = 127.0.0.1
user = postfix
password = monmotdepasse2
dbname = postfix
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = 1

Code : Bash

vi mysql_virtual_alias_maps.cf

Code : Bash

hosts = 127.0.0.1
user = postfix
password = monmotdepasse2
dbname = postfix
query = SELECT goto FROM alias WHERE address='%s' AND active = 1

Code : Bash

vi mysql_relay_domains.cf

Code : Bash

hosts = 127.0.0.1
user = postfix
password = monmotdepasse2
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%s' and backupmx = 1

 

Maintenant que ces fichiers de "mappage" sont créés, nous allons configurer le fichier "/etc/postfix/main.cf" de postfix pour lui indiquer (notamment) où se trouvent ces fichiers.

Code : Bash

vi /etc/postfix/main.cf

A la fin de ce fichier, ajoutez les lignes suivantes :

Code : Plain Text

virtual_uid_maps = static:4000
virtual_gid_maps = static:4000
virtual_mailbox_base = /var/spool/vmail
   
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
relay_domains = mysql:/etc/postfix/mysql_relay_domains.cf

smtpd_recipient_restrictions = permit_mynetworks, reject_non_fqdn_hostname, reject_non_fqdn_sender, reject_non_fqdn_recipient, reject_unauth_destination, reject_unauth_pipelining, reject_invalid_hostname

Note :
- Ne pas mettre "reject_non_fqdn_hostname" si vous souhaitez envoyer des mails via votre serveur SMTP depuis des clients d'emails (plus précisément : si votre ordinateur n'a pas de nom de domaine : FQDN).
Dans le cas contraire, l'utilisateur aura une erreur "Helo command rejected: need fully-qualified hostname" lorsqu'il tentera d'envoyer son mail.

Maintenant que postfix connait : les domaines, les adresses e-mail, ... nous devons supprimer notre domaine de la ligne "mydestination".
Dans le cas contraire, l'avertissement suivant s'affichera dans le fichier "/var/log/syslog" : warning: do not list domain informatiweb-tuto.net in BOTH mydestination and virtual_mailbox_domains

Si vous le souhaitez, vous pouvez définir le temps maximum que possède un mail pour arriver au destinataire.
Après ce temps, vous obtiendrez une alerte vous indiquant que le mail x n'a pas été délivré au destinataire.
Par défaut, cette ligne est commentée et vous devrez donc enlever le # pour l'activer :

Code : Plain Text

delay_warning_time = 4h

Pour finir, indiquez votre nom de domaine à la ligne "myhostname" :

Code : Plain Text

myhostname = votre-domaine.net

Par sécurité, modifiez les droits de ces 4 fichiers en tapant les commandes suivantes :

Code : Bash

chmod u=rw,g=r,o= mysql_*.cf
chgrp postfix mysql_*.cf

Et pour finir, redémarrer le service "postfix".

Code : Bash

service postfix restart

 

5. Test du serveur de mails via telnet (initialisation de l'adresse mail)

Pour tester et initialiser une adresse e-mail locale (de votre domaine), commencez par vous connecter par telnet au serveur de mail postfix.

Si debian ne trouve pas la commande telnet, installez-la en tapant ceci :

Code : Bash

apt-get update
apt-cache search telnet
apt-get install telnet

Informations :
- 127.0.0.1 (ou localhost) : indique que vous vous trouvez sur le même ordinateur que le serveur SMTP
- 25 : Numéro du port correspondant au SMTP

Code : Bash

telnet 127.0.0.1 25

Ensuite, dites bonjour au serveur SMTP. (Remarquez que la commande ressemble au hello en anglais)

Code : Bash

ehlo votre-domaine.com

Indiquez par exemple un expéditeur local existant sinon des erreurs se produiront dans les logs.

Code : Bash

mail from:<lionel@informatiweb-tuto.net>

Indiquez un destinataire local (pour initialiser cette adresse mail)

Code : Bash

rcpt to:<webmaster@informatiweb-tuto.net>

Tapez ensuite "data" pour écrire votre message.

Code : Bash

data
Salut

Ensuite, terminez en tapant un "." sur la ligne suivante et réappuyez sur Enter
Pour terminer, tapez "quit" pour quitter telnet et revenir dans le terminal.

Vérifiez maintenant que votre mail a bien été envoyé, en allant dans le fichier "/var/log/mail.log".

Code : Bash

cat /var/log/mail.log

Si tout se passe bien, vous devriez trouver un message contenant ceci "(delivered to maildir)".
Dans le cas contraire, référez-vous aux messages d'erreurs que vous y trouverez.

Si le message était affiché dans les logs, vous pouvez lister le dossier "/var/spool/vmail" pour être sûr que le dossier concernant l'adresse mail du destinataire a bien été créée.
Si c'est le cas, réalisez, le cas échéant, cette opération pour vos autres adresses e-mail locales.