Postfix Configuration · 9 min read · Dec 29, 2025

Utilisateurs et domaines virtuels avec Postfix, Courier, MySQL et SquirrelMail (Fedora 14 x86_64) - Page 2

6 Définir les mots de passe MySQL et configurer phpMyAdmin

Démarrez MySQL:

chkconfig --levels 235 mysqld on  
/etc/init.d/mysqld start

Ensuite, définissez les mots de passe pour le compte root MySQL:

mysql_secure_installation

[root@server1 ~]# mysql_secure_installation

NOTE: L’EXÉCUTION DE TOUTES LES PARTIES DE CE SCRIPT EST RECOMMANDÉE POUR TOUS LES SERVEURS MySQL EN USAGE PRODUCTION ! VEUILLEZ LIRE CHAQUE ÉTAPE ATTENTIVEMENT !

Pour se connecter à MySQL afin de le sécuriser, nous aurons besoin du mot de passe actuel pour l’utilisateur root. Si vous venez d’installer MySQL et que vous n’avez pas encore défini le mot de passe root, le mot de passe sera vide, donc vous devriez simplement appuyer sur entrer ici.

Entrez le mot de passe actuel pour root (appuyez sur entrer pour aucun) : <– ENTRER
OK, mot de passe utilisé avec succès, passage à la suite…

Définir le mot de passe root ? [Y/n] <– ENTRER
Nouveau mot de passe : <– votremotdepasseSQLroot
Ressaisir le nouveau mot de passe : <– votremotdepasseSQLroot
Mot de passe mis à jour avec succès !
Rechargement des tables de privilèges..
… Succès !

Par défaut, une installation MySQL a un utilisateur anonyme, permettant à quiconque de se connecter à MySQL sans avoir à avoir un compte utilisateur créé pour eux. Cela est destiné uniquement à des fins de test, et pour rendre l’installation un peu plus fluide. Vous devriez les supprimer avant de passer à un environnement de production.

Supprimer les utilisateurs anonymes ? [Y/n] <– ENTRER
… Succès !

Normalement, root ne devrait être autorisé à se connecter que depuis ‘localhost’. Cela garantit que personne ne peut deviner le mot de passe root depuis le réseau.

Interdire la connexion root à distance ? [Y/n] <– ENTRER
… Succès !

Par défaut, MySQL est livré avec une base de données nommée ‘test’ à laquelle quiconque peut accéder. Cela est également destiné uniquement à des fins de test, et devrait être supprimé avant de passer à un environnement de production.

Supprimer la base de données de test et l’accès à celle-ci ? [Y/n] <– ENTRER

  • Suppression de la base de données de test…
    … Succès !
  • Suppression des privilèges sur la base de données de test…
    … Succès !

Recharger les tables de privilèges garantira que tous les changements effectués jusqu’à présent prendront effet immédiatement.

Recharger les tables de privilèges maintenant ? [Y/n] <– ENTRER
… Succès !

Nettoyage…

Tout est fait ! Si vous avez complété toutes les étapes ci-dessus, votre installation MySQL devrait maintenant être sécurisée.

Merci d’utiliser MySQL !

[root@server1 ~]#

Maintenant, nous configurons phpMyAdmin. Nous modifions la configuration d’Apache afin que phpMyAdmin autorise les connexions non seulement depuis localhost (en commentant la section ):

vi /etc/httpd/conf.d/phpMyAdmin.conf

| # phpMyAdmin - Navigateur MySQL basé sur le Web écrit en php # # N'autorise que localhost par défaut # # Mais autoriser phpMyAdmin à quiconque autre que localhost devrait être considéré # comme dangereux à moins d'être correctement sécurisé par SSL Alias /phpMyAdmin /usr/share/phpMyAdmin Alias /phpmyadmin /usr/share/phpMyAdmin # # Order Deny,Allow # Deny from All # Allow from 127.0.0.1 # Allow from ::1 # Order Deny,Allow Deny from All Allow from 127.0.0.1 Allow from ::1 # Ces répertoires ne nécessitent pas d'accès via HTTP - pris de l'original # tarball en amont de phpMyAdmin # Order Deny,Allow Deny from All Allow from None Order Deny,Allow Deny from All Allow from None # Cette configuration empêche mod_security dans les répertoires phpMyAdmin de # filtrer SQL etc. Cela peut casser votre implémentation mod_security. # # # # SecRuleInheritance Off # # |

