8. Configurer son serveur de messagerie avec Postfix, Dovecot et MySQL

Configuration complète d'un serveur web en HTTPS, avec PHP et MariaDB.

Modérateurs : TEAM THE C@TZ, MODERATEURS

Avatar du membre

Auteur du sujet
N4T0R4
TEAM THE C@TZ
TEAM THE C@TZ
Messages : 8
Enregistré le : dim. 28 juil. 2019 09:36

8. Configurer son serveur de messagerie avec Postfix, Dovecot et MySQL

Message non lu par N4T0R4 » jeu. 8 août 2019 10:55

Les versions

Ce guide utilise les versions de package suivantes :

Postfix 3.4.5
Dovecot 2.3.4.1
MySQL 15.1 Distrib 10.3.15-MariaDB

Configuration des DNS

example.com A 10 [IP_DU_SERVEUR]
example.com MX 10 example.com
mail.exemple.com MX 10 example.com

Configuration du fichier hosts

nano /etc/hosts

[IP_DU_SERVEUR] mail.exemple.com

Installation et configuration de Postfix

Installez les packages requis :

apt-get install postfix postfix-mysql dovecot-core dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-mysql mariadb-server

Vous ne serez pas invité à entrer un mot de passe pour l'utilisateur racine MySQL pour les versions récentes de MySQL. En effet, sous Debian et Ubuntu, MySQL utilise maintenant par défaut le plug-in unix_socket ou auth_socket. Ce schéma d’autorisation vous permet de vous connecter à l’utilisateur racine de la base de données tant que vous vous connectez à partir de cet utilisateur racine sur localhost.

Lorsque vous y êtes invité, sélectionnez Site Internet comme type de serveur de messagerie que le programme d'installation de Postfix doit configurer. Le nom de messagerie du système doit être le nom de domaine comple

Image

Image

Pour reconfigurer Postfix :

dpkg-reconfigure postfix

Pour connaître la version de Postfix :

postconf mail_version
mail_version = 3.4.5

Configuration de main.cf

cp /etc/postfix/main.cf /etc/postfix/main.cf.ori

nano /etc/postfix/main.cf

...
mydomain = exemple.com
...


MySQL

Les utilisateurs virtuels et les mots de passe du serveur de messagerie sont stockés dans une base de données MySQL. Dovecot et Postfix ont besoin de ces données. Suivez les étapes ci-dessous pour créer les tables de base de données pour les utilisateurs virtuels, les domaines et les alias:

1. Utilisez l'outil mysql_secure_installation pour configurer des options de sécurité supplémentaires. Cet outil vous demandera si vous voulez définir un nouveau mot de passe pour l'utilisateur root MySQL, mais vous pouvez ignorer cette étape :

mysql_secure_installation

Répondez Y aux invites suivantes :

Remove anonymous users?
Disallow root login remotely?
Remove test database and access to it?
Reload privilege tables now?

2. Créer une nouvelle base de données :

mysqladmin -u root -p create mailserver

3. Connectez-vous à MySQL :

mysql -u root -p

4. Créez l'utilisateur MySQL et accordez au nouvel utilisateur des autorisations sur la base de données. Remplacez mailuserpass par un mot de passe sécurisé :

GRANT SELECT ON mailserver.* TO 'mailuser'@'localhost' IDENTIFIED BY 'mailuserpass';

5. Videz les privilèges MySQL pour appliquer le changement :

FLUSH PRIVILEGES;

6. Basculez vers la nouvelle base de données mailsever :

USE mailserver;

7. Créez une table pour les domaines qui recevront du courrier :

CREATE TABLE `virtual_domains` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


8. Créez une table pour toutes les adresses électroniques et mots de passe :

