Skip to main content

postfix workshop

·10 mins
Dns French Gnu/Linux Mail Workshop
xeylou
Author
xeylou
Table of Contents
installation d’un serveur mail mx postfix
avec dovecot & utilisation avec thunderbird

introduction
#

je continue l’avancée des workshops avec un serveur mail postfix avec dovecot, pour l’envoi & la réception de mails

il pourra être utilisé avec utilisateurs gnu/linux ou virtuels

topologie utilisée

%%{init: {'theme':'dark'}}%% graph TD subgraph 192.168.122.0/24 postfix[r303-deb12-postfix
192.168.122.10] bind9[r303-deb12-bind9
192.168.122.11] thunderbird[r303-deb12-client
192.168.122.12] pstf(Service Postfix) dovecot(Service Dovecot) bind(Service Bind9) clients(Mozilla Thunderbird) gw{NAT
192.168.122.1} end wan{WAN} wan --- gw gw --- postfix & bind9 gw --- thunderbird postfix -.- pstf & dovecot bind9 -.- bind thunderbird -.- clients

vm postfix
#

modification nom d’hôte

hostnamectl set-hostname r303-deb12-postfix && logout

attribution adresse ip statique

nano /etc/network/interfaces
 4
 5
 6
 7
 8
 9
10
11
12
13
14
source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug enp1s0
iface enp1s0 inet static
address 192.168.122.10/24
gateway 192.168.122.1
systemctl restart networking

installation paquet postfix & mailutils pour envoi/réception de mails entre utilisateurs

apt install -y postfix mailutils

Internet Site -> rzo.lan

pour que postfix propose de prendre un nom de domaine, qui sera finalement utilisé pour les mails

si installation sans accroc : service postfix actif

systemctl status postfix

fichier de configuration global postfix /etc/postfix/main.cf

commente tout ce qui touche au tls car pas utilisé ici

ajout d’informations pour l’utilisation du service

nano /etc/postfix/main.cf
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# TLS parameters
# smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
# smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
# smtpd_tls_security_level=may

# smtp_tls_CApath=/etc/ssl/certs
# smtp_tls_security_level=may
# smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache


mydomain = rzo.lan
# smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
myhostname = r303-deb12-postfix.rzo.lan
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = $mydomain, $myhostname, localhost.$mydomain, localhost
# relayhost = 
mynetworks = 127.0.0.0/8 192.168.122.0/24 
home_mailbox = Maildir/
mailbox_size_limit = 51200000
recipient_delimiter = +
inet_interfaces = all
inet_protocols = ipv4

alias_maps table des noms & des adresses de mydestination
alias_database table des noms d’usages de alias_maps
myorigin pas de nom de domaine -> ajoute celui dans fichier
mydestination domaines acceptés d’échange
recipient_delimiter truc@$mydomain & truc+random@$mydomain == les mêmes (pourriel)

vérification syntaxique après édition

postfix check

redémarrage du service pour appliquer les modifications

systemctl restart postfix

création de deux users gnu/linux

Note mot de passe contingeant à l’authentification…
adduser --gecos "" user1 && adduser --gecos "" user2

connexion à l’un des deux users pour test d’envoi

su user1
mail user2

Cc:
Subject: test envoi user2
contenu du mail

envoi avec retour à la ligne puis CTRL + D

connexion sur l’utilisateur récepteur

su user2

vérification de la réception du mail

ls ~/Maildir/new/ | wc -l

1 si nouveau mail car fichier dans ~/Maildir/new/

dossier ~/Maildir défini dans /etc/postfix/main.cf

dovecot
#

serveur imap & pop3

installation du daemon imap de dovecot

apt install -y dovecot-imapd

autres paquets dans la suite dovecot-*, e.g. dovecot-ldap pour support ldap

fichiers de configuration de dovecot dans /etc/dovecot/conf.d/

modification des méthodes d’authentification

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

précision de tout laisser passer en clair

 5
 6
 7
 8
 9
