Paramétrer un serveur mail Postfix, Dovecot avec
authentification PostgreSQL et SASL
Objectif
Avoir un serveur mail s'appuyant sur une structure PostgreSQL pour la gestion
de ses comptes, afin de ne plus être lié aux sessions utilisateur UNIX.
Versions utilisées pour réaliser ce tutoriel
GNU/Linux Debian 12
Dovecot [Link]
Postfix mail_version = 3.7.11
PostgreSQL 15.10
1ère étape, préparation du système nommage et domaine
Paquets nécessaires :
realmd libnss-sss libpam-sss sssd sssd-tools adcli samba-common-bin
oddjob oddjob-mkhomedir packagekit
sudo apt-get realmd libnss-sss libpam-sss sssd sssd-tools adcli samba-common-
bin oddjob oddjob-mkhomedir packagekit
Il semble que sssd ne puisse pas faire son travail parce qu'il ne trouve pas
ses fichiers de configuration.
Si vous voulez vraiment démarrer sssd, ceci devrait faire l'affaire :
sudo cp /usr/lib/x86_64-linux-gnu/sssd/conf/[Link] /etc/sssd/.
sudo chmod 600 /etc/sssd/[Link]
Nommage du serveur et configuration réseau
Installation des paquets nécessaire et joindre le serveur au domaine active
directory
Créations des utilisateurs au niveau active directory et permettre la connexion et
la création du profile home directroy au sein du serveurs postfix.
Voilà comment mon réseau est configuré pour cette démonstration.
Domain Controller : [Link]/24 domaine : [Link], NetBIOS : dc
Machine linux : [Link]/24 hostname postfixdov
Afin d’éviter de rencontrer des erreurs bêtes, je vous invite à exécuter toutes les
commandes préfixées avec sudo, ou si vous êtes flemmard, sous le pseudonyme
root.
Sur votre machine Linux, il va falloir ajouter l’ip de votre domain controller
en tant que serveur dns principal.
Configuration réseau au niveau postfix-01 avec network manager nmcli
#sudo nmcli con add –type Ethernet con–name static1 ifname ens33
ip4 [Link]/24 gw4 [Link] [Link] [Link]
#nmcli con up static1
#nmcli show device ens33
Paquets requis et configuration du domaine
Nous allons commencer par exécuter quelques actions « Routinière »
Pingez le contrôleur de domaine (étape bloquante)
ping [Link]
sudo realm disc
realm disover [Link]
sudo realm join -U administrator [Link]
sudo realm list
Création des répertoires personnel des utilisateurs du domaine
Ensuite copier-coller, ce bloc de commande dans votre terminal. Il va nous
permettre de créer automatiquement le dossier de l’utilisateur /home/ »user »,
lors de sa première connexion.
sudo bash -c "cat > /usr/share/pam-configs/mkhomedir" <<EOF
Name: activate mkhomedir Default: yes Priority: 900 Session-Type:
Additional Session: required pam_mkhomedir.so umask=0022
skel=/etc/skel EOF
sudo pam-auth-update
Cochez toutes les options
sudo systemctl restart sssd
sudo systemctl status sssd
Nous allons prendre un exemple avec trois utilisateurs de mon AD.
alain, albert et deborah. le premier et le dernier feront partie du
groupe support. Ce groupe disposera de privilège administrateur.
Avant de continuer, nous allons vérifier que les utilisateurs sont
bien reconnus par Debian comme étant des utilisateurs du
domaine [Link]
Configurer l’authentification avancé pour octroyer des droits sudo à un
utilisateur membre du domaine
Nous devons créer le fichier suivant :
$sudo nano /etc/sudoers.d/domain_admins
alain@[Link] ALL=(ALL) ALL
%support@[Link]=(ALL) ALL
Connexion SSH
ssh labmig\\alain@localhost
Enfin éditer les deux fichiers /etc/[Link] et /etc/hosts
/etc/hosts ajouter la ligne [Link] postfixdov [Link]
/etc/[Link] doit etre comme se suit
Coté Active directory Ajout enregistrement (MX) :
Ouvrir la console Dns et ajouter un enregistrement (MX) qui se pointe sur la
machine [Link] (FQDN).
2ème étape, PostgreSQL, Dovecot
Packages : postgresql postfix-pgsql dovecot-lmtpd dovecot-pgsql
sudo apt install postgresql postfix-pgsql dovecot-lmtpd dovecot-
pgsql
Configurer PostgreSQL
Ajustez ceci à vos besoins si vous avez déjà une installation postgres en cours !
Mais à partir d'une nouvelle installation de postgres, configurons
l'authentification afin de donner à dovecot l'accès à la base de données. Ajoutez
ce qui suit à /etc/postgresql/9.1/main/pg_ident.conf :
mailmap dovecot mailreader
mailmap postfix mailreader
mailmap root mailreader
Et ce qui suit dans /etc/postgresql/15/main/pg_hba.conf (Attention : Assurez-
vous de l'ajouter juste après le bloc de commentaires Put your actual
configuration here ! Sinon, l'une des entrées par défaut pourrait être prise en
premier et l'authentification de la base de données échouerait. )
local mail all peer map=mailmap
Rechargez ensuite postgresql (service postgresql reload). Configurez maintenant
la base de données :
Sudo systemctl reload postgresql
Création des tables PostgreSQL :
# sudo -u postgres psql
postgres=# CREATE USER mailreader;
postgres=# REVOKE CREATE ON SCHEMA public FROM PUBLIC;
postgres=# REVOKE USAGE ON SCHEMA public FROM PUBLIC;
postgres=# GRANT CREATE ON SCHEMA public TO postgres;
postgres=# GRANT USAGE ON SCHEMA public TO postgres;
postgres=# CREATE DATABASE mail WITH OWNER mailreader;
postgres=# \q
# sudo psql -U mailreader -d mail
postgres=# \c mail
mail=# CREATE TABLE aliases (
alias varchar(255) NOT NULL,
email varchar(255) NOT NULL,
domain varchar(255) NOT NULL,
created time with time zone NOT NULL default now(),
modified time with time zone NOT NULL default now(),
active int NOT NULL default '1',
PRIMARY KEY (email)
);
mail=# CREATE TABLE users (
username varchar(255) NOT NULL,
password varchar(255) NOT NULL,
name varchar(255) NOT NULL,
maildir varchar(255) NOT NULL,
quota int NOT NULL DEFAULT '0',
domain varchar(255) NOT NULL,
created time with time zone NOT NULL DEFAULT now(),
modified time with time zone NOT NULL DEFAULT now(),
active int NOT NULL DEFAULT '1',
PRIMARY KEY (username)
);
Mail=# CREATE TABLE DOMAIN (
domain varchar(255) NOT NULL,
description varchar(255) NOT NULL DEFAULT '',
aliases int NOT NULL default '0',
users int NOT NULL default '0',
maxquota int NOT NULL default '0',
transport varchar(255) default NULL,
backupmx int NOT NULL default '0',
created time with time zone NOT NULL DEFAULT now(),
modified time with time zone NOT NULL DEFAULT now(),
active int NOT NULL default '1',
PRIMARY KEY (domain)
);
mail=# ALTER TABLE aliases OWNER TO mailreader;
mail=# ALTER TABLE users OWNER TO mailreader;
mail=# ALTER TABLE domain OWNER TO mailreader;
mail=# \q
Vous pouvez ensuite ajouter des boîtes aux lettres virtuelles comme suit, en
partant d'une boîte aux lettres racine :
# doveadm pw -s sha512 -r 100
Enter new password: ...
Retype new password: ...
{SHA512}.......................................................
......==
# psql -U mailreader -d mail
mail=# INSERT INTO users (
username,
password,
name,
maildir,
domain
) VALUES (
'alain@[Link]',
'{SHA512}......................................................
.......==',’alain’,’alain’,’[Link]/’
);
Mail=# INSERT INTO users (username, password, name, maildir,
domain) VALUES ('deborah@[Link]',
'{SHA512}vSsar3708Jvp9Szi2NWZZ02Bqp1qRCFpbcTZPdBhnWgs5WtNZKnvCX
dhztmeD2cmW192CF5bDufKRpayrW/
isg==','deborah','deborah','[Link]/');
Mail=# INSERT INTO domain (domain,description) VALUES
('[Link]', 'labmig domain');
Mail=# INSERT INTO aliases (alias,email, domain) VALUES
('alain', 'alain@[Link]', [Link]);
A titre d’exemple le mot de passe est “secret “
Un domaine de premier niveau (TLD) est l'un des domaines situés au niveau le
plus élevé de la hiérarchie des domaines. Le domaine .ltd convient à tout site
web qui souhaite être pris au sérieux en tant que société à responsabilité limitée.
Si le nom de votre entreprise contient déjà ltd, vous pouvez gagner de la place
dans votre URL en ajoutant « ltd » à l'extension du domaine. Que vous soyez
une entreprise bien établie ou une jeune pousse qui cherche à se faire une place
dans le monde, un domaine .ltd est un excellent investissement. Il s'agit d'une
déclaration d'intention et de stabilité en trois lettres qui inspirera confiance aux
clients.
Interface d'administration (facultatif)
Si vous ne souhaitez pas utiliser l'interface de ligne de commande pour gérer la
base de données de messagerie, vous pouvez mettre en place une interface
d'administration. Ajoutons d'abord un utilisateur de base de données qui n'est
autorisé qu'à modifier la base de données de courrier électronique. Retournez
dans /etc/postgresql/15/main/pg_hba.conf et ajoutez cette ligne juste en dessous
de la ligne d'authentification par les pairs que vous avez ajoutée plus tôt :
host pgadmin mail [Link]/32 md5
Cela permet d'autoriser les connexions locales sur le port 5432. (Le port par
défaut pour postgres)
Ajouter l'utilisateur de la base de données :
# sudo -u postgres psql
postgres=# CREATE USER pgadmin WITH PASSWORD 'new
password';
postgres=# \q
Donnez à l'utilisateur les privilèges nécessaires pour modifier la base de données
du courrier :
# sudo psql -U mailreader -d mail
mail=> GRANT SELECT, UPDATE, INSERT, DELETE ON users
TO pgadmin;
mail=> GRANT SELECT, UPDATE, INSERT, DELETE ON aliases
TO pgadmin;
mail=> \q
Vous pouvez maintenant utiliser une interface d'administration comme pgAdmin
qui est capable d'utiliser le tunnel SSH pour se connecter directement à la base
de données, ou vous pouvez mettre en place quelque chose comme
phpPgAdmin.
Mise en place de Dovecot
Nous devons connecter dovecot à la base de données et configurer le serveur
LMTP. Configurez un nouvel utilisateur (dovecot refusera de traiter le courrier
sans qu'un utilisateur système ne soit configuré) et un répertoire pour les
maildirs en premier lieu : (vous pourriez utiliser /var/mail, mais ce répertoire
utilise traditionnellement le format mbox, alors que nous allons utiliser le format
maildir, qui est supérieur).
Les serveurs SMTP, tels que Postfix, utilisent le protocole LMTP (Local Mail
Transfer Protocol) pour délivrer les emails à Dovecot.
# doveconf -a | egrep "^protocols"
protocols = imap lmtp
Cette commande affiche les protolcols installé et utilser par dovecot
# adduser --system --no-create-home --uid 500 --group --
disabled-password --disabled-login --gecos 'dovecot virtual
mail user' vmail
# mkdir /home/mailboxes
# chown vmail:vmail /home/mailboxes
# chmod 700 /home/mailboxes
Sauvegardez maintenant la configuration suivante dans le fichier
/etc/dovecot/[Link] et Assurez-vous qu'il appartient à root et qu'il
a le chmod 600.
driver = pgsql
connect = host=/var/run/postgresql/ dbname=mail user=mailreader
default_pass_scheme = SHA512
password_query = SELECT email as user, password FROM users
WHERE email = '%u'
user_query = SELECT email as user,
'maildir:/home/mailboxes/maildir/'||maildir as mail,
'/home/mailboxes/home/'||maildir as home, 500 as uid, 500 as
gid FROM users WHERE email = '%u'
Ouvrez maintenant /etc/dovecot/conf.d/[Link] et modifiez les paramètres
passdb et userdb pour qu'ils ressemblent à ceci :
userdb {
driver = prefetch
}
passdb {
args = /etc/dovecot/[Link]
driver = sql
}
Modifiez la strophe des protocoles dans /etc/dovecot/[Link] pour qu'elle
devienne :
protocols = imap lmtp
Et ajoutez le socket du service lmtp et quelques paramètres du protocole lmtp
dans conf.d/[Link] :
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
group = postfix
mode = 0600
user = postfix
}
}
Modifier l'adresse du postmaster pour répondre à vos besoins spécifiques
dans /etc/dovecot/conf.d/[Link].
protocol lmtp {
postmaster_address=postmaster@[Link]
hostname=[Link]
}
Mise en place du postfix
Nous devons maintenant indiquer à postfix de livrer le courrier directement à
dovecot. Ouvrez /etc/postfix/[Link] et ajoutez :
mailbox_transport = lmtp:unix:private/dovecot-lmtp
À la fin. Nous devons maintenant configurer la base de données pour postfix.
Créez le fichier /etc/postfix/[Link] et entrez :
user=mailreader
dbname=mail
table=aliases
select_field=alias
where_field=email
hosts=unix:/var/run/postgresql
Créez ensuite le fichier /etc/postfix/[Link] et entrez :
user=mailreader
dbname=mail
table=users
select_field=email
where_field=email
hosts=unix:/var/run/postgresql/
Créez ensuite le fichier /etc/postfix/[Link] et entrez :
user=mailreader
dbname=mail
table=domain
select_field=domain
where_field=domain
hosts=unix:/var/run/postgresql/
Modifiez maintenant la ligne alias_maps dans le fichier [Link] comme suit :
alias_maps = hash:/etc/aliases proxy:pgsql:/etc/postfix/pgsql-
[Link]
Et la ligne local_recipient_maps pour lire
local_recipient_maps = proxy:pgsql:/etc/postfix/[Link]
$alias_maps $domain
Dans l'ensemble, votre fichier [Link] devrait ressembler à ceci :
myhostname = [Link]
myorigin = [Link]
mydestination = [Link], [Link], localhost,
[Link]
relayhost =
mynetworks = [Link]/8 [::ffff:[Link]]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
alias_maps = hash:/etc/aliases proxy:pgsql:/etc/postfix/[Link]
local_recipient_maps = proxy:pgsql:/etc/postfix/[Link]
$alias_maps $domain
mailbox_transport = lmtp:unix:private/dovecot-lmtp
smtpd_tls_cert_file=/etc/ssl/certs/[Link]
smtpd_tls_key_file=/etc/ssl/private/[Link]
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_tls_security_level=may
smtpd_tls_protocols = !SSLv2, !SSLv3
Redémarrages des services postfix et dovecot et test de la
configuration
#postfix reload
#systemtcl reload postgresql
#systemctl restart dovecot
Test de l’authentification
La première étape consiste à utiliser un utilisateur du domaine et vérifier qu’il
arrive à se loger a la base postgresql
# test authentication
sudo doveadm auth test alain@[Link]
# show informations about the user (user attributes)
sudo doveadm user -u me@[Link]
# show quota for a specific user
sudo doveadm quota get -u me@[Link]
postconf –n
doveconf –n
cp /usr/lib/x86_64-linux-gnu/sssd/conf/[Link] /etc/sssd/
sudo apt-get install bsd-mailx
Set mail transport agent to use msmtp
sudo nano /etc/[Link]
append the following:
set mta=/usr/bin/msmtp