Ensuite, nous créons les liens de démarrage système pour Apache et le démarrons:

chkconfig --levels 235 httpd on  
/etc/init.d/httpd start

Maintenant, vous pouvez diriger votre navigateur vers http://server1.example.com/phpMyAdmin/ ou http://192.168.0.100/phpMyAdmin/ et vous connecter avec le nom d’utilisateur root et votre nouveau mot de passe root MySQL.

7 Créer la base de données MySQL pour Postfix/Courier

Nous créons une base de données appelée mail:

mysqladmin -u root -p create mail

Ensuite, nous allons dans le shell MySQL:

mysql -u root -p

Dans le shell MySQL, nous créons l’utilisateur mail_admin avec le mot de passe mail_admin_password (remplacez-le par votre propre mot de passe) qui a les privilèges SELECT, INSERT, UPDATE, DELETE sur la base de données mail. Cet utilisateur sera utilisé par Postfix et Courier pour se connecter à la base de données mail:

GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost' IDENTIFIED BY 'mail_admin_password';  
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost.localdomain' IDENTIFIED BY 'mail_admin_password';  
FLUSH PRIVILEGES;

Toujours dans le shell MySQL, nous créons les tables dont Postfix et Courier ont besoin:

USE mail;
CREATE TABLE domains (  
domain varchar(50) NOT NULL,  
PRIMARY KEY (domain) )  
TYPE=MyISAM;
CREATE TABLE forwardings (  
source varchar(80) NOT NULL,  
destination TEXT NOT NULL,  
PRIMARY KEY (source) )  
TYPE=MyISAM;
CREATE TABLE users (  
email varchar(80) NOT NULL,  
password varchar(20) NOT NULL,  
quota bigint(20) DEFAULT '10485760',  
PRIMARY KEY (email)  
) TYPE=MyISAM;
CREATE TABLE transport (  
domain varchar(128) NOT NULL default '',  
transport varchar(128) NOT NULL default '',  
UNIQUE KEY domain (domain)  
) TYPE=MyISAM;
quit;

Comme vous l’avez peut-être remarqué, avec la commande quit; nous avons quitté le shell MySQL et sommes de retour dans le shell Linux.

La table domains stockera chaque domaine virtuel pour lequel Postfix doit recevoir des e-mails (par exemple, example.com).

domain
example.com

La table forwardings est destinée à l’aliasage d’une adresse e-mail à une autre, par exemple, transférer des e-mails pour [email protected] à [email protected].

sourcedestination
[email protected][email protected]

La table users stocke tous les utilisateurs virtuels (c’est-à-dire les adresses e-mail, car l’adresse e-mail et le nom d’utilisateur sont les mêmes) et les mots de passe (sous forme chiffrée !) et une valeur de quota pour chaque boîte aux lettres (dans cet exemple, la valeur par défaut est 10485760 octets, ce qui signifie 10 Mo).

emailpasswordquota
[email protected]No9.E4skNvGa. (“secret” sous forme chiffrée)10485760

La table transport est optionnelle, elle est destinée aux utilisateurs avancés. Elle permet de transférer des e-mails pour des utilisateurs uniques, des domaines entiers ou tous les e-mails vers un autre serveur. Par exemple,

domaintransport
example.comsmtp:[1.2.3.4]

transférerait tous les e-mails pour example.com via le protocole smtp vers le serveur avec l’adresse IP 1.2.3.4 (les crochets [] signifient “ne pas faire de recherche de l’enregistrement MX DNS” (ce qui a du sens pour les adresses IP…). Si vous utilisez un nom de domaine complètement qualifié (FQDN) à la place, vous ne devriez pas utiliser les crochets.).

8 Configurer Postfix

Maintenant, nous devons dire à Postfix où il peut trouver toutes les informations dans la base de données. Pour cela, nous devons créer six fichiers texte. Vous remarquerez que je dis à Postfix de se connecter à MySQL à l’adresse IP 127.0.0.1 au lieu de localhost. Cela est dû au fait que Postfix s’exécute dans un chroot jail et n’a pas accès au socket MySQL auquel il essaierait de se connecter si je disais à Postfix d’utiliser localhost. Si j’utilise 127.0.0.1, Postfix utilise le réseau TCP pour se connecter à MySQL, ce qui n’est pas un problème même dans un chroot jail (l’alternative serait de déplacer le socket MySQL dans le chroot jail, ce qui entraîne d’autres problèmes).