10
# Disable LOGIN command and all other plaintext authentications unless
# SSL/TLS is used (LOGINDISABLED capability). Note that if the remote IP
# matches the local IP (ie. you're connecting from the same computer), the
# connection is considered secure and plaintext authentication is allowed.
# See also ssl=required setting.
disable_plaintext_auth = no

définition des méchanismes d’authentification (login obsolète mais toujours utilisé)

 96
 97
 98
 99
100
# Space separated list of wanted authentication mechanisms:
#   plain login digest-md5 cram-md5 ntlm rpa apop anonymous gssapi otp
#   gss-spnego
# NOTE: See also disable_plaintext_auth setting.
auth_mechanisms = plain login

modification de l’emplacement de destination des mails

nano /etc/dovecot/conf.d/10-mail.conf
22
23
24
25
26
27
28
29
30
# See doc/wiki/Variables.txt for full list. Some examples:
#
#   mail_location = maildir:~/Maildir
#   mail_location = mbox:~/mail:INBOX=/var/mail/%u
#   mail_location = mbox:/var/mail/%d/%1n/%n:INDEX=/var/indexes/%d/%1n/%n
#
# <doc/wiki/MailLocation.txt>
#
mail_location = maildir:~/Maildir

modification de la gestion des logs - a été utile

nano /etc/dovecot/conf.d/10-logging.conf
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# Log file to use for error messages. "syslog" logs to syslog,
# /dev/stderr logs to stderr.
log_path = /var/log/dovecot.log

# Log file to use for informational messages. Defaults to log_path.
#info_log_path = 
# Log file to use for debug messages. Defaults to info_log_path.
#debug_log_path = 

# Syslog facility to use if you're logging to syslog. Usually if you don't
# want to use "mail", you'll use local0..local7. Also other standard
# facilities are supported.
syslog_facility = mail
39
40
# Log unsuccessful authentication attempts and the reasons why they failed.
auth_verbose = yes
50
51
52
# Even more verbose logging for debugging purposes. Shows for example SQL
# queries.
auth_debug = yes

application des modifications

systemctl restart dovecot

vérification du fonctionnement

telnet -l user1 localhost 143

a login user2 user2

où user2 l’utilisateur et user2 son mot de passe

utilisateurs virtuels
#

création user vmail avec /opt/messagerie comme home directory

création groupe vmail avec group id de 5000

groupadd -g 5000 vmail

création du user

useradd -g vmail -u 5000 vmail -d /opt/messagerie -m

-g son groupe
-u 5000 user id de 5000
-d /opt/messagerie son répertoire utilisateur/home ~
-m créer son ~ si inexistant

indication à postfix de vmail & du repertoire /opt/messagerie pour la gestion des boites aux lettres

nano /etc/postfix/main.cf
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# TLS parameters
# smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
# smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
# smtpd_tls_security_level=may

# smtp_tls_CApath=/etc/ssl/certs
# smtp_tls_security_level=may
# smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache


mydomain = rzo.lan
# smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
myhostname = r303-deb12-postfix.rzo.lan
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = $mydomain, $myhostname, localhost.$mydomain, localhost
default_transport = dovecot
mail_spool_directory = /opt/messagerie/
virtual_mailbox_base = /opt/messagerie/
virtual_mailbox_domains = hash:/etc/postfix/vdomain
virtual_mailbox_maps = hash:/etc/postfix/vmail
virtual_alias_maps = hash:/etc/postfix/valias
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
# relayhost = 
mynetworks = 127.0.0.0/8 192.168.122.0/24 
home_mailbox = Maildir/
mailbox_size_limit = 51200000
recipient_delimiter = +
inet_interfaces = all
inet_protocols = ipv4

default_transport protocole/serveur d’envoi, par défaut smtp
mail_spool_directory dossier de stockage des mails
virtual_mailbox_domains liste domaines où postfix destinataire
virtual_mailbox_maps adresses valides de virtual_mailbox_domains
virtual_uid_maps user id pour écrire les mails
virtual_uid_maps pareil que virtual_uid_maps pour group id

définition du domaine virtuel