CREATE TABLE `virtual_users` (
`id` int(11) NOT NULL auto_increment,
`domain_id` int(11) NOT NULL,
`password` varchar(106) NOT NULL,
`email` varchar(100) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`),
FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


9. Créez une table pour les alias de messagerie :

CREATE TABLE `virtual_aliases` (
`id` int(11) NOT NULL auto_increment,
`domain_id` int(11) NOT NULL,
`source` varchar(100) NOT NULL,
`destination` varchar(100) NOT NULL,
PRIMARY KEY (`id`),
FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


Ajout de données

Maintenant que la base de données et les tables ont été créées, ajoutez des données à MySQL.

1. Ajoutez les domaines à la table virtual_domains. Remplacez les valeurs pour example.com et autre-example.com par vos propres paramètres :

INSERT INTO `mailserver`.`virtual_domains`
(`id` ,`name`)
VALUES
('1', 'example.com'),
('2', 'autre-example.com');


Remarque
Notez quel id correspond à quel domaine, la valeur id est nécessaire pour les deux prochaines étapes.

2. Ajoutez des adresses électroniques à la table virtual_users. La valeur domain_id fait référence à la valeur id de la table virtual_domain. Remplacez les valeurs d'adresse de messagerie par les adresses que vous souhaitez configurer sur le serveur de messagerie. Remplacez les valeurs de mot de passe par des mots de passe forts.

INSERT INTO `mailserver`.`virtual_users`
(`id`, `domain_id`, `password` , `email`)
VALUES
('1', '1', ENCRYPT('password', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'email1@example.com'),
('2', '1', ENCRYPT('password', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'email2@example.com');


3. Un alias de courrier électronique transférera tous les messages d'une adresse de messagerie à une autre. Pour configurer un alias de courrier électronique, ajoutez-le à la table virtual_aliases :

INSERT INTO `mailserver`.`virtual_aliases`
(`id`, `domain_id`, `source`, `destination`)
VALUES
('1', '1', 'alias@example.com', 'email1@example.com');


Postfix

Postfix est un agent de transfert de courrier (MTA) qui relaie le courrier entre votre serveur et Internet. Il est hautement configurable, permettant une grande flexibilité. Ce guide conserve de nombreuses valeurs de configuration par défaut de Posfix.

Paramètres du fichier de configuration

Le fichier main.cf est le principal fichier de configuration utilisé par Postfix.

1. Faites une copie du fichier de configuration par défaut de Postfix au cas où vous deviez revenir à la configuration par défaut:

sudo cp /etc/postfix/main.cf /etc/postfix/main.cf.orig

2. Éditez le fichier /etc/postfix/main.cf pour qu'il corresponde aux exemples de configuration. Remplacez les occurrences de example.com par votre nom de domaine :

# See /usr/share/postfix/main.cf.dist for a commented, more complete version

# Debian specific: Specifying a file name will cause the first
# line of that file to be used as the name. The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname

smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h

readme_directory = no

# TLS parameters
smtpd_tls_cert_file=/etc/letsencrypt/live/example.com/fullchain.pem
smtpd_tls_key_file=/etc/letsencrypt/live/example.com/privkey.pem
smtpd_use_tls=yes
smtpd_tls_auth_only = yes
smtp_tls_security_level = may
smtpd_tls_security_level = may
smtpd_sasl_security_options = noanonymous, noplaintext
smtpd_sasl_tls_security_options = noanonymous

# Authentication
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes

# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.

# Restrictions
smtpd_helo_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_invalid_helo_hostname,
reject_non_fqdn_helo_hostname
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_non_fqdn_recipient,
reject_unknown_recipient_domain,
reject_unlisted_recipient,
reject_unauth_destination
smtpd_sender_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_non_fqdn_sender,
reject_unknown_sender_domain
smtpd_relay_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
defer_unauth_destination

# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.

myhostname = example.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydomain = example.com
myorigin = $mydomain
mydestination = localhost
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = all

# Handing off local delivery to Dovecot's LMTP, and telling it where to store mail
virtual_transport = lmtp:unix:private/dovecot-lmtp

# Virtual domains, users, and aliases
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,
mysql:/etc/postfix/mysql-virtual-email2email.cf

# Even more Restrictions and MTA params
disable_vrfy_command = yes
strict_rfc821_envelopes = yes
#smtpd_etrn_restrictions = reject
#smtpd_reject_unlisted_sender = yes
#smtpd_reject_unlisted_recipient = yes
smtpd_delay_reject = yes
smtpd_helo_required = yes
smtp_always_send_ehlo = yes
#smtpd_hard_error_limit = 1
smtpd_timeout = 30s
smtp_helo_timeout = 15s
smtp_rcpt_timeout = 15s
smtpd_recipient_limit = 40
minimal_backoff_time = 180s
maximal_backoff_time = 3h

# Reply Rejection Codes
invalid_hostname_reject_code = 550
non_fqdn_reject_code = 550
unknown_address_reject_code = 550
unknown_client_reject_code = 550
unknown_hostname_reject_code = 550
unverified_recipient_reject_code = 550
unverified_sender_reject_code = 550


Le fichier main.cf déclare l'emplacement des fichiers virtual_mailbox_domains, virtual_mailbox_maps et virtual_alias_maps. Ces fichiers contiennent les informations de connexion pour les tables de recherche MySQL créées dans la section MySQL de ce guide. Postfix utilisera ces données pour identifier tous les domaines, les boîtes aux lettres correspondantes et les utilisateurs valides.

3. Créez le fichier pour virtual_mailbox_domains. Remplacez la valeur du mot de passe par le mot de passe de votre utilisateur de base de données. Si vous avez utilisé un nom différent pour votre utilisateur de base de données et nom_bdd, remplacez-les par vos propres valeurs:

nano /etc/postfix/mysql-virtual-mailbox-domains.cf

user = mailuser
password = mailuserpass
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM virtual_domains WHERE name='%s'


4. Créez le fichier /etc/postfix/mysql-virtual-mailbox-maps.cf et entrez les valeurs suivantes. Utilisez le mot de passe de l’utilisateur de la base de données et apportez les autres modifications nécessaires :

nano /etc/postfix/mysql-virtual-mailbox-maps.cf

user = mailuser
password = mailuserpass
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM virtual_users WHERE email='%s'


5. Créez le fichier /etc/postfix/mysql-virtual-alias-maps.cf et entrez les valeurs suivantes. Utilisez le mot de passe de l’utilisateur de la base de données et apportez les autres modifications nécessaires :

nano /etc/postfix/mysql-virtual-alias-maps.cf

user = mailuser
password = mailuserpass
hosts = 127.0.0.1
dbname = mailserver
query = SELECT destination FROM virtual_aliases WHERE source='%s'


6. Créez le fichier /etc/postfix/mysql-virtual-email2email.cf et entrez les valeurs suivantes. Utilisez le mot de passe de l’utilisateur de la base de données et apportez les autres modifications nécessaires :

nano /etc/postfix/mysql-virtual-email2email.cf

user = mailuser
password = mailuserpass
hosts = 127.0.0.1
dbname = mailserver
query = SELECT email FROM virtual_users WHERE email='%s'


7. Redémarrez Postfix :

systemctl restart postfix

8. La commande postmap crée ou interroge les tables de recherche de Postfix, ou met à jour une table existante. Entrez la commande suivante pour vous assurer que Postfix peut interroger la table virtual_domains. Remplacez example.com par la valeur du prénom. La commande doit renvoyer 1 si elle réussit :

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

9. Testez Postfix pour vérifier qu'il peut récupérer la première adresse email de la table MySQL virtual_users. Remplacez email1@example.com par la première adresse électronique ajoutée à la table. Vous devriez recevoir 1 comme sortie :

postmap -q email1@example.com mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf

10. Testez Postfix pour vérifier qu'il peut interroger la table virtual_aliases. Remplacez alias@example.com par la première valeur source créée dans la table. La commande doit renvoyer la valeur de destination pour la ligne:

postmap -q alias@example.com mysql: /etc/postfix/mysql-virtual-alias-maps.cf

Paramètres du programme principal

Le programme principal de Postfix démarre et surveille l’ensemble des processus de Postfix. Le fichier de configuration master.cf répertorie tous les programmes et les informations sur la manière dont ils doivent être démarrés.

1. Faites une copie du fichier /etc/postfix/master.cf :

sudo cp /etc/postfix/master.cf /etc/postfix/master.cf.orig

2. Modifiez /etc/postfix/master.cf pour qu'il contienne les valeurs de l'exemple extrait. Le reste du fichier peut rester inchangé :

nano /etc/postfix/master.cf

#
# Postfix master process configuration file. For details on the format
# of the file, see the master(5) manual page (command: "man 5 master" or
# on-line: http://www.postfix.org/master.5.html).
#
# Do not forget to execute "postfix reload" after editing this file.
#
# ==========================================================================
# service type private unpriv chroot wakeup maxproc command + args
# (yes) (yes) (yes) (never) (100)
# ==========================================================================
smtp inet n - n - - smtpd
#smtp inet n - - - 1 postscreen
#smtpd pass - - - - - smtpd
#dnsblog unix - - - - 0 dnsblog
#tlsproxy unix - - - - 0 tlsproxy
submission inet n - y - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_sasl_type=dovecot
-o smtpd_sasl_path=private/auth
-o smtpd_reject_unlisted_recipient=no
-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_sasl_type=dovecot
-o smtpd_sasl_path=private/auth
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
-o milter_macro_daemon_name=ORIGINATING
...


3. Modifiez les autorisations du répertoire / etc / postfix pour limiter les autorisations afin d'autoriser uniquement son propriétaire et le groupe correspondant :

chmod -R o-rwx / etc / postfix

4. Redémarrez Postfix :

systemctl restart postfix

Dovecot

Dovecot est l'agent de distribution de courrier (MDA) qui reçoit les messages de Postfix et les distribue dans une boîte aux lettres virtuelle. Dans cette section, configurez Dovecot pour obliger les utilisateurs à utiliser SSL lorsqu'ils se connectent afin que leurs mots de passe ne soient jamais envoyés au serveur en texte brut.

1. Copiez tous les fichiers de configuration afin de pouvoir y revenir facilement si nécessaire :

cp /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.orig
cp /etc/dovecot/conf.d/10-mail.conf /etc/dovecot/conf.d/10-mail.conf.orig
cp /etc/dovecot/conf.d/10-auth.conf /etc/dovecot/conf.d/10-auth.conf.orig
cp /etc/dovecot/dovecot-sql.conf.ext /etc/dovecot/dovecot-sql.conf.ext.orig
cp /etc/dovecot/conf.d/10-master.conf /etc/dovecot/conf.d/10-master.conf.orig
cp /etc/dovecot/conf.d/10-ssl.conf /etc/dovecot/conf.d/10-ssl.conf.orig


2. Éditez le fichier /etc/dovecot/dovecot.conf. Ajoutez protocoles = imap pop3 lmtp à la section # Activer les protocoles installés du fichier :

nano /etc/dovecot/dovecot.conf

## Dovecot configuration file
...
# Enable installed protocols
!include_try /usr/share/dovecot/protocols.d/*.protocol
protocols = imap pop3 lmtp
...
postmaster_address=postmaster at example.com


Éditez le fichier /etc/dovecot/conf.d/10-mail.conf. Ce fichier contrôle l’interaction de Dovecot avec le système de fichiers du serveur pour stocker et récupérer les messages:

3. Modifiez les variables suivantes dans le fichier de configuration :

nano /etc/dovecot/conf.d/10-mail.conf

...
mail_location = maildir:/var/mail/vhosts/%d/%n/
...
mail_privileged_group = mail
...


4. Créez le répertoire / var / mail / vhosts / et un sous-répertoire pour votre domaine. Remplacez example.com par votre nom de domaine :

sudo mkdir -p /var/mail/vhosts/example.com
Ce répertoire servira de stockage pour le courrier envoyé à votre domaine.

5. Créez le groupe vmail avec l'ID 5000. Ajoutez un nouvel utilisateur vmail au groupe vmail. Cet utilisateur système lira le courrier du serveur.

groupadd -g 5000 vmail

useradd -g vmail -u 5000 vmail -d /var/ mail

6. Changez le propriétaire du dossier / var / mail / et son contenu pour qu'il appartienne à vmail :

sudo chown -R vmail: vmail/var/mail

7. Éditez le fichier d’authentification de l’utilisateur, situé dans /etc/dovecot/conf.d/10-auth.conf. Décommettez les variables suivantes et remplacez-les par les valeurs d'exemple de l'extrait de fichier :

...
disable_plaintext_auth = yes
...
auth_mechanisms = plain login
...
!include auth-system.conf.ext
...
!include auth-sql.conf.ext
...


8. Éditez le fichier /etc/dovecot/conf.d/auth-sql.conf.ext avec les informations d'authentification et de stockage. Assurez-vous que votre fichier contient les lignes suivantes. Assurez-vous que la section passdb n'est pas commentée, que la section userdb qui utilise le pilote statique est dé-commentée et mettez à jour avec le bon argument, puis mettez en commentaire la section userdb qui utilise le pilote SQL :

...
passdb {
driver = sql
args = /etc/dovecot/dovecot-sql.conf.ext
}
...
#userdb {
# driver = sql
# args = /etc/dovecot/dovecot-sql.conf.ext
#}
...
userdb {
driver = static
args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n
}
...


9. Mettez à jour le fichier /etc/dovecot/dovecot-sql.conf.ext avec vos informations de connexion MySQL. Décommettez les variables suivantes et remplacez les valeurs par l'exemple extrait. Remplacez nombase, utilisateur et mot de passe par vos propres valeurs de base de données MySQL :

...
driver = mysql
...
connect = host=127.0.0.1 dbname=mailserver user=mailuser password=mailuserpass
...
default_pass_scheme = SHA512-CRYPT
...
password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';
...


La variable password_query utilise les adresses électroniques répertoriées dans la table virtual_users en tant qu'informations d'identification de nom d'utilisateur pour un compte de messagerie.

Pour utiliser un alias comme nom d'utilisateur:

1. Ajoutez l'alias en tant qu'adresse électronique source et de destination à la table virtual_aliases.
2. Modifiez la valeur password_query du fichier /etc/dovecot/dovecot-sql.conf.ext en password_query = SELECT email en tant qu’utilisateur, mot_de FROM virtual_users WHERE email = (choix de destination DE virtual_aliases WHERE source = '% u');

10. Changez le propriétaire et le groupe du répertoire /etc/dovecot / en vmail et dovecot :

sudo chown -R vmail:dovecot /etc/dovecot

11. Modifiez les autorisations sur le répertoire /etc/dovecot/ pour qu'elles soient lues, écrites et exécutées de manière récursive pour le propriétaire du répertoire:

sudo chmod -R o-rwx /etc/dovecot

12. Éditez le fichier de paramètres de service /etc/dovecot/conf.d/10-master.conf :

nano /etc/dovecot/conf.d/10-master.conf

Désactivez les protocoles IMAP et POP3 non chiffrés en définissant les ports du protocole sur 0. Décommettez les variables port et ssl :

...
service imap-login {
inet_listener imap {
port = 0
}
inet_listener imaps {
port = 993
ssl = yes
}
...
}
...
service pop3-login {
inet_listener pop3 {
port = 0
}
inet_listener pop3s {
port = 995
ssl = yes
}
}
...


Recherchez la section service lmtp du fichier et utilisez la configuration ci-dessous :

...
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
#mode = 0666i
mode = 0600
user = postfix
group = postfix
}
...
}


Recherchez service auth et configurez-la comme indiqué ci-dessous :

...
service auth {
...
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}

unix_listener auth-userdb {
mode = 0600
user = vmail
}
...
user = dovecot
}
...


Dans la section service auth-worker, supprimez la mise en commentaire de la ligne user et définissez-la sur vmail :

...
service auth-worker {
...
user = vmail
}


Enregistrez les modifications dans le fichier /etc/dovecot/conf.d/10-master.conf.

13. Éditez le fichier /etc/dovecot/conf.d/10-ssl.conf pour que SSL soit requis et pour ajouter l’emplacement du certificat SSL et de la clé de votre domaine. Remplacez example.com par votre domaine :

...
# SSL/TLS support: yes, no, required. <doc/wiki/SSL.txt>
ssl = required
...
ssl_cert = </etc/letsencrypt/live/example.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/example.com/privkey.pem


14. Redémarrez Dovecot pour activer toutes les configurations :

sudo systemctl restart dovecot

Test Email with Mailutils

Pour envoyer et recevoir des e-mails de test sur votre serveur de messagerie, installez le paquet Mailutils:

apt-get install mailutils

Envoyez un e-mail de test à une adresse e-mail située en dehors de votre serveur de messagerie, par exemple un compte Gmail. Remplacez email1@example.com par une adresse électronique de votre serveur de messagerie :

echo "Email body text" | sudo mail -s "Email subject line" recipient@gmail.com -aFrom:email1@example.com



Création d'un certificat avec letsencrypt :

certbot certonly --rsa-key-size 4096 -d mail.exemple.com --email mon_email@gmail.com --agree-tos

Vérifier la configuration de postfix :

postconf -n

2. Installation et configuration de dovecot

TODO

Pour vérifier la configuration de Dovecot :

dovecot -n

Pour connaitre la version de Dovecot :

/sbin/dovecot --version

Test d'envoi de mail :

apt install mailutils

echo "test" | mail -s "TEST" mon_email@gmail.com

source : https://www.linode.com/docs/email/postf ... and-mysql/

Répondre