Serveur mail complet

Objectif

  • Postfix : envoi et réception des mails par le protocole SMTP. Les mails seront toujours accepté pour les domaines locaux et relayés uniquement si l'utilisateur est authentifié.
  • Dovecot : serveur POP/IMAP (on n'utilisera que IMAP) chargé de conserver et de servir les ails des domaines locaux. Egalement utilisé pour l'authentification.
  • Postgrey : service de greylistage. Permetde réduire la quantité de spam.
  • amavisd-new : Gestionnaire de services complémentaires de postfix. Utilisé pour appliquer les couches antivirus/antispam.
  • Clam AntiVirus : Antivirus.
  • SpamAssassin : Antispam.
  • Postfix Admin : interface web frontale pour administrer les utilisateurs et les comptes.
  • Rainloop : client webmail.

Note : ce document prend son inspiration dans https://www.exratione.com/2016/05/a-mailserver-on-ubuntu-16-04-postfix-dovecot-mysql/

Prérequis

  • Serveur dédié connecté à Internet
  • Adresse IP (v4 ou v6) fixe
  • Nom de domaine avec contrôle du DNS
  • Définir un nom pour le serveur et créer deux enregistrement A et PTR pour faire correspondre nom et IP de façon bijective.

Pour l'exemple, on utilisera les données suivantes :

  • Domaine : mondomaine.fr
  • Nom de serveur : srvmail.mondomaine.fr

1. Système d'exploitation

Installation de Ubuntu Server 18.04 LTS 64 bits.

Configuration

Par sécurité, pendant toute l'installation, on ne gardera que l'accès depuis la machine de travail. Pour celà, on commence par installer ufw pour paramétrer le pare-feu.

apt install ufw
ufw allow from <ici votre adresse>
ufw enable

Au final, il faudra autoriser les ports suivants :

  • 25 (SMTP)
  • 80 (HTTP) : qui redirigera systématiquement vers 443
  • 143 (IMAP)
  • 443 (HTTPS)
  • 465 (SMTPS)
  • 993 (IMAPS)

Et éventuellement : * 110 (POP3) * 995 (POP3S)

Ensuite, on fixe le nom d'hôte dans le fichier /etc/hostname :

echo "srvmail.mondomaine.fr" > /etc/hostname

Et on ajoute ce nom dans la ligne 127.0.0.1 du fichier /etc/hosts.

2. Serveur LAMP (Apache/MySQL/PHP)

Installation

Installer tous les packages nécessaire avec :

apt install lamp-server^

Note : l'ajout du ^ sélectionne tous les paquets qui sont associés à la tâche lamp-server.

Configuration de Apache

Activer les modules deflate, expires, headers, rewrite, ssl dans la config de Apache.

a2enmod deflate expires headers rewrite ssl
systemctl restart apache2

Vérifier dans /etc/apache2/conf-enabled/security.conf les valeurs de ServerTokens et ServerSignature pour renvoyer le moins d'info possible.

#
# ServerTokens
# This directive configures what you return as the Server HTTP response
# Header. The default is 'Full' which sends information about the OS-Type
# and compiled in modules.
# Set to one of:  Full | OS | Minimal | Minor | Major | Prod
# where Full conveys the most information, and Prod the least.
#
ServerTokens Prod

#
# Optionally add a line containing the server version and virtual host
# name to server-generated pages (internal error documents, FTP directory
# listings, mod_status and mod_info output etc., but not CGI generated
# documents or custom error documents).
# Set to "EMail" to also include a mailto: link to the ServerAdmin.
# Set to one of:  On | Off | EMail
#
ServerSignature Off

Installation de Let's Encrypt

Pour fournir un certificat SSL, on va utiliser le service Let's Encrypt. Il faut tout d'abord installer le client Let's Encrypt sur la machine.

add-apt-repository ppa:certbot/certbot
apt-get update
apt-get install python-certbot-apache

Création du certificat SSL

Il suffit d'invoquer l'utilitaire certbot qui va faire toute la configuration de Apache automatiquement.

ufw disable
certbot --apache -d srvmail.mondomaine.fr
ufw enable

Le processus est interactif et demande une adresse email à contacter en cas de problème, l'acceptation des conditions d'utilisation de Let's Encrypt et la permission de partager l'adresse email avec l'EFF. Enfin, certbot propose de choisir si il faut rediriger automatiquement le traffic arrivant sur le port 80 (HTTP) vers le port 443 (HTTPS). Bien que ce ne soit pas obligatoire, c'est fortement recommandé, surtout dans le cas d'un serveur neuf où on ne risque pas d'interagir avec l'existant.

Pour renouveller automatiquement le certificat, il suffit de lander la commande certbot renew périodiquement. Sur les système utilisant systemd comme Ubuntu, il n'y a rien à configurer, certbotajoute automatiquement un timer pour vérifier le renouvellement.

Renforcement de la sécurité de Apache

Editer le fichier /etc/apache2/sites-available/000-default-le-ssl.conf et ajouter les directives suivantes :

<IfModule mod_ssl.c>
    <VirtualHost _default_:443>
        (...)

        # Set the HTTP Strict Transport Security (HSTS) header to guarantee
        # HTTPS for 1 Year, including subdomains, and allow this site to be
        # added to the preload list.
        Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"

        # Prevent clickjacking by controlling who can put the site into a 
        # frame. Only needed for text/html, but doesn't hurt to be applied
        # generally.
        Header set X-Frame-Options "SAMEORIGIN"

        # Prevent mime based attacks by telling browsers that support it 
        # to use the declared mime type regardless of what the content looks
        # like.
        Header set X-Content-Type-Options "nosniff"

        DocumentRoot /var/www/html
        <Directory "/var/www/html">
            Options FollowSymLinks
            AllowOverride All
            SSLOptions +StdEnvVars
        </Directory>

Enfin, pour se prémunir contre une attaque diyte “LogJam”, ajouter en fin du fichier /etc/apache2/mods-available/ssl.conf les lignes suivantes :

    # Protect against Logjam attacks. See: https://weakdh.org
    SSLOpenSSLConfCmd DHParameters "/etc/ssl/private/dhparams.pem"

Il ne reste plus qu'à générer un group de Diffie-Helman avec la commande :

    openssl dhparam -out /etc/ssl/private/dhparams.pem 2048
    chmod 600 /etc/ssl/private/dhparams.pem

Et à redémarrer Apache :

    systemctl restart apache2

3. Serveur de mails

Installation

Comme pour le serveur LAMP, installer les packages nécessaires avec :

apt install mail-server^

Lors de la configuration, choisir un serveur de messagerie de type “Site Internet”. Le “nom de courrier” est le FQDN de la machine (srvmail.mondomaine.fr). Et completer avec les packages complémentaires :

apt-get install postfix-mysql dovecot-mysql postgrey amavisd-new clamav clamav-daemon spamassassin  libdbi-perl libdbd-mysql-perl php-imap postfix-policyd-spf-python php-mbstring

Et pour permettre aux antispam et antivirus d'inspecter les pièces jontes des messages, il reste encore quelques packages supplémentaires :

apt-get install pyzor razor arj cabextract lzop nomarch p7zip-full ripole rpm2cpio tnef unzip unrar-free zip

Configuration initiale de la base de données

Créer une base de données dans MySQL pour enregistrer tous les paramètres du serveur et des utilisateurs.

mysql -u root -p
create database mail;
grant all on mail.* to 'mail'@'localhost' identified by 'choisissez un mot de passe';
exit

Téléchargement et installation de PostfixAdmin

PostfixAdmin est une interface web de configuration et de gestion de Postfix. Télécharger les sources depuis SoureForge :

wget https://github.com/postfixadmin/postfixadmin/archive/postfixadmin-3.2.tar.gz
tar -xf postfixadmin-3.2.tar.gz
rm -f postfixadmin-3.2.tar.gz
mv postfixadmin-postfixadmin-3.2 /var/wwwpostfixadmin
chown -R www-data:www-data /var/wwwpostfixadmin

Pour rendre PostfixAdmin accessible par le web, il faut ajouter un alias dans la configuration de Apache. Dans le fichier /etc/apache2/sites-available/000-default-le-ssl.conf ajouter les directives suivantes :

# Interface d'administration de Postfix
Alias /postfixadmin /var/www/postfixadmin/public

La configuration de PostfixAdmin passe par le fichier de configuration /var/www/postfixadmin/config.local.php :

touch /var/www/postfixadmin/config.local.php
chown www-data:www-data /var/www/postfixadmin/config.local.php

Editer ce fichier et le remplir avec le contenu suivant :

<?php
$CONF['database_type'] = 'mysqli';
$CONF['database_user'] = 'mail';
$CONF['database_password'] = 'le mot de passe';
$CONF['database_name'] = 'mail';

$CONF['configured'] = true;
?>

PostfixAdmin n'a besoin d'aucun accès en écriture donc on peut sécuriser un peu plus son installation avec :

chmod -R ogu-w /var/www/postfixadmin

Ensuite, il faut créer le répertoire de cache des templates :

mkdir /var/www/postfixadmin/templates_c
chown www-data:www-data /var/www/postfixadmin/templates_c/

Configuration de PostfixAdmin

Pour vérifier et terminer la configuration de PostfixAdmin, accéder à l'adresse https://srvmail.mondomaine.fr/postfixadmin/setup.php

Si il reste des erreurs de configuration, celles-ci seront détaillées, sinon il sera possible de choisir un mot de passe d'administration. En cliquant sur “Generate password hash”, les instructions sur l'utilisation de ce mot de passe seront affichées. (Il faut ajouter le hash du mot de passe dans config.local.php).

Ensuite, il faut créer le compte administrateur de PostfixAdmin. C'est le compte qui permet de paramétrer PostfixAdmin lui-même.

Enfin, il est possible de se connecter à PostfixAdmin avec ce compte pour créer les domaines et les adresses emails. (https://srvmail.mondomaine.fr/postfixadmin/login.php)

Création d'un utilisateur pour gérer les emails

On crée un compte utilisateur (UNIX) qui sera propriétaire des fichiers contenant effectivement les messages :

useradd -r -u 150 -g mail -d /var/vmail -s /sbin/nologin -c "Facteur" vmail
mkdir /var/vmail
chmod 770 /var/vmail
chown vmail:mail /var/vmail

Configuration de Dovecot

Dovecot va être chargé de remettre les messages à leurs destinataires avec le protocole IMAPS. Il est également responsable de l'authentification pour lui et pour Postfix. Il est donc nécessaire de le configurer en premier. La configuration de Dovecot se trouve dans le répertoire /etc/dovecot répartie dans plusieurs fichiers.

La première étape est de s'assurer que Dovecot recherche les utilisateurs dans la base de données que l'on a créé avec PostfixAdmin. Pour cela, dans le fichier /etc/dovecot/dovecot-sql.conf.ext, définir les paramètres :

driver = mysql
connect = host=localhost dbname=mail user=mail password=le_mot_de_passe
default_pass_scheme = SHA512-CRYPT
password_query = \
  SELECT username as user, password, '/var/vmail/%d/%n' as userdb_home, \
  'maildir:/var/vmail/%d/%n' as userdb_mail, 150 as userdb_uid, 8 as userdb_gid \
  FROM mailbox WHERE username = '%u' AND active = '1'
user_query = \
  SELECT '/var/vmail/%d/%n' as home, 'maildir:/var/vmail/%d/%n' as mail, \
  150 AS uid, 8 AS gid, concat('dirsize:storage=', quota) AS quota \
  FROM mailbox WHERE username = '%u' AND active = '1'

Ensuite, on définit le mécanisme d'authentification de Dovecot pour utiliser la base SQL. Pour cela, dans le fichier /etc/dovecot/conf.d/10-auth.conf :

disable_plaintext_auth = yes
auth_mechanisms = plain login
#!include auth-system.conf.ext  # Cette ligne n'est pas commentée par défaut !
!include auth-sql.conf.ext

Après l'authentification et la gestion des comptes, il faut indiquer à Dovecot où ranger les boites email. Pour cela, dans le fichier /etc/dovecot/conf.d/10-mail.conf :

mail_location = maildir:/var/vmail/%d/%n
mail_uid = vmail
mail_gid = mail
first_valid_uid = 150
last_valid_uid = 150

On configure le certificat SSL proposé par Dovecot en utilisant celui de Let's Encrypt. Dans le fichier /etc/dovecot/conf.d/10-ssl.conf :

ssl = yes
ssl_cert = </etc/letsencrypt/live/srvmail.leon-cordas.org/fullchain.pem
ssl_key = </etc/letsencrypt/live/srvmail.leon-cordas.org/privkey.pem
ssl_dh_parameters_length = 2048
ssl_protocols = !SSLv2 !SSLv3
ssl_cipher_list = ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
ssl_prefer_server_ciphers = yes

Et on active l'authentification pour Postfix. Dans /etc/dovecot/conf.d/10-master.conf :

service auth {
    unix_listener auth-userdb {
        mode = 0666
        user = vmail
        group = mail
    }

    # Postfix smtp-auth
    unix_listener /var/spool/postfix/private/auth {
        mode = 0666
        user = postfix
        group = postfix
    }
(...)

Enfin, il faut indiquer une adrezsse de postmaster dans /etc/dovecot/conf.d/15-lda.conf :

postmaster_address = postmaster@mondomaine.fr

Et régler les permissions sur le répertoire de configuration de Dovecot pour qu'il soit lisible par l'utilisateur vmail :

chown -R vmail:dovecot /etc/dovecot
chmod -R o-rwx /etc/dovecot

Remarque : les répertoires qui reçoivent les emails ne sont créés par Dovecot que lorsqu'il reçoit un mail à placer dedans effectivement et pas à la création de l'utilisateur dans sa base de données. C'est un fonctionnement normal.

Configuration de Amavis, ClamAV et Spamassassin

Amavis est le serice qui va filtrer les emails et les faire passer à travers l'antivirus et l'antispam. Les trois composants se configurent donc en même temps.

On commence par ajouter l'utilisateur amavis dans le groupe clamav et réciproquement pour leur permettre de collaborer :

adduser clamav amavis
adduser amavis clamav

Ensuite, on indique à ClamAV qu'il doit accepter les groupes supplémentaires. Dans /etc/clamav/clamd.conf :

AllowSupplementaryGroups true 

On active Amavis en éditant le fichier /etc/amavis/conf.d/15-content_filter_mode. Amavis est désactivé par défaut, on l'active en retirant les commentaires des lignes @bypass.

@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);

On active SpamAssassin et on active la mise à jour automatique des définitions en modifiant le fichier /etc/default/spamassassin :

ENABLED=1
CRON=1

On configure Amavis pour n'envoyer à SpamAssassin que le mail qui est destiné à être livré en local. Pour cela, il faut éditer le fichier /etc/amavis/conf.d/50-user :

# Three concurrent processes. This should fit into the RAM available on an
# AWS micro instance. This has to match the number of processes specified
# for Amavis in /etc/postfix/master.cf.
$max_servers  = 3;
 
# Add spam info headers if at or above that level - this ensures they
# are always added.
$sa_tag_level_deflt  = -9999;
 
# Check the database to see if mail is for local delivery, and thus
# should be spam checked.
@lookup_sql_dsn = (
    ['DBI:mysql:database=mail;host=127.0.0.1;port=3306',
    'mail',
    'le_mot_de_passe']);
$sql_select_policy = 'SELECT domain from domain WHERE CONCAT("@",domain) IN (%k)';
 
# Uncomment to bump up the log level when testing.
# $log_level = 2;

Finalement, on actualise la base virale de ClamAV et on relance les trois services :

freshclam
systemctl restart clamav-daemon
systemctl restart amavis
systemctl restart spamassassin

Remarque : si freshclam provoque une erreur indiquant que son fichier de log est verrouillé, cela peut venir d'une autre instance de freshclam. Dans ce cas, il faut la trouver (avec lsofpar exemple et la tuer).

Configuration de Postfix

Postfix va traiter les mails entrants et envoyer les mails sortants. Il fautle configurer pour travailler avec les autres éléments installés et pour authentifier les utilisateurs du service SMTP. Pour celà, il faut créer quelques fichiers de paramétrage pour lui indiquer les informations sur les utilisateurs et les domaines.

Fichier : /etc/postfix/mysql_virtual_alias_domainaliases_maps.cf

user = mail
password = le_mot_de_passe
hosts = 127.0.0.1
dbname = mail
query = SELECT goto FROM alias,alias_domain
  WHERE alias_domain.alias_domain = '%d'
  AND alias.address=concat('%u', '@', alias_domain.target_domain)
  AND alias.active = 1

Fichier : /etc/postfix/mysql_virtual_alias_maps.cf

user = mail
password = le_mot_de_passe
hosts = 127.0.0.1
dbname = mail
table = alias
select_field = goto
where_field = address
additional_conditions = and active = '1'

Fichier /etc/postfix/mysql_virtual_domains_maps.cf

user = mail
password = le_mot_de_passe
hosts = 127.0.0.1
dbname = mail
table = domain
select_field = domain
where_field = domain
additional_conditions = and backupmx = '0' and active = '1' 

Fichier /etc/postfix/mysql_virtual_mailbox_domainaliases_maps.cf

user = mail
password = le_mot_de_passe
hosts = 127.0.0.1
dbname = mail
query = SELECT maildir FROM mailbox, alias_domain
  WHERE alias_domain.alias_domain = '%d'
  AND mailbox.username=concat('%u', '@', alias_domain.target_domain )
  AND mailbox.active = 1

Fichier /etc/postfix/mysql_virtual_mailbox_maps.cf

user = mail
password = le_mot_de_passe
hosts = 127.0.0.1
dbname = mail
table = mailbox
select_field = CONCAT(domain, '/', local_part)
where_field = username
additional_conditions = and active = '1'

Fichier /etc/postfix/mysql_virtual_sender_login_maps.cf

user = mail
password = le_mot_de_passe
hosts = 127.0.0.1
dbname = mail
query = SELECT goto FROM alias WHERE address='%s'

Un serveur de mail bien configuré doit retirer certains entêtes des mails qu'il relaie. Pour cela, créer le fichier /etc/postfix/header_checkscontenant :

/^Received:/                 IGNORE
/^User-Agent:/               IGNORE
/^X-Mailer:/                 IGNORE
/^X-Originating-IP:/         IGNORE
/^x-cr-[a-z]*:/              IGNORE
/^Thread-Index:/             IGNORE

Il faut maintenant définir la configuration principale de Postfix. Elle réside dans le fichier /etc/postfix/main.cf. Pour faciliter la lecture, elle est ici découpée en plusieurs sections mais toutes les directives vont bien dans le même fichier.

Directives générales

smtpd_banner = $myhostname ESMTP $mail_name
biff = no
append_dot_mydomain = no
readme_directory = no

Paramétrage de l'authentification

smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain =
smtpd_sasl_authenticated_header = yes

Paramétrage du certificat TLS

smtpd_tls_cert_file=/etc/letsencrypt/live/mondomaine.fr/fullchain.pem
smtpd_tls_key_file=/etc/letsencrypt/live/mondomaine.fr/privkey.pem
smtpd_tls_mandatory_protocols=!SSLv2,!SSLv3
smtp_tls_note_starttls_offer = yes
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom
smtpd_tls_security_level = may
smtp_tls_security_level = may
smtpd_tls_exclude_ciphers = aNULL, eNULL, EXPORT, DES, RC4, MD5, PSK, aECDH, EDH-DSS-DES-CBC3-SHA, EDH-RSA-DES-CDC3-SHA, KRB5-DE5, CBC3-SHA
smtpd_tls_dh1024_param_file = /etc/ssl/private/dhparams.pem

Paramétrage du SMTPD

delay_warning_time = 4h
unknown_local_recipient_reject_code = 450
maximal_queue_lifetime = 7d
minimal_backoff_time = 1000s
maximal_backoff_time = 8000s
smtp_helo_timeout = 60s
smtpd_recipient_limit = 50
smtpd_soft_error_limit = 3
smtpd_hard_error_limit = 12

smtpd_helo_restrictions = permit_mynetworks, 
  warn_if_reject,
  reject_non_fqdn_hostname, 
  reject_invalid_hostname, 
  permit

smtpd_sender_restrictions = permit_mynetworks, 
  reject_authenticated_sender_login_mismatch, 
  permit_sasl_authenticated, 
  warn_if_reject reject_non_fqdn_sender, 
  reject_unknown_sender_domain, 
  reject_unauth_pipelining, 
  permit

smtpd_client_restrictions = reject_rbl_client sbl.spamhaus.org, 
  reject_rbl_client blackholes.easynet.nl

smtpd_recipient_restrictions = reject_unauth_pipelining, 
  permit_mynetworks, 
  permit_sasl_authenticated, 
  reject_non_fqdn_recipient, 
  reject_unknown_recipient_domain, 
  reject_unauth_destination, 
  check_policy_service unix:private/policy-spf, 
  check_policy_service inet:127.0.0.1:10023, 
  permit

smtpd_data_restrictions = reject_unauth_pipelining

smtpd_relay_restrictions = reject_unauth_pipelining, 
  permit_mynetworks, 
  permit_sasl_authenticated, 
  reject_non_fqdn_recipient, 
  reject_unknown_recipient_domain, 
  reject_unauth_destination, 
  check_policy_service unix:private/policy-spf, 
  check_policy_service inet:127.0.0.1:10023, 
  permit

smtpd_helo_required = yes
smtpd_delay_reject = yes
disable_vrfy_command = yes

Information générales et paramètres de livraison des messages

myhostname = srvmail.mondomaine.fr
myorigin = /etc/hostname
mydestination =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
mynetworks_style = host
virtual_mailbox_base = /var/vmail
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf,
  mysql:/etc/postfix/mysql_virtual_mailbox_domainaliases_maps.cf
virtual_uid_maps = static:150
virtual_gid_maps = static:8
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf,
  mysql:/etc/postfix/mysql_virtual_alias_domainaliases_maps.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
smtpd_sender_login_maps = mysql:/etc/postfix/mysql_virtual_sender_login_maps.cf

Intégration avec Dovecot et Amavis

virtual_transport = dovecot
dovecot_destination_recipient_limit = 1
content_filter = amavis:[127.0.0.1]:10024
policy-spf_time_limit = 3600s

Manipulation des entêtes

headerchecks = regexp:/etc/postfix/headerchecks enableoriginalrecipient = no

Pour achever la configuration de Postfix, il reste à modifier le second fichier de paramétrage : /etc/postfix/master.cf qui détermine les routes employées par les messages.

Activer les protocoles SMTP over SSL et SMTP avec TLS (resp. ports 587 et 465) :

submission inet n       -       y       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=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_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
# The next two entries integrate with Amavis for anti-virus/spam checks.
amavis      unix    -       -       y       -       3       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       -       y       -       -       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,no_milters
# Integration with Dovecot - hand mail over to it for local delivery, and
# run the process under the vmail user and mail group.
dovecot      unix   -        n      n       -       -   pipe
  flags=DRhu user=vmail:mail argv=/usr/lib/dovecot/dovecot-lda -d $(recipient)
# Integration with the SPF check package.
policy-spf  unix  -       n       n       -       -       spawn
  user=nobody argv=/usr/bin/policyd-spf

Pour terminer la configuration, redémarrer l'ensemble des services :

systemctl restart postfix
systemctl restart spamassassin
systemctl restart clamav-daemon
systemctl restart amavis
systemctl restart dovecot

4. Webmail Rainloop

Installation

Télécharger l'archive https://www.rainloop.net/repository/webmail/rainloop-community-latest.zip et la décompresser :

apt-get install php-curl
mkdir /var/www/rainloop
wget https://www.rainloop.net/repository/webmail/rainloop-community-latest.zip
unzip rainloop-community-latest.zip -d /var/www/rainloop
rm rainloop-community-latest.zip
find /var/www/rainloop -type d -exec chmod 755 {} \;
find /var/www/rainloop -type f -exec chmod 644 {} \;
chown -R www-data:www-data /var/www/rainloop

Configuration initiale

Créer un fichier /etc/apache2/conf-available/rainloop.conf contenant :

Alias /webmail  /var/www/rainloop
<Directory "/var/www/rainloop">
    AllowOverride None
    Require all granted
</Directory>
<Directory "/var/www/rainloop/data">
    AllowOverride None
    Require all denied
</Directory>

Et l'activer avec :

a2enconf rainloop
systemctl reload apache2

L'accès au webmail se fait par l'URL : https://srvmail.mondomaine.fr/webmail/

Accès à l'interface d'administration de Rainloop

L'accès se fait par l'URL : https://srvmail.mondomaine.fr/webmail/?admin

Les identifiants par défaut sont admin / 12345

Il faut les changer au plus vite !

5. Configuration de SPF et DKIM

### Configuration de SPF

SPF est un enregistrement de DNS indiquant quels sont les serveurs autorisés à poster pour un domaine donné. Il n'y a rien à configurer sur le serveur.

Un SPF qui autorise uniquement les serveurs listés en MX à envoyer du mail est :

"v=spf1 mx -all"

Installation de OpenDKIM

DKIM est une combinaison d'un enregistrement DNS (contenant une clé RSA publique et d'une clé privée placée sur le serveur et utilisée pour signer les mails sortants.

Pour l'installer, il faut commencer par les packages :

apt-get install opendkim opendkim-tools
mkdir /etc/opendkim
mkdir /etc/opendkim/keys

Ensuite, il faut éditer le fichier de configuration /etc/default/opendkim pour ajouter l'écoute sur une socket :

SOCKET="inet:8891@localhost"

Et le fichier /etc/opendkim.confpour indiquer l'emplacement du fichier de clé :

AutoRestart             Yes
AutoRestartRate         10/1h
UMask                   002
Syslog                  yes
SyslogSuccess           Yes
LogWhy                  Yes
Canonicalization        relaxed/simple
ExternalIgnoreList      refile:/etc/opendkim/TrustedHosts
InternalHosts           refile:/etc/opendkim/TrustedHosts
KeyTable                refile:/etc/opendkim/KeyTable
SigningTable            refile:/etc/opendkim/SigningTable
Mode                    sv
PidFile                 /var/run/opendkim/opendkim.pid
SignatureAlgorithm      rsa-sha256
UserID                  opendkim:opendkim
Socket                  inet:8891@localhost
OversignHeaders         From
TrustAnchorFile         /usr/share/dns/root.key

Créer le fichier des hôtes de confiance /etc/opendkim/TrustedHosts :

127.0.0.1
localhost

Créer le fichier des clés /etc/opendkim/KeyTable :

mail._domainkey.mondomaine.fr mondomaine.fr:mail:/etc/opendkim/keys/dkim.mondomaine.fr.key

Créer le fichier des signataires /etc/opendkim/SigningTable:

*@mondomaine.fr mail._domainkey.mondomaine.fr

Il faut ensuite brancher l'utilisation de OpenDKIM dans le fichier /etc/postfix/main.cf pour que Postfix signe les mails sortants :

milter_default_action = accept
milter_protocol = 6
smtpd_milters = inet:localhost:8891
non_smtpd_milters = inet:localhost:8891

Maintenant, il faut générer le couple clé publique/clé privé qui sera utilisé pour la signature et copier la clé privée dans la config de Postfix :

opendkim-genkey -t -s mail -d mondomaine.fr
mv dkim.private /etc/opendkim/keys/dkim.mondomaine.fr.key
chmod 660 /etc/opendkim/keys/dkim.mondomaine.fr.key
chown root:opendkim /etc/opendkim/keys/dkim.mondomaine.fr.key

Le deuxième fichier généré est l'enregistrement DNS contenant la clé publique. Il faut le placer dans le DNS.

dkim._domainkey IN      TXT     ( "v=DKIM1; k=rsa; t=y; "
      "p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCaJCt9N+SWBGX8LX7/2H72QNJynaRbCCvrpahPMtjK6jRfhU3HlX41/pTMB/oIxuj8y1bfX8IOmayBBnz3IJfqWEemVtivtDIB+tOMAA7sRkMGkzpvFpIuF/Y7gbbHq2EpSGy3DUu6GMXVYgHUJCAk4BbbJ/ptcQzhi0MS3iaedQIDAQAC" )  ; ----- DKIM key dkim for mondomaine.fr

On peut vérifier sa présence avec la commande :

dig mail._domainkey.mondomaine.fr txt

Puis il faut redémarrer Postfix et Opendkim pour que la signature soit activée :

systemctl restart opendkim
systemctl restart postfix