nano /etc/postfix/vdomain
Note pas le droit d’être le même que celui dans postfix
1
rzo.private #

création de messageries virtuelles accordément à virtual_mailbox_maps

nano /etc/postfix/vmail
1
2
3
xeylou@rzo.private rzo.private/xeylou/
testing@rzo.private rzo.private/testing/
admin@rzo.private rzo.private/admin/

définition des alias virtuels pour ces utilisateurs vu virtual_alias_maps

nano /etc/postfix/valias
1
2
root: admin@rzo.private
xeylou: xeylou@rzo.private

création d’un daemon postfix pour dovecot/vmail

nano /etc/postfix/master.cf
138
139
dovecot   unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -f ${sender} -d ${recipient}

prise en compte des 3 fichiers modifiés

postmap /etc/postfix/vdomain
postmap /etc/postfix/vmail
postalias /etc/postfix/valias
postfix check

modification dovecot
#

utilisation des comptes virtuels avec authentification correcte

modification de la méthode d’accès

nano /etc/dovecot/conf.d/10-auth.conf
 5
 6
 7
 8
 9
10
# Disable LOGIN command and all other plaintext authentications unless
# SSL/TLS is used (LOGINDISABLED capability). Note that if the remote IP
# matches the local IP (ie. you're connecting from the same computer), the
# connection is considered secure and plaintext authentication is allowed.
# See also ssl=required setting.
disable_plaintext_auth = yes

ajout d’une méthode d’authentification sécurisée

 96
 97
 98
 99
100
# Space separated list of wanted authentication mechanisms:
#   plain login digest-md5 cram-md5 ntlm rpa apop anonymous gssapi otp
#   gss-spnego
# NOTE: See also disable_plaintext_auth setting.
auth_mechanisms = cram-md5 plain login

ajout du fichier auth-static.conf.ext dans la configuration

122
123
124
125
126
127
#!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-static.conf.ext

définition de l’emplacement de la liste des utilisateurs virtuels + des mots de passe

nano /etc/dovecot/conf.d/auth-static.conf.ext
16
17
18
19
20
21
22
23
24
25
26
27
28
passdb {
#  driver = static
#  args = password=test
  driver = passwd-file
  args = username_format=%u /etc/dovecot/dovecot.users
}

userdb {
#  driver = static
#  args = uid=vmail gid=vmail home=/home/%u
  driver = static
  args = uid=vmail gid=vmail home=/opt/messagerie/%d/%n/ allow_all_users=yes
}

informations user vmail pour récupération mails

nano /etc/dovecot/conf.d/10-mail.conf
105
106
107
108
109
110
111
112
113
114
# System user and group used to access mails. If you use multiple, userdb
# can override these by returning uid or gid fields. You can use either numbers
# or names. <doc/wiki/UserIds.txt>
mail_uid = 5000
mail_gid = 5000

# Group to enable temporarily for privileged operations. Currently this is
# used only with INBOX when either its initial creation or dotlocking fails.
# Typically this is set to "mail" to give access to /var/mail.
mail_privileged_group = vmail

définition des autorisations pour lister utilisateurs

nano /etc/dovecot/conf.d/10-master.conf
100
101
102
103
104
105
106
107
108
109
110
  unix_listener auth-userdb {
    #mode = 0666
    user = vmail
    group = vmail
  }

  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix
  }

définition du hash des mots de passe des utilisateurs virtuels (vusers)

doveadm pw -s CRAM-MD5

Enter new password:
Retype new password:
{CRAM-MD5}e02d374fde0dc75a17a557039a3a5338c7743304777dccd376f332bee68d2cf6

le coller dans /etc/dovecot/dovecot.users défini depuis /etc/dovecot/conf.d/auth-static.conf.ext

définition des mots de passe des vusers

nano /etc/dovecot/dovecot.users
1
2
3
xeylou@rzo.private:{CRAM-MD5}e02d374fde0dc75a17a557039a3a5338c7743304777dccd376f332bee68d2cf6
testing@rzo.private:{CRAM-MD5}e02d374fde0dc75a17a557039a3a5338c7743304777dccd376f332bee68d2cf6
admin@rzo.private:{CRAM-MD5}e02d374fde0dc75a17a557039a3a5338c7743304777dccd376f332bee68d2cf6

