====== Configuration d'un serveur de courriers ======
{{ :serveur:postfix.jpg?200|}}
Cette page est en cours de réécriture.
Description d’une méthode d’installation d’un serveur de courriel Postfix, sur une distribution Linux Debian (Buster) possédant déjà une configuration avec un serveur DNS (BIND) et une base de données MySQL (MariaDB), avec les éléments suivants :
* phpMyAdmin
* Postfix
* Postfix-policyd-spf-python
* Dovecot
* Postgrey
* Amavisd-new
* Clamav
* Spamassassin
* OpenDKIM
* OpenDMARC
* Monit
===== Installation de paquets =====
Il est conseillé d’avoir installé et configuré [[https://wiki.debian-fr.xyz/Rkhunter|rkhunter]].
apt update && apt-get upgrade
apt purge exim4 exim4-base exim4-config exim4-daemon-light
apt install postfix postfix-mysql postfix-policyd-spf-python postgrey dovecot-core dovecot-imapd dovecot-lmtpd dovecot-mysql dovecot-sieve dovecot-antispam opendkim opendkim-tools amavisd-new clamav-daemon monit opendmarc spamassassin spamc mailutils
Pendant l'installation de Postfix, il faudra choisir "internet site", entrer comme nom du système FQDN de courrier la valeur de la commande ''hostname -f'' ou si elle renvoie juste le nom du serveur entrer la valeur complète avec le nom de domaine, cela ressemblera à ''hostname.domaine.tld'' ou à ''domaine.tld''.
Sous Debian 10 (Buster), Monit n'est plus disponible dans les dépôts,
voir [[https://unix.stackexchange.com/questions/574356/install-monit-in-debian-10-buster|Install monit in Debian 10 (buster)]]
et [[https://wiki.debian.org/fr/Backports|cette page]] pour l'installation des backports.
===== Définition du "hostname" =====
La machine doit avoir un nom de machine et de domaine complet, cela est à définir dans le fichier ''/etc/hosts'' :
127.0.0.1 localhost
127.0.1.1 hostname.domaine.eu hostname
Pour tester la configuration :
root@hostname:~# hostname -s
hostname
root@hostname:~# hostname -d
domaine.eu
root@hostname:~# hostname -f
hostname.domaine.eu
Mais aussi la zone PTR de recherche inversée doit être configurée, la commande ''dig -x'' doit renvoyer la valeur de ''hostname -f''.
===== Configuration additionnelle =====
Les ports TCP 25, 465, 587 et 993 du firewall doivent être ouvert.
===== Installation et configuration de phpMyAdmin =====
Pour Debian et Ubuntu il existe un paquet dans les dépôts, cependant, au moment où j'écris cette page, il existe un [[https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=954766|bug]] dans l'installation. J’ai donc choisi d'installer la dernière version à partir des sources.
==== Vérifier les sources ====
Pour vérifier l’intégrité des fichiers (somme de contrôle et signature GPG), le détail est expliqué [[https://docs.phpmyadmin.net/fr/latest/setup.html#verifying-phpmyadmin-releases|ici]].
==== Création d’un serveur virtuel Apache2 ====
=== VirtualHost sur le port 80 ===
Je crée un VirtualHost sur le port 80, j'ajouterai ensuite une redirection sur le port 443, mais avant de décommenter RewriteRule il me faudra générer un certificat SSL.
# The ServerName directive sets the request scheme, hostname and port that
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
# specifies what hostname must appear in the request's Host: header to
# match this virtual host. For the default virtual host (this file) this
# value is not decisive as it is used as a last resort host regardless.
# However, you must set it for any further virtual host explicitly.
#ServerName www.example.com
ServerName pma.hostname.domaine.eu
ServerAlias pma.hostname.domaine.eu
ServerAdmin webmaster@domaine.eu
DocumentRoot /var/www/pma
RewriteEngine On
#RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [redirect=301]
# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the loglevel for particular
# modules, e.g.
#LogLevel info ssl:warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
=== Création d’un certificat avec Let’s Encrypt ===
certbot certonly --webroot -w /var/www/pma -d pma.hostname.domaine.eu --email webmaster@domaine.eu --rsa-key-size 4096
=== VirtualHost sur le port 443 ===
La directive ''RewriteRule'' peut maintenant être décommentée, ensuite il faut créer un ''VirtualHost'' afin d'utiliser SSL. J'utilise ici une configuration restrictive, il faudra peut-être une configuration plus souple (voir [[https://wiki.mozilla.org/Security/Server_Side_TLS|Server Side TLS]] ) si de nombreux clients doivent se connecter.
ServerName pma.hostname.domaine.eu
ServerAlias pma.hostname.domaine.eu
ServerAdmin webmaster@domaine.eu
DocumentRoot /var/www/pma
Options SymLinksIfOwnerMatch
AllowOverride None
Require all denied
Options -Indexes -FollowSymLinks +MultiViews
AllowOverride All
# restreindre l'accés à certaines adresses IP
Require ip 0.0.0.1 0.0.0.2
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Require all denied
ErrorLog ${APACHE_LOG_DIR}/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined
Alias /doc/ "/usr/share/doc/"
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Require ip 127.0.0.0/255.0.0.0 ::1/128
# enable HTTP/2, if available
Protocols h2 http/1.1
# SSL Engine Switch:
# Enable/Disable SSL for this virtual host.
SSLEngine on
# The CRIME attack uses SSL Compression, we need to disable that
SSLCompression off
SSLProtocol +TLSv1.3 -TLSv1.2 -TLSv1.1 -TLSv1 -SSLv3 -SSLv2
SSLCipherSuite TLSv1.3 TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256
SSLHonorCipherOrder on
SSLSessionTickets off
SSLUseStapling On
# SSLStaplingCache must be exist in /etc/apache2/mods-available/ssl.conf,
# see https://itigloo.com/security/how-to-configure-ocsp-stapling-on-apache-http-server/
# SSLOpenSSLConfCmd is supported by version 2.5 and later
# SSLOpenSSLConfCmd DHParameters /etc/ssl/private/dh4096.pem
SSLCertificateFile /etc/letsencrypt/live/pma.hostname.domaine.eu/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/pma.hostname.domaine.eu/privkey.pem
Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains; preload"
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "DENY"
Header always set X-XSS-Protection "1; mode=block"
Header set Content-Security-Policy-Report-Only "default-src 'self'"
# Certificate Authority (CA):
# Set the CA certificate verification path where to find CA
# certificates for client authentication or alternatively one
# huge file containing all of them (file must be PEM encoded)
# Note: Inside SSLCACertificatePath you need hash symlinks
# to point to the certificate files. Use the provided
# Makefile to update the hash symlinks after changes.
#SSLCACertificatePath /etc/ssl/certs/
SSLCACertificateFile /etc/letsencrypt/live/pma.hostname.domaine.eu/fullchain.pem
==== Configuration ====
La configuration se fait via le fichier config.inc.php, voir [[https://docs.phpmyadmin.net/fr/latest/setup.html#manually-creating-the-file|cette page]].
Pour configurer ''$cfg['blowfish_secret']'', voir [[https://docs.phpmyadmin.net/fr/latest/config.html#cookie-authentication-options|la documentation]].
Pour générer le secret, la commande suivante peut-être utilisée ou tout autre générateur de code, 32 caractères est un minimum.
openssl rand -base64 64
==== Authentification à deux facteurs ====
Pour activer le double facteur, voir la page sur le [[https://docs.phpmyadmin.net/fr/latest/two_factor.html|double-facteur]] puis suivre les instructions de la documentation pour [[https://docs.phpmyadmin.net/fr/latest/setup.html#manual-configuration|installer les tables de stockage]].
mysqldump -u root --events --routines --triggers --lock-tables --all-databases > /srv/backups/mysqldump/MySQLDatap-`date +"%Y%m%d"`.sql
cd /var/www/pma/sql
mysql < create_tables.sql -u root
Et pour toute version de MariaDB :
mysql -u root
root@localhost [(none)]> CREATE USER 'pma'@'localhost' IDENTIFIED VIA mysql_native_password USING 'pmapass';
root@localhost [(none)]> GRANT SELECT, INSERT, UPDATE, DELETE ON ``.* TO 'pma'@'localhost';
En cas d’erreur :
root@localhost [(none)]> CREATE USER 'pma'@'localhost' ;
root@localhost [(none)]> SET PASSWORD FOR 'pma'@'localhost' = PASSWORD('00000000');
root@localhost [(none)]> GRANT SELECT, INSERT, UPDATE, DELETE ON ``.* TO 'pma'@'localhost';
==== Mise à jour ====
Ne jamais extraire une nouvelle version de phpMyAdmin par-dessus une version déjà existante. Toujours supprimer d’abord les anciens fichiers en ne conservant que la configuration.
De cette manière, vous ne laisserez pas de fichiers vieux ou périmés dans le répertoire, ce qui peut avoir de sérieuses implications de sécurité et provoquer divers dysfonctionnements, voir [[https://docs.phpmyadmin.net/fr/latest/setup.html#upgrading-from-an-older-version|https://docs.phpmyadmin.net/fr/latest/setup.html#upgrading-from-an-older-version]].
===== Configuration de la base de données =====
Pour un meilleur prompt MySQL il faut ajouter dans le fichier .profile la variable suivante :
# Display username, hostname and current database name in the mysql prompt
export MYSQL_PS1="\u@\h [\d]> "
Mais surtout il faut exécuter ces commandes pour la création de la base de données :
mysql -u root -p
CREATE DATABASE db_mail;
CREATE USER "nom_utilisateur"@"localhost";
SET PASSWORD FOR 'nom_utilisateur'@'localhost' = PASSWORD('00000000');
GRANT ALL PRIVILEGES ON db_mail.* TO 'nom_utilisateur'@'localhost' IDENTIFIED BY '00000000';
FLUSH PRIVILEGES;
use db_mail;
Pour ensuite créer les tables avec la commande :
mysql -h localhost -u root -p db_mail < db-mail.sql
Le premier tableau contiendra les domaines que nous utiliserons avec le serveur de messagerie, ensuite le concont contiendra les utilisateurs et leur mot de passe, enfin la dernière table contiendra les alias de messagerie :
USE db_mail;
CREATE TABLE `domain` (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(64) NOT NULL
) ENGINE = InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `user` (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
domain_id INT UNSIGNED NOT NULL,
`user` VARCHAR(64) NOT NULL,
password VARCHAR(128) NOT NULL,
CONSTRAINT UNIQUE_EMAIL UNIQUE (domain_id,user),
FOREIGN KEY (domain_id) REFERENCES domain(id) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE = InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `alias` (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
domain_id INT UNSIGNED NOT NULL,
source VARCHAR(64) NOT NULL,
destination VARCHAR(128) NOT NULL,
FOREIGN KEY (domain_id) REFERENCES domain(id) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE = InnoDB DEFAULT CHARSET=utf8;
Postfix doit savoir comment accéder à cette base, créons les fichiers de configuration dans le dossier ''/etc/postfix/mysql''
mkdir /etc/postfix/mysql
Pour que Postfix puisse connaître les adresses emails existantes, nous créons ''email2email.cf''
hosts = 127.0.0.1
dbname = db_mail
user = nom_utilisateur
password = xxxxxxxx
query = SELECT CONCAT(user.user, '@', domain.name) AS email FROM domain,user WHERE user.domain_id=domain.id AND CONCAT(user.user, '@', domain.name)='%s'
Et pour que Postfix puisse connaître les alias (redirections emails) ''virtual-alias-maps.cf''
hosts = 127.0.0.1
dbname = db_mail
user = nom_utilisateur
password = xxxxxxxx
query = SELECT destination FROM alias, domain WHERE alias.domain_id=domain.id AND CONCAT(alias.source, '@', domain.name)='%s'
Puis pour que Postfix puisse connaître les domaines gérés ''virtual-mailbox-domains.cf''
hosts = 127.0.0.1
dbname = db_mail
user = nom_utilisateur
password = xxxxxxxx
query = SELECT 1 FROM domain WHERE name='%s'
Enfin pour vérifier si une adresse email est bien gérée par le serveur ''virtual-mailbox-maps.cf''
hosts = 127.0.0.1
dbname = db_mail
user = nom_utilisateur
password = xxxxxxxx
query = SELECT 1 FROM user,domain WHERE user.domain_id=domain.id AND CONCAT(user.user, '@', domain.name)='%s'
Notons que nous ne pouvons pas utiliser "localhost", car Postfix tourne dans un contexte restreint, il n'a pas le droit d'accéder au socket mysql. Le fait de forcer l'hôte à 127.0.0.1 impôse à Postfix de passer par une connexion TCP. Ensuite assurons-nous que root et postfix soient les seuls à pouvoir accéder à ces fichiers de configuration (ils contiennent des identifiants pour MySQL) :
chgrp -R postfix /etc/postfix/mysql
chmod 750 /etc/postfix/mysql
chmod 640 /etc/postfix/mysql/*.cf
==== Domaines, utilisateurs et alias ====
Avec phpMyAdmin, nous nous connectons à la base de données du serveur de courrier ''db_mail'' avec notre compte ''postmaster'', puis nous créons notre domaine dans la table ''domaine'' (s’il n'existe pas), ensuite dans la table ''user'' nous ajoutons un utilisateur en indiquant l’identifiant du domaine et le hash de son mot de passe. Pour obtenir le hash, nous utiliserons la commande :
doveadm pw -s SHA512-CRYPT
Il faut utiliser le retour de cette commande sans la partie ''{SHA512-CRYPT}'', à partir de ''$6$''.
La commande ''postmap'' permet de vérifier le fonctionnement :
postmap -q domaine.eu mysql:/etc/postfix/mysql/virtual-mailbox-domains.cf
postmap -q example@domaine.eu mysql:/etc/postfix/mysql/virtual-mailbox-maps.cf
postmap -q alias@domaine.eu mysql:/etc/postfix/mysql/virtual-alias-maps.cf
===== Configuration de Postfix =====
Faisons une sauvegarde des fichiers d’origine.
cp /etc/postfix/main.cf /etc/postfix/main.cf.original.bak
cp /etc/postfix/master.cf /etc/postfix/master.cf.original.bak
==== Création d’un utilisateur et d’un groupe ====
groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /var/mail -m -s /bin/false
==== Création d’un certificat avec Let’s Encrypt ====
Configurons Postfix pour utiliser TLS avec un certificat Let’s Encrypt :
apt install python3-pip python3-dnslib
pip3 install certbot-dns-standalone
systemctl stop postfix
certbot --non-interactive --agree-tos --email webmaster@domaine.eu certonly \
--preferred-challenges dns --authenticator certbot-dns-standalone:dns-standalone \
--certbot-dns-standalone:dns-standalone-address=0.0.0.0 \
--certbot-dns-standalone:dns-standalone-ipv6-address=:: \
--certbot-dns-standalone:dns-standalone-port=53 \
-d mail.domaine.eu --email webmaster@domaine.eu --rsa-key-size 4096
systemctl start postfix
Pour comprendre cette commande, vous pouvez regarder la [[https://certbot.eff.org/docs/using.html#standalone|documentation de Cerbot]].
Les fichiers générés se trouvent dans le répertoire ''/etc/letsencrypt/live/mail.domaine.eu/''.
==== Création des fichiers pour les paramètres DH (Diffie-Helmann) ====
Ces fichiers s’utilisent dans les paramètres DH (Diffie-Helmann) que le serveur SMTP doit utiliser avec le chiffrement EDH. Ces paramêtres sont [[https://postfix.traduc.org/index.php/postconf.5.html#smtpd_tls_dh1024_param_file|smtpd_tls_dh1024_param_file]] et smtpd_tls_dh1024_param_file, ils se trouvent dans le fichier main.cd de Postfix.
Il est possible de générer des paramètres avec des valeurs supérieures à celles par défaut afin d’améliorer la sécurité contre les attaques et pour assurer la compatibilité avec les clients SMTP Exim sous Debian qui nécessitent une longueur de ≥ 2048 bits.
openssl dhparam -outform PEM -out dh2048.pem -rand /dev/urandom 2048
openssl dhparam -outform PEM -out dh512.pem -rand /dev/urandom 512
Attention, les serveurs possèdent souvent une entropie faible, il est préférable de générer ces fichiers sur une machine en possédant.
Il faut ensuite donner des droits d'accés faibles à ces fichiers.
chmod 644 dh512.pem dh2048.pem
==== Configuration du fichier master.cf ====
Dans le fichier ''master.cf'', il faut décommenter la ligne de ''smtps'' et vérifier la présence des options suivantes :
# ==========================================================================
# service type private unpriv chroot wakeup maxproc command + args
# (yes) (yes) (no) (never) (100)
# ==========================================================================
smtp inet n - y - - smtpd
#smtp inet n - y - 1 postscreen
#smtpd pass - - y - - smtpd
#dnsblog unix - - y - 0 dnsblog
#tlsproxy unix - - y - 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_tls_auth_only=yes
# -o smtpd_reject_unlisted_recipient=no
# -o smtpd_client_restrictions=$mua_client_restrictions
# -o smtpd_helo_restrictions=$mua_helo_restrictions
# -o smtpd_sender_restrictions=$mua_sender_restrictions
# -o smtpd_recipient_restrictions=
# -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
# -o milter_macro_daemon_name=ORIGINATING
smtps inet n - y - - smtpd
-o syslog_name=postfix/smtps
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
# -o smtpd_reject_unlisted_recipient=no
# -o smtpd_client_restrictions=$mua_client_restrictions
# -o smtpd_helo_restrictions=$mua_helo_restrictions
# -o smtpd_sender_restrictions=$mua_sender_restrictions
# -o smtpd_recipient_restrictions=
# -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
# -o milter_macro_daemon_name=ORIGINATING
puis ajouter ces lignes à la fin de ce fichier afin de permettre à Postfix de communiquer avec Dovecot :
dovecot unix - n n - - pipe
flags=DRhu user=vmail:vmail argv=/usr/bin/sudo /usr/lib/dovecot/deliver -d ${recipient}
Pour fonctionner, ces éléments doivent exécuter des commandes avec les droits ''root'', mais comme pour des raisons de sécurité ils ne doivent pas connaître le mot de passe de ce super-utilisateur nous créons le fichier ''/etc/sudoers.d/mail''. Si le dossier n’existe pas il faudra installer ''sudo''.
apt install sudo
vi /etc/sudoers.d/mail
Defaults:postfix !syslog
postfix ALL=NOPASSWD:/usr/lib/dovecot/deliver
Defaults:clamav !syslog
clamav ALL=NOPASSWD:/usr/lib/dovecot/deliver
Defaults:dovecot !syslog
dovecot ALL=NOPASSWD:/usr/lib/dovecot/deliver
Defaults:dspam !syslog
dspam ALL=NOPASSWD:/usr/lib/dovecot/deliver
Defaults:vmail !syslog
vmail ALL=NOPASSWD:/usr/lib/dovecot/deliver
Nous devons appliquer des droits à ce fichier :
chmod 0440 /etc/sudoers.d/mail
==== Configuration main.cf ====
Le fichier ''main.cf'' de configuration Postfix doit contenir ces valeurs :
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
config_directory = /etc/postfix
disable_vrfy_command = yes
smtpd_helo_required = yes
queue_directory = /var/spool/postfix
# 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
# See http://www.postfix.org/COMPATIBILITY_README.html -- default to 2 on
# fresh installs.
compatibility_level = 2
# TLS parameters
smtpd_use_tls=yes
smtpd_tls_auth_only = yes
smtpd_tls_cert_file=/etc/letsencrypt/live/mail.streetdispatch.org/fullchain.pem
smtpd_tls_key_file=/etc/letsencrypt/live/mail.streetdispatch.org/privkey.pem
smtpd_tls_CAfile=/etc/letsencrypt/live/mail.streetdispatch.org/chain.pem
smtpd_tls_CApath=/etc/ssl/certs
smtpd_tls_mandatory_protocols=!SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtpd_tls_mandatory_exclude_ciphers = eNULL, aNULL, LOW, EXP, MEDIUM, ADH, AECDH, MD5, DSS, ECDSA, CAMELLIA128, CAMELLIA256, 3DES
smtpd_tls_mandatory_ciphers=high
smtpd_tls_protocols=!SSLv2,!SSLv3, !TLSv1, !TLSv1.1
smtpd_tls_exclude_ciphers = eNULL, aNULL, LOW, EXP, MEDIUM, ADH, AECDH, MD5, DSS, ECDSA, CAMELLIA128, CAMELLIA256, 3DES
smtpd_tls_ciphers = high
smtpd_tls_security_level = may
smtpd_tls_dh1024_param_file = /etc/postfix/dh_4096.pem
smtpd_tls_dh512_param_file = /etc/postfix/dh_4096.pem
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtpd_tls_eecdh_grade = ultra
tls_eecdh_strong_curve = prime256v1
tls_eecdh_ultra_curve = secp384r1
tls_high_cipherlist=EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!MEDIUM:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA
tls_ssl_options = no_ticket, no_compression, no_renegotiation
tls_preempt_cipherlist = yes
tls_random_source = dev:/dev/urandom
smtpd_data_restrictions = reject_unauth_pipelining, permit
smtpd_helo_required = yes
smtp_use_tls = yes
smtp_tls_cert_file=$smtpd_tls_cert_file
smtp_tls_key_file=$smtpd_tls_key_file
smtp_tls_CAfile=$smtpd_tls_CAfile
smtp_tls_CApath=/etc/ssl/certs
smtp_tls_mandatory_protocols=!SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtp_tls_mandatory_exclude_ciphers = MD5, SRP, PSK, aDSS, kECDH, kDH, SEED, IDEA, RC2, RC5, RC4
smtp_tls_mandatory_ciphers = high
smtp_tls_protocols=!SSLv2,!SSLv3, !TLSv1, !TLSv1.1
smtp_tls_exclude_ciphers = MD5, SRP, PSK, aDSS, kECDH, kDH, SEED, IDEA, RC2, RC5, RC4
smtp_tls_ciphers = high
smtp_tls_security_level = may
smtp_tls_loglevel = 1
smtp_tls_note_starttls_offer = yes
smtp_tls_session_cache_timeout = 3600s
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.
smtpd_milters =
non_smtpd_milters = $smtpd_milters
milter_protocol = 6
milter_default_action = accept
smtpd_recipient_restrictions =
reject_rbl_client xbl.spamhaus.org,
reject_rbl_client pbl.spamhaus.org,
reject_rbl_client sbl.spamhaus.org,
reject_rbl_client multi.uribl.com,
reject_rbl_client rbl-plus.mail-abuse.org,
reject_rbl_client dialups.mail-abuse.org,
reject_invalid_hostname,
reject_non_fqdn_hostname,
reject_non_fqdn_sender,
reject_non_fqdn_recipient,
reject_unknown_sender_domain,
reject_unknown_recipient_domain,
permit_mynetworks,
permit_sasl_authenticated,
permit_auth_destination,
reject_unauth_destination,
reject_unverified_recipient,
permit
smtpd_relay_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
defer_unauth_destination
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_security_options = noanonymous
smtpd_sasl_tls_security_options = $smtpd_sasl_security_options
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
broken_sasl_auth_clients = yes
#limit incoming or receiving email rate
smtpd_error_sleep_time = 1s
smtpd_soft_error_limit = 10
smtpd_hard_error_limit = 20
myhostname = host.domaine.eu
mydomain = domaine.eu
#myorigin = /etc/mailname
myorigin = $mydomain
mydestination = $myhostname, localhost.$mydomain, mail.$mydomain, lists.$mydomain, host, localhost
mynetworks = 127.0.0.0/8 [:: ffff:127.0.0.0]/104 [::1]/128
relayhost =
relay_domains = lists.domaine.eu
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mailbox_size_limit = 51200000
message_size_limit = 25600000
recipient_delimiter = +
inet_interfaces = all
inet_protocols = ipv4
maximal_queue_lifetime = 3d
bounce_queue_lifetime = 3d
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
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/email2email.cf
virtual_transport = dovecot
dovecot_destination_recipient_limit = 1
La variable ''myhostname'' doit être définie avec un nom de domaine pleinement qualifié FQDN et le fichier ''/etc/mailname'' doit avoir cette même valeur.
==== Relancer Postfix ====
systemctl restart postfix
==== Tester la sécurité des échanges ====
Pour tester la sécurité de Postfix, il est possible de vérifier avec des outils comme [[https://starttls.info/|starttls.info]]
Attention désactiver certains ciphers risquent de provoquer des fallbacks et le passage en clair des données : [[http://postfix.1071664.n5.nabble.com/Disabling-Anonymous-Diffie-Hellman-td67965.html|Disabling Anonymous Diffie Hellman ]]
===== Configuration de Dovecot =====
==== Configuration principale ====
Depuis la mise à jour vers la version 2.3 plusieurs paramètres sont devenus obsolètes, voir [[https://wiki2.dovecot.org/Upgrading/2.3|Upgrading Dovecot v2.2 to v2.3]]
Par défaut sous Debian, Dovecot utilise plusieurs fichiers de configuration dans ''/etc/dovecot/conf.d''.
Sauvegardons les fichiers d’origine :
cp /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.original.bak
cp /etc/dovecot/conf.d/10-mail.conf /etc/dovecot/conf.d/10-mail.conf.original.bak
cp /etc/dovecot/conf.d/10-auth.conf /etc/dovecot/conf.d/10-auth.conf.original.bak
cp /etc/dovecot/dovecot-sql.conf.ext /etc/dovecot/dovecot-sql.conf.ext.original.bak
cp /etc/dovecot/conf.d/10-master.conf /etc/dovecot/conf.d/10-master.conf.original.bak
cp /etc/dovecot/conf.d/10-ssl.conf /etc/dovecot/conf.d/10-ssl.conf.original.bak
cp /etc/dovecot/conf.d/10-logging.conf /etc/dovecot/conf.d/10-logging.conf.original.bak
cp /etc/dovecot/conf.d/15-mailboxes.conf /etc/dovecot/conf.d/15-mailboxes.conf.original.bak
cp /etc/dovecot/conf.d/15-lda.conf /etc/dovecot/conf.d/15-lda.conf.original.bak
cp /etc/dovecot/conf.d/20-imap.conf /etc/dovecot/conf.d/20-imap.conf.original.bak
cp /etc/dovecot/conf.d/20-lmtp.conf /etc/dovecot/conf.d/20-lmtp.conf.original.bak
cp /etc/dovecot/conf.d/90-sieve.conf /etc/dovecot/conf.d/90-sieve.conf.original.bak
cp /etc/dovecot/conf.d/auth-static.conf.ext /etc/dovecot/conf.d/auth-static.conf.ext.original.bak
cp /etc/dovecot/conf.d/auth-sql.conf.ext /etc/dovecot/conf.d/auth-sql.conf.ext.original.bak
Éditons le fichier :
vi /etc/dovecot/dovecot.conf
et vérifions que cette ligne soit bien décommenter :
!include conf.d/*.conf
ainsi que pour cette ligne :
!include_try /usr/share/dovecot/protocols.d/*.protocol
puis nous paramétrons les fichiers suivant du répertoire ''/etc/dovecot/conf.d'' :
mail_home = /var/mail/%d/%n
mail_location = maildir:/var/mail/%d/%n
mail_privileged_group = vmail
mail_plugin_dir = /usr/lib/dovecot/modules
mail_plugins =
disable_plaintext_auth = yes
auth_mechanisms = plain login
#!include auth-deny.conf.ext
#!include auth-master.conf.ext
#!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-vpopmail.conf.ext
!include auth-static.conf.ext
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 = 0
}
}
service auth {
unix_listener auth-userdb {
mode = 0600
user = vmail
}
# Postfix smtp-auth
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
# Auth process is run as this user.
user = $default_internal_user
}
service imap {
}
service pop3 {
}
Dovecot utilisera les mêmes certificats que Postfix
ssl = required
ssl_cert =
Pour générer le fichier du paramètre [[wpfr>Diffie-Hellman]] j'ai utilisé, sur un ordinateur avec une forte entropie, la commande suivante :
openssl dhparam -outform PEM -out dh4096.pem -rand /dev/urandom 4096
log_path = syslog
syslog_facility = mail
auth_verbose = yes
namespace inbox {
inbox = yes
type = private
mailbox Drafts {
auto = subscribe
special_use = \Drafts
}
mailbox Junk {
auto = subscribe
special_use = \Junk
}
mailbox Sent {
auto = subscribe
special_use = \Sent
}
mailbox Trash {
auto = subscribe
special_use = \Trash
}
}
postmaster_address =postmaster@domaine.eu
protocol lmtp {
postmaster_address = postmaster@domaine.eu
mail_plugins = $mail_plugins sieve
auth_socket_path = /var/run/dovecot/auth-master
}
plugin {
sieve = /var/mail/sieve/users/%u.sieve
sieve_after = /var/mail/sieve/after
sieve_before = /var/mail/sieve/before
# After Dovecot v2.3 these settings are deprecated in newer versions
# https://wiki2.dovecot.org/Pigeonhole/Sieve/Configuration
# sieve_global_dir = /var/lib/dovecot/sieve/
# sieve_dir = ~/sieve
# use sieve_global instead sieve_global_dir
# sieve_global = /var/lib/dovecot/sieve/
}
userdb {
driver = static
args = uid=5000 gid=5000 home=/home/vmail/%d/%n allow_all_users=yes
}
Avec cette configuration, les utilisateurs virtuels utiliseront le répertoire ''/var/mail/$domain/$user/'' et l'utilisateur ''vmail'' sera le propriétaire. Pour que cela fonctionne, il faudra créer les dossiers des domaines hébergés, mais Dovecot créera ceux des utilisateurs virtuels.
mkdir -p /var/mail/domaine.eu
chown vmail:vmail /var/mail/domaine.eu && chmod 770 /var/mail/domaine.eu
=== Paramètre MySQL pour Dovecot ===
Les paramètres de connexion à la base de données se configure dans ''dovecot-sql.conf.ext'' :
driver = mysql
connect = host=127.0.0.1 dbname=db_mail user=postmaster password=xxxxxxxx
default_pass_scheme = SHA512-CRYPT
user_query = SELECT ('5000') as 'uid',('5000') as 'gid'
password_query = SELECT CONCAT(user.user, '@', domain.name) AS user,user.password FROM user,domain WHERE user.domain_id=domain.id AND CONCAT(user.user, '@', domain.name)='%u'
Pour protéger le fichier :
chown root:root /etc/dovecot/dovecot-sql.conf.ext && chmod 400 /etc/dovecot/dovecot-sql.conf.ext
==== Configuration de Sieve ====
Création des dossiers nécessaires au fonctionnement :
mkdir -p /var/mail/sieve/before
mkdir /var/mail/sieve/after
mkdir /var/mail/sieve/users
chown -R vmail:vmail /var/mail/sieve && chmod -R 770 /var/mail/sieve
Si vous voulez avoir des règles spécifiques pour un utilisateur, il faut créer un fichier $user@$domain.sieve dans le dossier de l'utilisateur (example@domaine.eu dans notre cas).
Tous les fichiers .sieve dans le dossier ''before'' seront utilisés pour tous les utilisateurs virtuels et avant leur configuration individuelle, par contre les fichiers ''.sieve'' dans le dossier ''after'' seront utilisées après.
Créons un fichier ''spam.sieve'' dans le répertoire ''/var/mail/sieve/before'' avec le contenu suivant qui déplacera tous les messages avec drapeau SPAM dans le dossier Junk :
vi /var/mail/sieve/before/spam.sieve
require ["envelope", "fileinto", "imap4flags", "regex"];
if not header :regex "message-id" ".*@.*\." {
fileinto "Junk";
}
if header :contains "X-Spam-Level" "*****" {
fileinto "Junk";
}
puis changeons les permissions sur ce fichier :
chown vmail:vmail /var/mail/sieve/before/spam.sieve && chmod 660 /var/mail/sieve/before/spam.sieve
==== Lancement du service ====
Nous pouvons maintenant lancer ce service avec la commande
systemctl restart dovecot
mais avant il est préférable de lancer dans un autre terminal l'affichage des logs pour voir les éventuelles erreurs de configuration.
tail -f /var/log/syslog
==== Tester la configuration ====
En gardant un œil ouvert sur ''syslog'' nous effectuons quelques tests
echo "test" | mail -s "Test" root@domaine.eu
Si tout est bien configuré, un email arrive dans la boite et aucune apparaît dans les logs.
Maintenant ouvrons avec Telnet une connexion sur notre serveur SMTP et essayons d'envoyer un courrier sur une adresse qui n'est pas de notre réseau et donc le domaine n'est pas indiqué en paramètre de la variable ''mydestination'' du fichier de configuration de Postfix ''/etc/postfix/main.cf'' afin de voir si le serveur refuse bien de relayer le courrier comme il doit le faire (**rien de pire qu'un SMTP ouvert**) pour les domaines non autorisés.
telnet host.domaine.eu 25
Trying xxx.xxx.xxx.xxx...
Connected to host.domaine.eu.
Escape character is '^]'.
220 domaine.eu ESMTP Postfix (Debian/GNU)
EHLO gmail.com
250-domaine.eu
250-PIPELINING
250-SIZE 20480000
250-VRFY
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
MAIL FROM:
250 2.1.0 Ok
RCPT TO:
554 5.7.1 : Relay access denied
Essayons maintenant d'envoyer un courrier depuis une de nos adresses configurées sur le serveur vers un domaine non configuré dans Postfix. Nous devons obtenir un refus puisque la configuration autorise l'envoi de courrier que depuis des utilisateurs authentifiés.
telnet host.domaine.eu 25
Trying xxx.xxx.xxx.xxx...
Connected to host.domaine.eu.
Escape character is '^]'.
220 domaine.eu ESMTP Postfix (Debian/GNU)
EHLO domaine.eu
250-domaine.eu
250-PIPELINING
250-SIZE 20480000
250-VRFY
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
MAIL FROM:
250 2.1.0 Ok
RCPT TO:
554 5.7.1 : Relay access denied
Et pour les couches sécurisées, elles peuvent être testées avec ces commandes :
openssl s_client -servername mail.domaine.eu -connect mail.domaine.eu:smtps
openssl s_client -servername mail.domaine.eu -connect mail.domaine.eu:imaps
===== Configuration de Postgrey =====
Après l’installation du paquet, nous devons éditer le fichier de configuration ''/etc/postfix/main.cf'' afin de modifier la variable ''smtpd_recipient_restrictions''.
smtpd_recipient_restrictions =
reject_rbl_client xbl.spamhaus.org,
reject_rbl_client pbl.spamhaus.org,
reject_rbl_client sbl.spamhaus.org,
reject_rbl_client multi.uribl.com,
reject_rbl_client rbl-plus.mail-abuse.org,
reject_rbl_client dialups.mail-abuse.org,
reject_invalid_hostname,
reject_non_fqdn_hostname,
reject_non_fqdn_sender,
reject_non_fqdn_recipient,
reject_unknown_sender_domain,
reject_unknown_recipient_domain,
permit_mynetworks,
permit_sasl_authenticated,
permit_auth_destination,
reject_unauth_destination,
reject_unverified_recipient,
check_policy_service inet:127.0.0.1:10023,
permit
Puis il faut relancer Postfix en surveillant les logs :
systemctl restart postfix
===== Configuration de Clamav =====
Ce sera Amavis-new qui fera le pont entre Postfix et Clamav. Le fichier de configuration ''/etc/amavis/conf.d/15-av_scanners'' d’Amavis permet d’utiliser d'autres programmes anti-virus.
La configuration par défaut de [[https://www.clamav.net/|ClamAV]] nous conviendra ; son fichier est ''/etc/clamav'', vous y trouverez plus d’options.
Il faut ajouter l’utilisateur ''clamav'' au groupe ''amavis'' afin qu’Amavisd-new ait des droits sur les fichiers de ClamAV et inversement :
adduser clamav amavis
adduser amavis clamav
===== Configuration d’Amavis-new =====
Amavis servira pour le passage des messages entrants à des filtres comme Clamav et Spamassassin.
Il faut ajouter les sections suivantes dans le fichier de configuration /etc/postfix/master.cf :
amavis unix - - - - 2 smtp
-o smtp_data_done_timeout=1200
-o smtp_send_xforward_command=yes
-o disable_dns_lookups=yes
-o max_use=20
127.0.0.1:10025 inet n - - - - smtpd
-o content_filter=
-o local_recipient_maps=
-o relay_recipient_maps=
-o smtpd_restriction_classes=
-o smtpd_delay_reject=no
-o smtpd_client_restrictions=permit_mynetworks,reject
-o smtpd_helo_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o smtpd_data_restrictions=reject_unauth_pipelining
-o smtpd_end_of_data_restrictions=
-o mynetworks=127.0.0.0/8
-o smtpd_error_sleep_time=0
-o smtpd_soft_error_limit=1001
-o smtpd_hard_error_limit=1000
-o smtpd_client_connection_count_limit=0
-o smtpd_client_connection_rate_limit=0
-o receive_override_options=no_header_body_checks,no_unknown_recipient_checks
Ces deux paragraphes permettront la création des points d’accrochage entre le module smtpd de Postfix et le daemon amavisd.
Les options ''-o'' indiquées surchargeront éventuellement celles qui seraient données dans ''main.cf'' pour les services en question, c'est à dire d'une part smtp-amavis et d'autre part le service smtpd attaché à amavis sur le port 10025.
Ajoutez aussi les deux lignes suivantes immédiatement en dessous du service de transport "pickup" :
pickup unix n - y 60 1 pickup
-o content_filter=
-o receive_override_options=no_header_body_checks
Ceci empêchera la classification en tant que pourriel des messages de rapport de pourriels.
De plus, il faut modifier le fichier main.cf pour indiquer à Postfix que smtpd doit se connecter à Amavis, mais il y a juste une ligne à ajouter :
content_filter=smtp-amavis:[127.0.0.1]:10024
Les fichiers de configuration d’Amavis sont dans le répertoire ''/etc/amavis/conf.d''.
Pour activer la détection de spam et de virus; il faut ensuite décommenter les lignes utiles dans le fichier ''/etc/amavis/conf.d/15-content_filter_mode'' :
use strict;
# You can modify this file to re-enable SPAM checking through spamassassin
# and to re-enable antivirus checking.
#
# Default antivirus checking mode
# Please note, that anti-virus checking is DISABLED by
# default.
# If You wish to enable it, please uncomment the following lines:
#@bypass_virus_checks_maps = (
# \%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);
#
# Default SPAM checking mode
# Please note, that anti-spam checking is DISABLED by
# default.
# If You wish to enable it, please uncomment the following lines:
#@bypass_spam_checks_maps = (
# \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);
1; # ensure a defined return
Cependant, il est préférable de copier ces lignes dans le fichier ''50-user'' comme pour toutes modifications des variables de la configuration.
Le fichier ''/etc/amavis/conf.d/20-debian_defaults'' a son importance, car il contient bon nombre de paramètres de configuration d' Amavis. Dans les grandes lignes, mieux vaut garder cette configuration, sauf que :
* si vous désirez que les tags posés par spamassassin soient systématiquement ajoutés dans les en-têtes de messages, ça n'ira pas ;
* si vous voulez que les spams ne soient jamais éliminés, mais simplement marqués comme tels, ça n'ira pas non plus ;
* si par la suite, vous souhaitez, comme nous le ferons dans le chapitre suivant, utiliser des domaines « virtuels » vos tags risquent de ne jamais apparaître.
En effet, Amavisd-new ne retranscrit les tags de spamassassin que pour les messages à destination des domaines référencés dans la variable (liste) ''@local_domains_acl''.
De plus, la variable ''$sa_kill_level_deflt'' définit le score à partir duquel nous sommes surs qu'un message est un spam, et la variable ''$final_spam_destiny'' indique quoi faire de ce message dans ce cas.
Dans la configuration par défaut, vous constaterez que si un message obtient un score >= 100, il est « D_BOUNCE » ce qui veut dire qu'il est mis en quarantaine locale et que le destinataire ne reçoit rien. Certes, un score de 100 est assez significatif, mais tout de même, peut-être souhaiterez-vous vous montrer plus libéral.
En cas de refus de tags de la part d'Amavis, de vérifier que le problème ne vient pas de la variable ''@local_domains_acl''. Passer celle-ci avec la valeur ''@local_domains_acl = ( "." );'' permet d’effectuer le marquage des tags anti-spam quel que soit le domaine de destination.
Enfin, les variables ''$sa_tag_level_deflt'' et ''$sa_tag2_level_deflt'' influent sur le marquage du message, de même que la variable ''$sa_spam_subject_tag'' a un effet direct sur l’esthétique du message délivré.
Voilà à quoi pourrait ressembler le fichier ''/etc/amavis/conf.d/50-user'' :
use strict;
#
# Place your configuration directives here. They will override those in
# earlier files.
#
# See /usr/share/doc/amavisd-new/ for documentation and examples of
# the directives you can use in this file
#
@local_domains_acl = ( "." );
@bypass_virus_checks_maps = (
\%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);
@bypass_spam_checks_maps = (
\%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);
$sa_tag_level_deflt = -9999; # note minimale pour ajouter les tags X-Spam... à l'en-tête des emails
# ici, nous sommes à peu près surs que le tag sera toujours présent
$sa_tag2_level_deflt = 5.0; # note minimale pour ajouter le tag X-Spam-Flag: YES
# et modifier l'objet
$sa_kill_level_deflt = 100; # note à partir de laquelle les mails sont traités comme définis
# par la variable $final_spam_destiny (ici ils sont acceptés)
$sa_spam_subject_tag = '[SPAM]'; # chaine ajoutée à l'objet de l'email
$final_spam_destiny = D_PASS;
# Pour ne pas en dire trop sur les armes employées
$X_HEADER_LINE = "spam & virus filtering at $mydomain";
#------------ Do not modify anything below this line -------------
1; # ensure a defined return
==== Vérifier la configuration ====
Pour cela, il faut commencer par relancer les services en observant les logs afin de trouver les éventuelles erreurs :
systemctl restart postfix
systemctl restart amavis
Et de vérifier que les programmes Postfix et Amaivs soit bien à l'écoute :
netstat -tap | grep LISTEN
tcp 0 0 0.0.0.0:submissions 0.0.0.0:* LISTEN 27299/master
tcp 0 0 0.0.0.0:smtp 0.0.0.0:* LISTEN 27299/master
tcp 0 0 0.0.0.0:imaps 0.0.0.0:* LISTEN 597/dovecot
tcp 0 0 localhost:10023 0.0.0.0:* LISTEN 13838/postgrey --pi
tcp 0 0 localhost:10024 0.0.0.0:* LISTEN 28665/amavisd-new (
tcp 0 0 localhost:10025 0.0.0.0:* LISTEN 27299/master
==== Installation des paquets suggérés ====
Afin de lire certains formats de fichiers, Amavis suggère l'installation de paquets supplémentaires.
apt install arj cabextract cpio lhasa lzop nomarch p7zip rpm unrar-free unzip zip
===== Configuration de Spamassasin =====
==== Les alternatives ====
* DSPAM n’est plus maintenu et le paquet est enlevé des dépôts depuis Debian Jessie ;
* [[https://rspamd.com/|Rspamd]] est un projet intéressant ;
* [[https://bogofilter.sourceforge.io/|Bogofilter]] est un filtre antispam efficace, comme alternative ou comme complément à [[https://spamassassin.apache.org/|Spamassassin]].
==== Paquets facultatifs ====
Il existe des paquets facultatifs qui s’intègrent avec Spamassassin pour une meilleure détection des spams :
apt install pyzor razor
Puis :
user@host:~# su - amavis -s /bin/bash
$ razor-admin -create
$ razor-admin -register
==== Activation du service ====
Dans le fichier de configuration est ''/etc/default/spamassassin'' :
CRON=1
puis :
systemctl start spamassassin
==== Configuration ====
Sauvegardons le fichier original de la configuration ''local.cf'' avant de modifier les paramètres :
cp /etc/spamassassin/local.cf /etc/spamassassin/local.cf.original.bak
rewrite_header Subject [SPAM]
report_safe 1
required_score 5.0
use_bayes 1
bayes_auto_learn 1
Nous pouvons redémarrer les services SpamAssassin et Postfix :
systemctl restart postfix
systemctl restart amavis
systemctl restart spamassassin
==== Vérifier le fonctionnement ====
Pour vérifier si cela fonctionne, envoyez-vous un e-mail d’un autre fournisseur et vous devriez voir des en-têtes plus ou moins semblables aux suivantes :
X-Virus-Scanned: Debian amavisd-new at host.domaine.eu
X-Spam-Flag: NO
X-Spam-Score: 0.001
X-Spam-Level:
X-Spam-Status: No, score=0.001 tagged_above=-9999 required=5
tests=[HTML_MESSAGE=0.001] autolearn=ham autolearn_force=no
===== Configurer SPF =====
==== Permettre à votre serveur d’envoyer pour votre domaine ====
SPF (Sender Policy Framework) est un mécanisme qui confirme que l’IP de votre serveur est autorisé à envoyer des e-mails pour votre domaine. Techniquement, il est un enregistrement DNS TXT qui ressemble à ceci :
domaine.eu. IN TXT "v=spf1 mx ip4:0.0.0.1 ~all"
Cet enregistrement DNS permet aux autres serveurs de messagerie de savoir que les serveurs qui possèdent un enregistrement MX pour mon domaine sont également autorisés à envoyer des e-mails. Pour plus d’informations sur la syntaxe SPF, vous pouvez consulter la [[http://www.open-spf.org/SPF_Record_Syntax/|documentation officielle]].
Sans un enregistrement SPF correctement configuré, les autres serveurs de messagerie pourraient considérer vos courriers comme un SPAM ou carrément les laisser tomber.
==== SPF Record pour les courriers entrants ====
Maintenant que nous avons mis en place notre propre enregistrement SPF, nous allons configurer Postfix pour vérifier que d’autres serveurs de messagerie puissent communiquer avec nous comme nous avons fait.
Avant tout, nous allons ajouter les deux lignes suivantes à la fin de ''/etc/postfix-policyd-spf-python/policyd-spf.conf'' :
Header_Type = AR
Authserv_Id = hostname.domaine.eu
Pour connaître les différentes options, il existe la commande :
man policyd-spf.conf
Puis nous éditons le fichier ''master.cf'' :
policy-spf unix - n n - - spawn
user=nobody argv=/usr/bin/policyd-spf
Ensuite nous modifions dans le fichier ''/etc/postfix/main.cf'' la section ''smtpd_recipient_restrictions'' pour ajouter la ligne de ''check_policy_service'' comme nous le voyons ci-dessous ainsi qu’un paramètre ''policy-spf_time_limit'' :
smtpd_recipient_restrictions =
reject_rbl_client xbl.spamhaus.org,
reject_rbl_client pbl.spamhaus.org,
reject_rbl_client sbl.spamhaus.org,
reject_rbl_client multi.uribl.com,
reject_rbl_client rbl-plus.mail-abuse.org,
reject_rbl_client dialups.mail-abuse.org,
reject_invalid_hostname,
reject_non_fqdn_hostname,
reject_non_fqdn_sender,
reject_non_fqdn_recipient,
reject_unknown_sender_domain,
reject_unknown_recipient_domain,
permit_mynetworks,
permit_sasl_authenticated,
permit_auth_destination,
reject_unauth_destination,
reject_unverified_recipient,
check_policy_service unix:private/policy-spf,
check_policy_service inet:127.0.0.1:10023,
permit
policy-spf_time_limit = 3600s
Placez le service de politique après ''reject_unauth_destination'' afin d’éviter que des réponses inattendues du service de politique ne fassent de votre système un relais ouvert (ceci est recommandé pour tous les services de politique). En outre, placez le service de politique après avoir autorisé les expéditeurs locaux. Vous souhaitez que le SPF ne vérifie que le courrier entrant provenant d’Internet, et non le courrier sortant de vos utilisateurs.
Nous pouvons maintenant relancer le service :
systemctl restart postfix
Notre serveur peut maintenant vérifier les enregistrements SPF d’un autre serveur de messagerie. Pour vous assurer que cela fonctionne, envoyez-vous un e-mail depuis un autre fournisseur et vous devriez voir l’en-tête suivant :
Authentication-Results: myserver.domaine.eu; spf=pass (sender SPF authorized)
[...] receiver=example@domaine.eu)
===== OpenDKIM =====
[[http://www.dkim.org/|DKIM]] (DomainKeys Identified Mail) est un mécanisme qui valide l'identité du nom de domaine d'un email par une authentification cryptographique. Bien que non obligatoire, la mise en place DKIM améliore les chances que les courriers envoyés à partir de votre serveur ne sont pas marqués comme SPAM par d'autres fournisseurs.
Avec cette configuration, OpenDKIM vérifiera également la clé pour les e-mails entrants.
==== Configuration ====
Sauvegardons le fichier original de configuration :
cp /etc/opendkim.conf /etc/opendkim.conf.original.bak
Puis nous configurons ''/etc/opendkim.conf'' :
AutoRestart Yes
AutoRestartRate 10/1h
UMask 0002
Syslog yes
SyslogSuccess Yes
LogWhy Yes
OversignHeaders From
AlwaysAddARHeader yes
Canonicalization relaxed/simple
ExternalIgnoreList refile:/etc/postfix/dkim/TrustedHosts
InternalHosts refile:/etc/postfix/dkim/TrustedHosts
KeyTable refile:/etc/postfix/dkim/KeyTable
SigningTable refile:/etc/postfix/dkim/SigningTable
Mode sv
PidFile /var/run/opendkim/opendkim.pid
SignatureAlgorithm rsa-sha256
UserID opendkim:opendkim
Socket local:/var/spool/postfix/opendkim/opendkim.sock
Puis nous devons créer les dossiers nécessaires :
mkdir -p /etc/postfix/dkim/keys/domaine.eu/
Nous créons maintenant ''/etc/postfix/dkim/TrustedHosts'', ce fichier contiendra les hôtes et les domaines pour lesquels OpenDKIM devra signer les emails :
localhost
127.0.0.1
::1
domaine.eu
Nous créons ensuite ''/etc/postfix/dkim/KeyTable'', ce fichier indiquera à OpenDKIM la clé qu'il devra utiliser pour chaque sélecteur.
mail._domainkey.domaine.eu domaine.eu:mail:/etc/postfix/dkim/keys/domaine.eu/mail.private
Et enfin le fichier ''/etc/postfix/dkim/SigningTable'', ce fichier indiquera à OpenDKIM quel sélecteur il devra utiliser pour chaque domaine.
*@domaine.eu mail._domainkey.domaine.eu
Nous générons ensuite une paire de clefs (publique/privé) pour notre domain :
cd /etc/postfix/dkim/keys/domaine.eu/
opendkim-genkey -s mail -d domaine.eu
Parmi les deux fichiers créés ''mail.private'' contient la clef privée et ''mail.txt'' contient la clef publique, changeons les permissions :
chown -R opendkim: /etc/postfix/dkim/keys
chmod -R 700 /etc/postfix/dkim/keys
chmod 400 /etc/postfix/dkim/keys/domaine.eu/*
==== Intégration Postfix ====
La dernière chose que nous avons à faire est de configurer Postfix pour qu'il puisse communiquer avec OpenDKIM.
Nous créons ce dossier
mkdir /var/spool/postfix/opendkim
chown opendkim: /var/spool/postfix/opendkim
adduser postfix opendkim
Puis nous éditons le fichier ''/etc/postfix/main.cf'' pour ajouter :
smtpd_milters = unix:/opendkim/opendkim.sock
Nous pouvons relancer ces services :
systemctl restart opendkim
systemctl restart postfix
==== Intégration DNS ====
Pour que DKIM fonctionne, nous devons configurer un enregistrement TXT DNS dans la zone du domaine. Ce record a été générée automatiquement par OpenDKIM dans le fichier mail.txt mentionné précédemment :
mail._domainkey IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCkJq0CW3tl2XHZ1CN5XdbqRDU7KfXOJ70nlwI09bHmDU63/Yz3J5rl863S0t2ncVHfIudZANj0OaiJe5HRR7WCsjuNIhQFfPFGIWLNClpxqdQVQURI38sAGeyn7Ed/Cor1AiWABzFWzel0kvXILw8K/NTzxaAPeSa9ttwQEgSmowIDAQAB" ; ----- DKIM key mail for domaine.eu
Tout ce que vous devons faire est de copier et de coller cet enregistrement dans notre fichier de zone DNS. Pour vous assurer que OpenDKIM fonctionne, vous pouvez envoyer un email vide à [[mailto:check-auth@verifier.port25.com|check-auth@verifier.port25.com]] et vous devriez recevoir une réponse avec le contenu suivant:
==========================================================
Summary of Results
==========================================================
SPF check: pass
DomainKeys check: neutral
DKIM check: pass
Sender-ID check: pass
SpamAssassin check: ham
L'utilisation de [[https://www.mail-tester.com/|mail-tester.com]] vous aidera aussi à vérifier la configuration SPF et DKIM.
===== OpenDMARC =====
[[http://dmarc.org/|DMARC]] (Domain-based Message Authentication, Reporting & Conformance) standardisation des mécanismes d'authentification SPF et DKIM. Il permet au propriétaire d'un nom de domaine d'indiquer que son email est protégée par SPF et/ou DKIM et ce que les autres fournisseurs doivent faire avec les e-mails qui ne passent pas ces contrôles.
==== Configuration ====
Sauvegardons le fichier de la configuration d'origine :
cp /etc/opendmarc.conf /etc/opendmarc.conf.original.bak
rm /etc/opendmarc.conf
gunzip /usr/share/doc/opendmarc/opendmarc.conf.sample.gz
cp /usr/share/doc/opendmarc/opendmarc.conf.sample /etc/opendmarc.conf
AutoRestart true
AutoRestartRate 10/1h
UMask 0002
Syslog true
AuthservID hostname.domaine.eu
TrustedAuthservIDs hostname.domaine.eu
IgnoreHosts /etc/postfix/dkim/TrustedHosts
RejectFailures false
UserID opendmarc:opendmarc
PidFile /var/run/opendmarc.pid
Socket local:/var/spool/postfix/opendmarc/opendmarc.sock
==== Intégration avec Postfix ====
Créons ce dossier :
mkdir /var/spool/postfix/opendmarc
chown opendmarc: /var/spool/postfix/opendmarc
adduser postfix opendmarc
Puis modifions le fichier de configuration ''/etc/postfix/main.cf'' de Postfix :
smtpd_milters = unix:/opendkim/opendkim.sock, unix:/opendmarc/opendmarc.sock
Nous pouvons en relancer ces services (toujours en regardant les logs) :
systemctl restart opendmarc
systemctl restart postfix
Pour vérifier le fonctionnement, vous devriez voir dans les en têtes de vos messages entrants :
Authentication-Results: host.domaine.eu; dmarc=pass header.from=gmail.com
==== Intégration DNS ====
DMARC, comme SPF et DKIM, est basé sur les enregistrements DNS TXT.
_dmarc IN TXT "v=DMARC1; p=none; rua=mailto:postmaster@domanaine.eu; ruf=mailto:postmaster@domanaine.eu"
Cela indique à d'autres fournisseurs de ne pas rejeter ou mettre vos emails en quarantaine en cas d'échec de la vérification FPS ou DKIM échouer mais d'envoyer un rapport quotidien de ces vérifications au postmaster@domanaine.eu.
Pour plus d'informations sur la syntaxe DMARC, voici [[https://support.google.com/a/answer/2466563?hl=fr|un article de Google]].
===== Monit =====
[[https://mmonit.com/monit/|Monit]] est un daemon qui surveille d'autres daemons et vérifie qu'ils soient lancés, en cas de crash il les redémarre automatiquement. Il n'est pas lié à un serveur de messagerie et il est assez facile à mettre en place.
Sauvegardons le fichier de la configuration d'origine :
cp /etc/monit/monitrc /etc/monit/monitrc.original.bak
Puis éditions la configuration pour adapter ces valeurs et décommenter ces paramètres, les autres valeurs par défauts et actives peuvent être laissées comme telles :
set daemon 30
set logfile syslog facility log_daemon
set httpd port 2812 and
use address localhost
allow localhost
set mailserver localhost
with timeout 30 seconds
using hostname myserver.domaine.eu
set mail-format { from: monit@domaine.eu }
set alert root@domaine.eu
include /etc/monit/conf.d/*
Puis nous créons le fichier ''/etc/monit/conf.d/mail'' avec le contenu suivant :
check process postfix
with pidfile "/var/spool/postfix/pid/master.pid"
start program = "/bin/systemctl start postfix"
stop program = "/bin/systemctl stop postfix"
alert monit@domaine.eu
group mail
check process dovecot
with pidfile "/run/dovecot/master.pid"
start program = "/bin/systemctl start dovecot"
stop program = "/bin/systemctl stop dovecot"
alert monit@domaine.eu
group mail
depends on postfix
check process spamassassin
with pidfile "/run/spamassassin.pid"
start program = "/bin/systemctl start spamassassin"
stop program = "/bin/systemctl stop spamassassin"
alert monit@domaine.eu
group mail
depends on postfix, dovecot
check process opendkim
with pidfile "/run/opendkim/opendkim.pid"
start program = "/bin/systemctl start opendkim"
stop program = "/bin/systemctl stop opendkim"
alert monit@domaine.eu
group mail
depends on postfix, dovecot
check process opendmarc
with pidfile "/run/opendmarc/opendmarc.pid"
start program = "/bin/systemctl start opendmarc"
stop program = "/bin/systemctl stop opendmarc"
alert monit@domaine.eu
group mail
depends on postfix, dovecot
Donnons de bonne permissions à ce nouveau fichier :
chown root: /etc/monit/conf.d/mail && chmod 600 /etc/monit/conf.d/mail
Nous pouvons maintenant relancer ce service :
monit reload
Avec la commande ''monit summary'' nous vérifions le fonctionnement et obtenons un rapport semblable
The Monit daemon 5.9 uptime: 0m
Process 'postfix' Running
Process 'dovecot' Running
Process 'spamassassin' Running
Process 'opendkim' Running
Process 'opendmarc' Running
===== Mailman =====
Pour gérer des listes de diffusion avec cette configuration, vous pouvez [[serveur:mailman|installer Mailman]].
===== Conclusion =====
Nous avons maintenant un serveur de messagerie correctement configuré. Il pourrait être encore amélioré par la mise en place de détection de [[https://fr.wikipedia.org/wiki/Greylisting|greylisting]] et de virus.
===== Réferences =====
Les tutoriaux et les pages d’aide qui furent utilisés pour construire cette page :
* [[https://www.captainark.net/2015/04/24/setting-up-a-mail-server/|Setting up a mail server]] de [[https://twitter.com/captainark|Captainark]]
* [[https://wiki.debian-fr.xyz/Installation_sur_une_Squeeze_d%27un_serveur_mail_complet_(Postfix_Postfixadmin_Dovecot_Mysql_Amavisd-new_Spamassassin_Clamav_Postgrey_Squirrelmail_Roundcube)_avec_gestion_des_filtres_Imap_et_des_quotas|Installation d'un serveur mail complet]]
* [[http://sealedabstract.com/code/nsa-proof-your-e-mail-in-2-hours/|NSA-proof your e-mail in 2 hours]]
* [[https://help.ubuntu.com/community/Postfix/SPF|help.ubuntu.com/Postfix/SPF]]
* [[http://lea-linux.org/documentations/DKIM_SPF_Postfix|Installation d'une politique de sécurité des emails avec OpenDKIM et SPF]]
* [[http://www.postfix.org/MILTER_README.html|Postfix before-queue Milter support]]
* [[http://www.cyberciti.biz/faq/postfix-limit-incoming-or-receiving-email-rate/|Postfix limit incoming or receiving email rate]]
* [[https://forum.kimsufi.com/showthread.php?33972-Votre-reverse-DNS-ne-correspond-pas-avec-votre-domaine-d-envoi|Kimsufi, votre reverse DNS ne correspond pas avec votre domaine d'envoi.]]
* [[https://placenet.org/2020/05/08/config-ssl-pour-postfix-gnu-linux-debian-buster/|Configuration pour avoir une bonne sécurité du SSL]]
* [[https://arnowelzel.de/en/greylisting-to-avoid-spam|Greylisting to avoid spam]]
* [[http://irp.nain-t.net/doku.php/200messagerie:020postfix2:060_amavis|Filtrer avec Amavis]]
* [[https://guide.ubuntu-fr.org/server/mail-filtering.html|Filtrage du courrier éléctronique]]