Maintenant, créons nos six fichiers texte.

vi /etc/postfix/mysql-virtual_domains.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT domain AS virtual FROM domains WHERE domain='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_forwardings.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT destination FROM forwardings WHERE source='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_mailboxes.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') FROM users WHERE email='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_email2email.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT email FROM users WHERE email='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_transports.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT transport FROM transport WHERE domain='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_mailbox_limit_maps.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT quota FROM users WHERE email='%s' hosts = 127.0.0.1 |

chmod o= /etc/postfix/mysql-virtual_*.cf  
chgrp postfix /etc/postfix/mysql-virtual_*.cf

Maintenant, nous créons un utilisateur et un groupe appelés vmail avec le répertoire personnel /home/vmail. C’est là que toutes les boîtes aux lettres seront stockées.

groupadd -g 5000 vmail  
useradd -g vmail -u 5000 vmail -d /home/vmail -m

Ensuite, nous faisons quelques configurations de Postfix. Assurez-vous de remplacer server1.example.com par un FQDN valide, sinon votre Postfix pourrait ne pas fonctionner correctement !

postconf -e 'myhostname = server1.example.com'  
postconf -e 'mydestination = server1.example.com, localhost, localhost.localdomain'  
postconf -e 'mynetworks = 127.0.0.0/8'  
postconf -e 'virtual_alias_domains ='  
postconf -e ' virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf'  
postconf -e 'virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf'  
postconf -e 'virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf'  
postconf -e 'virtual_mailbox_base = /home/vmail'  
postconf -e 'virtual_uid_maps = static:5000'  
postconf -e 'virtual_gid_maps = static:5000'  
postconf -e 'smtpd_sasl_auth_enable = yes'  
postconf -e 'broken_sasl_auth_clients = yes'  
postconf -e 'smtpd_sasl_authenticated_header = yes'  
postconf -e 'smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination'  
postconf -e 'smtpd_use_tls = yes'  
postconf -e 'smtpd_tls_cert_file = /etc/postfix/smtpd.cert'  
postconf -e 'smtpd_tls_key_file = /etc/postfix/smtpd.key'  
postconf -e 'transport_maps = proxy:mysql:/etc/postfix/mysql-virtual_transports.cf'  
postconf -e 'virtual_create_maildirsize = yes'  
postconf -e 'virtual_maildir_extended = yes'  
postconf -e 'virtual_mailbox_limit_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailbox_limit_maps.cf'  
postconf -e 'virtual_mailbox_limit_override = yes'  
postconf -e 'virtual_maildir_limit_message = "L'utilisateur que vous essayez d'atteindre est en dépassement de quota."'  
postconf -e 'virtual_overquota_bounce = yes'  
postconf -e 'proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps'  
postconf -e 'inet_interfaces = all'

Ensuite, nous créons le certificat SSL nécessaire pour TLS:

cd /etc/postfix  
openssl req -new -outform PEM -out smtpd.cert -newkey rsa:2048 -nodes -keyout smtpd.key -keyform PEM -days 365 -x509

Nom du pays (code à 2 lettres) [XX] : <– Entrez le nom de votre pays (par exemple, “FR”).
Nom de l’État ou de la province (nom complet) [] : <– Entrez le nom de votre État ou province.
Nom de la localité (par exemple, ville) [Ville par défaut] : <– Entrez votre ville.
Nom de l’organisation (par exemple, entreprise) [Société par défaut] : <– Entrez le nom de votre organisation (par exemple, le nom de votre entreprise).
Nom de l’unité organisationnelle (par exemple, section) [] : <– Entrez le nom de votre unité organisationnelle (par exemple, “Département IT”).
Nom commun (par exemple, votre nom ou le nom d’hôte de votre serveur) [] : <– Entrez le nom de domaine complètement qualifié du système (par exemple, “server1.example.com”).
Adresse e-mail [] : <– Entrez votre adresse e-mail.

Ensuite, changez les permissions de smtpd.key:

chmod o= /etc/postfix/smtpd.key
Share: X/Twitter LinkedIn

Recevez de nouveaux articles dans votre boîte de réception.

Aucun spam. Désabonnez-vous à tout moment.