les 3 utilisateurs ont le même mot de passe

redémarrage des deux services

systemctl restart postfix
systemctl restart dovecot

vérification de leur fonctionnement

systemctl status postfix
systemctl status dovecot

pour débogger

journalctl -xfe

un des problèmes que j’ai eu

Oct 02 09:01:33 r303-deb12-postfix postfix/pipe[2905]: 940265FD8B: to=xeylou@rzo.private, relay=dovecot, delay=0.04, delays=0.02/0/0/0.02, dsn=4.3.0, status=deferred (temporary failure. Command output: lda(xeylou@rzo.private): Error: net_connect_unix(/run/dovecot/stats-writer) failed: Permission denied Can’t open log file /var/log/dovecot.log: Permission denied )

correctif

chown vmail:vmail /var/log/dovecot.log

vm bind9
#

installation du paquet bind9 + dépendances

apt install -y dbus bind9* dnsutils

modification zones dns dans etc/bind/named.conf.local

nano /etc/bind/named.conf.local
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
//
// Do any local configuration here
//

// Consider adding the 1918 zones here, if they are not used in your
// organization
//include "/etc/bind/zones.rfc1918";

zone "rzo.lan" IN {
  type master;
  file "/etc/bind/rzo.lan";
};

zone "rzo.private" IN {
  type master;
  file "/etc/bind/rzo.private";
};

zone "122.168.192.in-addr.arpa" {
  type master;
  file "/etc/bind/rzo.lan.inverse";
};

vérification syntaxique

named-checkconf /etc/bind/named.conf.local

édition de celles-ci

nano /etc/bind/rzo.lan
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
$TTL 86400
$ORIGIN rzo.lan.

@ IN SOA ns.rzo.lan. admin.rzo.lan. (
2023100101 ; serial
21600 ; refresh
10800 ; retry
43200 ; expire
10800 ) ; minimum

@ IN NS ns.rzo.lan.
@ IN MX 10 mail.rzo.lan.
mail IN A 192.168.122.10
ns IN A 192.168.122.11
postfix IN CNAME mail
bind1 IN CNAME ns
nano /etc/bind/rzo.private
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
$TTL 86400
$ORIGIN rzo.private.

@ IN SOA ns.rzo.private. admin.rzo.private. (
2023100201 ; serial
21600 ; refresh
10800 ; retry
43200 ; expire
10800 ) ; minimum

@ IN NS ns.rzo.private.
@ IN MX 10 mail.rzo.private.
mail IN A 192.168.122.10
ns IN A 192.168.122.11
postfix IN CNAME mail
bind1 IN CNAME ns
nano /etc/bind/rzo.lan.inverse
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
$TTL 86400

@ IN SOA ns.rzo.lan. admin.rzo.lan. (
2023100101 ; serial
21600 ; refresh
10800 ; retry
43200 ; expire
10800 ) ; minimum

@ IN NS ns.
11 IN PTR ns
10 IN PTR mail
named-checkzone rzo.lan /etc/bind/rzo.lan
named-checkzone rzo.private /etc/bind/rzo.private
named-checkzone rzo.lan.inverse /etc/bind/rzo.lan.inverse
systemctl restart bind9

test sur machine extérieure - après modification dns

dig ns.rzo.lan
dig mail.rzo.lan
dig -x 192.168.122.11
dig -x 192.168.122.10

vm thunderbird
#

apt install -y thunderbird

connexion utilisateur virtuel xeylou

cliquez sur l’image pour zoomer, les formulaires séléctionnez sont ceux que j’ai cliqués

sur une autre VM, mêmes manipulations pour l’utilisateur testing

l’envoi et la réception des mails fonctionne

exemple d’envoi d’un mail

le mail peut être visualisé sur la vm postfix/dovecot

ls /opt/messagerie/rzo.private/testing/Maildir/.Sent/cur/