Serveur de courriels
Postfix est un serveur de messagerie électronique. Il se charge de la livraison de courriers électroniques (courriels) et a été conçu comme une alternative plus rapide, plus facile à administrer et plus sécurisée que l'historique Sendmail.
Dans ce tuto, nous mettrons en place :
- Le serveur de courrier Postfix avec gestion d'IPv6, utilisateurs PAM, SASL, des alias, des domaines secondaires, des listes noires, gestion du SPAM avec SpamAssassin et STARTTLS
- Le serveur IMAP Dovecot avec gestion de l'IPv6, du STARTTLS, les filtres Sieve
- Le client web Rainloop
Pré-requis :
- Debian 8
- Un nom de domaine avec un enregistrement MX
- Une IP publique fixe
- LISTE DES PORTS UTILISÉS POUR LE PARE-FEUX
Article en cours de rédaction
Test du DNS
Installation des outils.
# apt update && apt install openssl dnsutils telnet
Test du fonctionnement du champ MX
$ dig exemple.fr MX
La réponse doit contenir une "ANSWER SECTION" avec ceci :
exemple.fr 10800 IN MX 10 mail.exemple.fr
Installation de Postfix
Génération du certificat et de la clé pour Postfix et Dovecot.
# openssl req -x509 -nodes -days 3650 -newkey rsa:4096 -out /etc/ssl/certs/mailcert.pem -keyout /etc/ssl/private/mail.key
Installation du serveur SMTP
# apt install postfix
Accepter les choix proposés, choisir la configuration "Site internet" et mettre le FQDN au nom du serveur demandé.
Génération de la clé Diffie Hellman (si on ne le fait pas, Postfix utilise la sienne)
# openssl dhparam -out /etc/postfix/dh2048.pem 2048
Configuration de Postfix
Configuration principale
La configuration principale de Postfix se fait via l'intermédiaire du fichier main.cf qui renseigne un petit sous-ensemble des paramètres contrôlant les opérations du système de messagerie. Les paramètres non explicitement renseignés sont initialisés avec leur valeur par défaut.
Main.cf
Édition du fichier de configuration principal
$ vim /etc/postfix/main.cf
La configuration suivante sera utilisée :
# smtpd : entrant/inbound
# smtp : sortant/outbound
#------------------------------------Connexion protocol SMTP------------------------------------#
# Bannière affiché lorsqu'on se connecte en SMTP sur le port 25
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
# Desactive la commande SMTP VRFY. Arrête certaine technique pour avoir des adresses email
disable_vrfy_command = yes
# Impose au client SMTP de démarrer la session SMTP par une commande Helo (ou ehlo)
smtpd_helo_required = yes
#------------------------------------Gestion des messages locaux (innutile)------------------------------------#
# Service qui envoie des notifications "nouveau message"
biff = no
# Avec le courrier local ça ajoute .NDD aux adresses incomplètes (seulement le nom d'hote)
append_dot_mydomain = no
#------------------------------------Nom de machine et réseaux autorisés------------------------------------#
# Le nom de la machine du système de messagerie
# Par défaut c'est host.domain.tld mais on peut mettre un reverse dns
myhostname = mail.exemple.fr
# Le domaine utilisé par defaut pour poster les messages locaux
myorigin = mail.exemple.fr
# Liste des domaines pour lequel le serveur doit accepter le courrier
mydestination = mail.exemple.fr, exemple.fr, localhost.exemple.fr, localhost
# Pour effectuer des livraisons de courrier avec un relay (ici non)
relayhost =
# Liste des réseaux locaux autorisés (leur permet d'outrepasser le SASL)
mynetworks = 192.168.1.0/24, 192.168.160.0/24, 127.0.0.0/8
# Activation d'IPv6 (seul v4 est activé par défaut)
inet_protocols = all
# Séparateur entre le nom d'utilisateur et les extensions d'adresses
recipient_delimiter = +
# Les utilisateurs locaux ne pourront pas envoyer de messages à "utilisateur@nom-de-domaine-partiel" mais devront spécifier le nom de domaine complet
append_dot_mydomain = no
# Interfaces réseaux à écouter (ici toutes)
inet_interfaces = all
#------------------------------------Règles SMTP------------------------------------#
#Restrictions d'accès appliqués dans le contexte d'une commande RCPT TO
# permit_mynetworks : Autorise les requêtes si l'IP du client correspond à l'un des réseaux spécifiés dans $mynetworks
# permit_sasl_authenticated : Accepter la connexion lorsque le client est authentifié
# reject_non_fqdn_recipient : Rejette la requête lorsque l'adresse RCPT TO n'est pas de forme pleinement qualifiée (FQDN)
# reject_unauth_destination : Rejette la requête sauf si l'une des propositions listés dans la doc est vrai
# reject_unknown_recipient_domain : Rejette la requête lorsque le RCPT TO ne correspond à aucun A ou MX
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_non_fqdn_recipient,
reject_unauth_destination,
reject_unknown_recipient_domain,
# Règles sur l'échange HELO qui survient avant la connexion
# permit_mynetworks : Autorise les requêtes si l'IP du client correspond à l'un des réseaux spécifiés dans $mynetworks
# reject_invalid_helo_hostname : Refuser les échanges HELO invalides
# reject_non_fqdn_helo_hostname : Refuser les noms d'hôte invalides (non FQDN)
# reject_unknown_helo_hostname : Refuser les noms d'hôte qui n'ont pas de champ DNS A ou MX dans leurs DNS
smtpd_helo_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_invalid_helo_hostname,
reject_non_fqdn_helo_hostname,
# Règles de connexion des clients
# permit_mynetworks : Autorise les requêtes si l'IP du client correspond à l'un des réseaux spécifiés dans $mynetworks
# permit_inet_interfaces : Accepte les resuêtes des client entrant par les interfaces listés dans $inet_interfaces
# permit_sasl_authenticated : Accepter la connexion lorsque le client est authentifié
# reject_rbl_client : Refuse les connexion des clients (IP) listés dans une liste RBL suite à des envois massifs de spam
# reject_plaintext_session : Refuser les connexions non sécurisées
# reject_unauth_pipelining : Refuser les défauts lors de la connexion (difficile de synthétiser. Ce référer à la doc)
smtpd_client_restrictions =
permit_mynetworks,
permit_inet_interfaces,
permit_sasl_authenticated,
reject_rbl_client zen.spamhaus.org
# reject_plaintext_session,
# reject_unauth_pipelining # L'utilisation de reject_unauth_pipelining dans les autres contextes que smtpd_data_restrictions n'est pas recommandé
# Règles sur les expéditeurs
# reject_non_fqdn_sender : Refuser les expéditeurs invalides (non FQDN)
# reject_unknown_sender_domain : Refuser les expéditeurs qui n'ont pas de champ DNS A ou MX dans leurs DNS
# check_sender_access : Vérifie si l'adresse email (reçue ou envoyée) est dans notre fichier liste noire et applique la directive de celle-ci
smtpd_sender_restrictions =
reject_non_fqdn_sender,
reject_unknown_sender_domain,
check_sender_access hash:/etc/postfix/adresses-rejet
#Restrictions d'accès optionelles appliqués dans le contexte d'une commande SMTP DATA
# reject_unauth_pipelining : Refuser les défauts lors de la connexion (difficile de synthétiser. Ce référer à la doc)
# permit : Tout est autorisé par défaut
smtpd_data_restrictions =
reject_unauth_pipelining,
permit
#------------------------------------Gestion des boites et des messages------------------------------------#
# Taille des boîtes auix lettres (0 = illimité)
mailbox_size_limit = 0
#Fixer la taille limite des messages (ici 30Mo)
message_size_limit = 31457280
# Répertoire de destination des courriers
home_mailbox = Maildir/
mailbox_command = /usr/lib/dovecot/deliver
#----------------------------------------------
# Gestion des alias de comptes et de domaines |
#----------------------------------------------
#Emplacement du fichier des alias
#Alias de comptes principal
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
#Alias de domaines secondaires
virtual_alias_maps = hash:/etc/postfix/aliases_domaines
virtual_alias_domains = toto.fr, titi.org
#--------------------
# SASL serveur SMTP |
#--------------------
# Authentification SMTP (utilise les identifiants IMAP via SASL en passant par Dovecot)
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
# Interdit les méthodes qui autorisent l'authentification anonyme
smtpd_sasl_security_options = noanonymous
smtpd_sasl_tls_security_options = $smtpd_sasl_security_options
smtpd_sasl_local_domain = $mydomain
# Reporte le nom d'utilisateur SASL authentifié dans l'en-tête de message Received du serveur
smtpd_sasl_authenticated_header = yes
# N'accepte pas le support de l'ancienne commande AUTH (Outlook 4 par exemple)
broken_sasl_auth_clients = no
#------------------------------------Chiffrement------------------------------------#
# SSL/TLS clés et certificats
smtpd_tls_cert_file = /etc/ssl/certs/mailcert.pem
smtpd_tls_key_file = /etc/ssl/private/mail.key
smtpd_tls_dh1024_param_file = $config_directory/dh2048.pem
#------------------
# TLS client SMTP |
#------------------
# Verbositer des logs
smtp_tls_loglevel = 1
# Accepte de ce connecter à des serveurs SMTP en clair mais préfaire le TLS
smtp_tls_security_level = may
# Interdire le SSLv2 et v3
smtp_tls_protocols = !SSLv2, !SSLv3
#Interdire le SSLv2 et v3 obligatoirement (ça n'a aucun sens mais que voulez-vous ? Documentation de Postfix quand tu nous tiens...)
smtp_tls_mandatory_protocols = !SSLv2, !SSLv3
#Postfix retient apparemment qui propose du STARTTLS (je vois pas à quoi ça peut bien servir...)
smtp_tls_note_starttls_offer = yes
#N'autoriser que les chiffrements costauds
smtp_tls_mandatory_ciphers = high
#Exclure les algorithmes obsolètes ou insufisants listés ci-dessous
smtp_tls_exclude_ciphers = aNULL, eNULL, EXPORT, DES, 3DES, RC2, RC4, MD5, PSK, SRP, DSS, AECDH, ADH
#Pas d'explications claires sur la fonction de ce paramètre
tls_preempt_cipherlist = yes
#Cache TLS. Permet de mémoriser les anciennes sessions TLS afin d'effectuer une poignée de mains raccourcie. Ce qui améliore concidérablement les performances
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
#-------------------
# TLS serveur SMTP |
#-------------------
#Verbositer des logs
smtpd_tls_loglevel = 1
#Accepte les connexions des clents SMTP en claire mais préfaire le TLS
smtpd_tls_security_level = may
#Refuse les authentifications SASL en clair si le serveur gère le TLS
smtpd_tls_auth_only = yes
#Indique le chiffrement utilisé dans l'en-tête du message (ça ne sert pas à grand chose si on passe par plusieurs serveurs car les intermédiaires peuvent y mettre leurs sauce donc ce n'est qu'indicatif)
smtpd_tls_received_header = yes
# Source du générateur de nombre aléatoire pour les algorithmes de chiffrement
tls_random_source = dev:/dev/urandom
# Versions de TLS autorisés (SSL refusé)
smtpd_tls_protocols = TLSv1.2, TLSv1.1, TLSv1, !SSLv3, !SSLv2
# Toujours aucune idée de l'utilité mais c'est activé par défaut de toute façon d'après la documentation
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3
#Cache TLS. Permet de mémoriser les ancienne sessions TLS afin d'effectuer une poignée de mains raccourcie. Ce qui améliore concidérablement les performances
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
#------------------------------------Entêtes des courriers------------------------------------#
# Emplacement des fichiers de suppression de certaines en-têtes à caractère privé contenues dans les messages envoyés
# Concrètement, cela supprime toute la section "Received: from" propre au client (contenant son IP par exemple) -> son SMTP. Seul le "Received: from" son SMTP -> SMTP distant reste
mime_header_checks = regexp:/etc/postfix/header_checks
header_checks = regexp:/etc/postfix/header_checks
#------------------------------------Source documentation------------------------------------#
# http://postfix.traduc.org/index.php/postconf.5.html
# http://www.postfix.org/postconf.5.html
Liste noire
Création de la liste noire d'adresse (envoi et réception)
$ vim /etc/postfix/adresses-rejet
Avec ce contenu :
email@bloquer 554 Parle à ma main, ma tête est malade.
Le message provenant de cette adresse sera rejeté avec un message SMTP (qui apparaîtra dans les log du serveur distant) précisé après le code 554. Si aucun message n'est spécifié, REJECT utilise les paramètres par défauts, à savoir "rejected: Access denied" comme raison du rejet.
Postfix utilisant des binaires pour les configurations externes, il faut compiler la liste noire (la directive "check_sender_access hash" du main.cf de façon transparente un ".db" au chemin spécifié) avec la commande suivante :
$ postmap /etc/postfix/adresses-rejet
Cette commande est à exécuter à chaque modifications de la liste (le redémarrage de Postfix n'est pas nécessaire).
Entêtes vie privée
On va créer une liste de critères regex servant à supprimer automatiquement certaines entêtes contenant des informations personnelles sur le client émetteur lors de l'envoi du courrier (améliore la vie privée).
$ vim /etc/postfix/header_checks
Ce fichier doit contenir ceci :
/^Received:.*with ESMTPSA/ IGNORE /^X-Originating-IP:/ IGNORE /^X-Mailer:/ IGNORE /^User-Agent:/ IGNORE
Explications : Les directives suivantes contenues dans la section "Entêtes des courriers" du fichier main.cf édité ci-dessus indiquent à Postfix l'emplacement de ces règles.
mime_header_checks = regexp:/etc/postfix/header_checks header_checks = regexp:/etc/postfix/header_checks
Pour que Postfix les utilises, il faut reconstruire la hash table.
$ postmap /etc/postfix/header_checks
Et rafraichire sa configuration.
$ postfix reload
Création d'utilisateurs et d'alias
Comme nous utilisons des utilisateurs PAM UNIX pour notre Postfix, il suffit de créer un utilisateur système pour pouvoir s'en servir à envoyer des email
$ adduser test
Création d'un alias. Cette fonctionnalité peut être utile pour s'inscrire sur des sites ou pour donner à des mec relous, les emails envoyés sur ces adresses sont redirigés en interne sur la vrai boite lié à l'alias sauf que l'on voit l'adresse qui a servis pour nous joindre. L'intérêt est double : si on reçois des email louches (SPAM) sur cet alias, on sait quel est le malotru qui a vendu notre adresse et on peut décider d'aller faire nos course ailleurs si c'est une entreprise de e-commerce par exemple. Ensuite on peut tout bonnement supprimer l'alias pour que les personne ayant cette adresse ne puisse plus nous joindre. Si cette fonctionnalité est utilisé sérieusement, le risque de SPAM est quasi nul. Couplé aux règles Sieve abordées plus loin dans le tuto, les alias vont être très utile afin de classer les email reçus automatiquement dans des dossiers et ne pas ce retrouver avec les éternelles boite de reception à plus de 2000 messages "non lus".
$ vim /etc/aliases
La création d'un alias se résume à mettre le nom de l'alias suivit du séparateur ":" ainsi que du nom de l'utilisateur Linux y étant attaché
amazon:test
ldlc:test
keke:kevin
#commentaire:croisillon
Pour mettre à jour la base interne des alias il faut executer la commande suivante :
$ newaliases
Un rechargement de la configuration de Postfix n'est pas nécessaire.
Gestion des domaines secondaires
Postfix nous laisse la possibilité de gérer plusieurs domaines (un peu comme les Virtual Hosts Apache).
$ vim /etc/postfix/aliases_domaines
Si vous voulez gérer plusieurs domaines avec votre serveur, vous entrerez leurs nom dans la section "virtual_alias_domains" du fichier main.cf et entrerez les alias comme suit (adresse complète de l'utilisateur suivit d'un espace et du nom de l'utilisateur Linux y étant rattaché) :
kevin@toto.fr kevin vanessa@titi.org vanessa
Compiler le fichier d'alias après chaque modifications
$ postmap /etc/postfix/aliases_domaines
Configuration secondaire
La configuration secondaire se fait via le fichier master.cf et permet de gérer la façon dont se connecte les clients au service de messagerie et comment ce dernier réagit lorsqu'une requête lui est destinée.
Master.cf
Il faut dé-commenter certains choses et en commenter d'autre sur 2 paragraphes du début du fichier.
$ vim /etc/postfix/master.cf
Attention à la première ligne qui commence par SMTP ! Si elle est oublié ça génère des problèmes de ouf in-débogable car Postfix n'écrit de fait rien dans les log... Il ne faut donc pas l'oublier...
smtp inet n - - - - smtpd
submission inet n - - - - 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_client_restrictions=permit_sasl_authenticated,reject
# -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 - - - - 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_client_restrictions=permit_sasl_authenticated,reject
# -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
Intégration de Dovecot
Ajouter à la fin du fichier l'intégration avec Dovecot.
dovecot unix - n n - - pipe
flags=DRhu user=email:email argv=/usr/lib/dovecot/deliver -f ${sender} -d ${recipient}
Installation et configuration de Dovecot
Installation de Dovecot
Le serveur IMAP Dovecot s'installe dovecot-common est un paquet virtuel renvoyant vers dovecot-core, l'un peut être remplacé par l'autre dans la ligne de commande suivante de manière indéiférrente
$ apt install dovecot-common dovecot-imapd
Configuration de Dovecot
Gestion d'IPv6
Activation du support d'IPv6 (optionnel suivant votre configuration)
$ vim /etc/dovecot/dovecot.conf
Ajouter cette ligne
listen = *, [::]
Emplacement des dossiers utilisateurs
Configuration de l'emplacement du répertoire des email des utilisateurs
$ vim /etc/dovecot/conf.d/10-mail.conf
Remplacer mail_location = mbox:~/mail:INBOX=/var/mail/%u par mail_location = maildir:~/Maildir
Couche de chiffrement TLS
Configuration de la couche de chiffrement (on va le rendre obligatoire)
$ vim /etc/dovecot/conf.d/10-ssl.conf
Ajouter ceci (attention la ligne "ssl = no" est présente par défaut, il faut la supprimer) :
# SSL/TLS support: yes, no, required. <doc/wiki/SSL.txt>
ssl = required
ssl_cert = </etc/ssl/certs/mailcert.pem
ssl_key = </etc/ssl/private/mail.key
ssl_protocols = !SSLv2 !SSLv3 # Désactivation du SSLv2 et v3
ssl_cipher_list = ALL:!aNULL:!eNULL:!LOW:!MEDIUM:!EXP:!RC2:!RC4:!DES:!3DES:!MD5:!PSK:!SRP:!DSS:!AECDH:!ADH:@STRENGTH
ssl_prefer_server_ciphers = yes # Dovecot > 2.2.x
ssl_dh_parameters_length = 2048 # Dovecot > 2.2.x
les valeurs sont précédés d'un chevron ouvert qui ne se ferme jamais "<". C'est louche mais normal (documentation officielle de Dovecot). Il n'y a donc pas d'erreur dans les lignes mentionnées ci-dessus.
Configuration de l'authentification
Désactiver l'authentification en claire
$ vim /etc/dovecot/conf.d/10-auth.conf
Décommenter la ligne suivante dans le fichier suivant :
disable_plaintext_auth = yes
Configuration de l'authentification
$ vim /etc/dovecot/conf.d/10-master.conf
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
# auth_socket_path points to this userdb socket by default. It's typically
# used by dovecot-lda, doveadm, possibly imap process, etc. Users that have
# full permissions to this socket are able to get a list of all usernames and
# get the results of everyone's userdb lookups.
#
# The default 0666 mode allows anyone to connect to the socket, but the
# userdb lookups will succeed only if the userdb returns an "uid" field that
# matches the caller process's UID. Also if caller's uid or gid matches the
# socket's uid or gid the lookup succeeds. Anything else causes a failure.
#
# To give the caller full permissions to lookup all users, set the mode to
# something else than 0666 and Dovecot lets the kernel enforce the
# permissions (e.g. 0777 allows everyone full permissions).
unix_listener auth-userdb {
#mode = 0666
#user =
#group =
}
}
Auto création des répertoires utilisateurs
Auto création des répertoires "envoyé", "brouillons", "Indésirables" et "corbeille" ("réception" est créé par Postfix)
$ vim /etc/dovecot/conf.d/15-mailboxes.conf
Il faut que les sections correspondantes aux répertoires soient présentes et que l'argement "auto = create" (création du dossier dans l'arboréscence) ou "auto = suscribe" (création du dossier et inscription automatique dans le client) soient spécifiées. Attention, les espaces avant les acolades sont ultra important (le service ne se lance pas si il n'y en a pas...) ça peut générer une séance de débogage bien chiante juste pour cette merde.
namespace inbox { mailbox Sent { auto = subscribe special_use = \Sent } mailbox Drafts { auto = subscribe special_use = \Drafts } mailbox Trash { auto = subscribe special_use = \Trash } mailbox Spam { auto = subscribe special_use = \Junk } mailbox Archive { auto = subscribe special_use = \Archive } mailbox Notes { auto = create } }
La section suivante, présente par défaut, peut être supprimé (il s'agit juste d'un nom alternatif ne présentant aucun intérêt):
mailbox "Sent Messages" { special_use = \Sent }
Redémarrer les services pour prendre en compte les modifications
$ service postfix restart $ service dovecot restart
Installation de Sieve
Installation de Sieve
Sieve est un système de filtre du courrier coté serveur. Il utilise IMAP pour fonctionner et se comporte comme une extension de Dovecot. Les scripts sont créables à la fois sur le serveur et sur le client (ce sont de simples instructions dans un fichier texte synchronisé par IMAP).
# apt install dovecot-sieve dovecot-managesieved
Ces deux paquets vont créer les 3 fichiers 90-sieve.conf, 90-sieve-extprograms.conf et 20-managesieve.conf.
Configuration de Sieve
Dovecot va se servir du fichier /etc/dovecot/conf.d/15-lda.conf pour la suite des évènements. Si vous laissez ce fichier par défaut (il n'y a aucun paramètres actifs dedans), vous ne verrez aucune différence de fonctionnement. En revanche, si vous mettez des paramètres à l'intérieur, veillez à ne pas supprimer la valeur ajouté dans mailbox_command du main.cf, sinon ça plante (c'est donc les deux notion modifiés ou rien).
Modification du fichier 15-lda.cof pour dire à Dovecot d'utiliser le greffon Sieve
# vim /etc/dovecot/conf.d/15-lda.conf
Les arguments suivants serons utilisés
protocol lda { postmaster_address = postmaster@exemple.fr lda_mailbox_autocreate = yes lda_mailbox_autosubscribe = yes mail_plugins = $mail_plugins sieve }
Définition du répertoire de destination des scriptes Sieve (par défaut c'est le ~) en modifiant le fichier 90-sieve.conf
# vim /etc/dovecot/conf.d/90-sieve.conf
On demande à Dovecot de créer le répertoire Sieve dans le Maildir de l'utilisateur qui se connecte ainsi que d'utiliser les scripts qui serons ajouté par l'utilisateur à l'intérieur par l'intermédiaire de son client de messagerie
plugin { sieve = ~/Maildir/sieve/.dovecot.sieve sieve_before = /var/mail/sieve/before/spam.sieve sieve_dir = ~/Maildir/sieve }
Créer l’arborescence pour les scripts Sieve globaux (actifs pour tout les utilisateurs et s'exécutants avant leurs scripts personnels) et définir les bon droits pour celle-ci
# mkdir -p /var/mail/sieve/before && chown -R mail: /var/mail/sieve
Redémarrer le service Dovecot
# service dovecot restart
Création d'une règle globale pour la gestion du SAPM
Mise en place d'un script Sieve globale et actif pour tout les utilisateurs
# vim /var/mail/sieve/before/spam.sieve
Ce script va permettre de placer tout les emails détectés comme du spam par SpamAssassin dans le dossier Maildir Spam :
require "fileinto"; if header :contains "X-Spam-Flag" "YES" { fileinto "Spam"; }
Compiler le fichier de règle afin de ne pas avoir un message d'erreur (non bloquant) dans les log concernant des droits
# sievec /var/mail/sieve/before/spam.sieve
Cette commande compile le fichier de règle dans le même répertoire que la source sous le nom de spam.svbin
Donner les droits aux fichierx
# chown mail: /var/mail/sieve/before/spam.*
Installation de SpamAssassin
Installation de SpamAssassin
SpamAssassin permet de detecter et marquer les emails se caractérisants comme du Spam pour simplifier leur traitement.
# apt install spamassassin spamc
Intégration de SapmAssassin à Postfix
Ajout des directives concernant Spamassassin dans Postfix via le master.cf
# vim /etc/postfix/master.cf
En dessous de
smtp inet n - - - - smtpd
Ajoutez ceci (attention, l'indentation compte) :
-o content_filter=spamassassin submission inet n - - - - smtpd -o content_filter=spamassassin
À la fin de ce fichier, ajoutez ceci :
spamassassin unix - n n - - pipe user=debian-spamd argv=/usr/bin/spamc -f -e /usr/sbin/sendmail -oi -f ${sender} ${recipient}
Actualiser la configuration de Postfix
# service postfix reload
Configuration de SpamAssassin
À ce stade, un choix s'offre à nous. La modification suivante est donc à votre appréciation. Lorsqu'un email va être détecté en tant que spam, SpamAssassin va modifier son entête et ajouter une section "X-Spam-Flag: YES". De là, il sera facile de créer une règle de filtrage Sieve s'occupant de placer le courrier indésirable dans le dossier correspondant. La modification suivante va permettre de changer la façon don ce présente le message détecté comme Spam. Si vous dé-commentez la ligne de l'étape suivante, SpamAssassin va ajouter au début du sujet du message la chaîne de caractère "*****SPAM*****". Si vous ne le faite pas, SpamAssassin va juste modifier l'entête du message et le livrer tel-quel. À vous de voir...
Si vous avez du mal à comprendre faites le test et vous verrez bien ce qui vous convient.
Édition du fichier local.cf
# vim /etc/spamassassin/local.cf
Dé-commenter cette ligne (étape facultative en fonction de votre choix)
reriwte_header Subject *****SPAM*****
Ajouter ceci dans le même fichier, tout à la fin :
report_safe 0 whitelist_from *@exemple.fr add_header all Report _REPORT_ add_header spam Flag _YESNOCAPS_ add_header all Status _YESNO_, score=_SCORE_ required=_REQD_ tests=_TESTS_ autolearn=_AUTOLEARN_ version=_VERSION_ add_header all Level _STARS(*)_ add_header all Checker-Version SpamAssassin _VERSION_ (_SUBVERSION_) on _HOSTNAME_
Il faut passer la valeur "ENABLED" à 1 dans le fichier /etc/default/spamassassin pour activer le service et vérifiez que la valeur "CRON" soit bien présente et égale à 0 (0 pour Debian Jessie - 1 pour Debian Wheezy)
# vim /etc/default/spamassassin
ENABLED=1 CRON=0
Activer le service spamassassin au démarrage du système
# systemctl enable spamassassin.service
Démarrer le service
# service spamassassin start
Automatisation de l'apprentissage
Ajout de règles cron pour automatiser les mises à jour de la base de connaissance de Spamassassin
# crontab -e
Si c'est la première fois que vous utiliser Cron, un message va vous inviter à choisir votre éditeur par défaut. Si vous voulez vim, choisissez "vim.basic"
# Mise à jour des règles de spamassassin 20 02 * * * /usr/bin/sa-update # Auto-apprentissage de spam assassin 30 02 * * * /usr/bin/sa-learn --ham /home/test/Maildir/cur/* 40 02 * * * /usr/bin/sa-learn --spam /home/test/Maildir/.Spam/cur/*
Voir si le fait de remplacer test par * permet de rechercher dans tout les utilisateurs sans avoir à rajouter ces deux lignes par utilisateur.
Tester la détection de spam
Bien qu'il soit compliqué de tester le bon fonctionnement de SpamAssassin nous pouvons nez en moins simuler un email frauduleux en envoyant un message contenant la chaîne de caractère suivante :
XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X
Vérification de la détection dans les logs
# tail -f /var/log/mail.log
Si tout ce passe bien vous verrez dans le fichier de log le message suivant :
stored mail into mailbox 'Spam'
En vous connectant à votre compte vous verrez le message envoyé être arrivé automatiquement dans la boite "indésirable".
Installation du webmail
Installation d'Apache
Installation d'apache et des dépendences du site
# apt install apache2 php5 php5-curl zip
Création du répertoire déstiné au site
# mkdir /var/www/rainloop
Adaptation du Virtual Host Apache
# vim /etc/apache2/sites-enabled/000-default.conf
La ligne DocumentRoot /var/www/html doit avoir être remplacé par DocumentRoot /var/www/rainloop. Il faut appliquer la configuration en relançant le service Apache2
# service apache2 reload
La mise en place d'un Apache HTTPS ne sera pas abordé dans ce tuto mais est fortement recommandé afin de grandement limiter les risques de piratage. Deux façons de procéder sont possibles : utiliser la gestion TLS d'Apache ou coupler l'installation existante à un Haproxy qui se chargera de rediriger le trafic HTTP en HTTPS.
Installation de Rainloop
Téléchargement de l'archive
# wget http://repository.rainloop.net/v2/webmail/rainloop-community-latest.zip -P /tmp/
Dézippage de l'archive dans le répertoire du site
# unzip /tmp/rainloop-community-latest.zip -d /var/www/rainloop/
Attribution des droit Apache2 à ce dernier
# chown -R www-data: /var/www/rainloop
Configuration de Rainloop
Il faut ouvrir un navigateur et aller à l'adresse de votre serveur sur la page admin en ajoutant "/?admin" à la fin de l'URL: http:/mail.exemple.fr/?admin. Le login est "admin" et le mot de passe est "12345" (pensez à le changer).
Dans la section "General", changer la langue de l'interface client en Français (l'interface admin ne possède pas de traduction). Aller dans la section "Domains" > Supprimez tout les domaines présents par défaut (on monte un serveur à la maison c'est pas pour continuer d'utiliser NSA Cloud Backup) > "add Domain" > "Name" : Ce que vous voulez mais je trouve propre de mettre le domaine MX > "IMAP > "Server" > mail.exemple.fr et "Port" 143 > "Sécure" STARTTLS" et cochez la case "Use short login" > Pour le "SMTP c'est pareil, le port est mis automatiquement quand vous séléctionnez la case STARTLS" (587) et vous cochez la même case pour le short login > "Add". Dans la section login > "Default Domain" > exemple.fr (ça permettra de ne pas avoir à ce taper le "@exemple" à chaque fois qu'on veut ce connecter.
Une fois terminé, ce déconnecter avec le bouton en haut à droite et revenir à la page de login client en enlevant tout ce qu'il y à après l'adresse du serveur dans l'URL : http:/mail.exemple.fr.
Se connecter. À savoir que c'est au moment de la connexion que la boite mail de l'utilisateur est crée à l'emplacement indiqué dans le fichier 10-mail.conf avec les paramètres renseignés dans le fichier 15-mailboxes.conf.
Expliquer comment configurer Sieve sur Rainloop et mettre des images.
Mise à jour de Rainloop
Le processus n'est pas très compliqué mais il y a un petit détail de merde qui fait facilement perdre du temps si on n'y fait pas attention.
- Télécharger la dernière version de Rainloop
- La décompresser dans le /tmp (3 éléments serons mis en bordel dedans)
- Copier le dossier "rainloop/v/N°VERSION" dans le même répertoire que la version de production (à coté de la version actuelle)
- Remplacer le numéro de version dans /var/www/rainloop/index.php
- Remplacer le numéro de version dans /var/www/data/VERSION
- (c'est là l'astuce) Donner les droits d’exécutions à la nouvelle version :
# chmod -R u+x /var/www/rainloop/rainloop/v/N°VERSION
Messages d'erreurs connus
Cette section regroupe quelques erreurs qui ont été rencontrés lors de la réalisation de cette documentation et observables dans le fichier de log
/var/log/mail.log
loops back to myself
Message :
mail for exemple.fr loops back to myself
Ce fripon m'a bien fait perdre du temps en plus de me faire prononcer des nom d'oiseaux. Il est due au fait que le nom de domaine du champ MX n'est pas renseigné dans le main.cf à au parametre "mydestination". Il faut donc avoir une ligne similaire à celle-ci :
mydestination = exemple.fr, localhost.exemple.fr, localhost
postfix warning: SASL
Message :
postfix warning: SASL: Connect to private/auth failed: No such file or directory
Cette merde ce produit lorsque le service dovecot à un problème (alors pourquoi c'est marqué "postfix warning SASL" ?????? Probablement pour nous induire en erreur...). Pour le régler il faut repasser tout les fichiers modifiés de dovecot au peigne fin. À savoir qu'un modit espace manquant peut générer un plantage du service au démarrage... Là est tout l'intéret de copier chaque fichier de conf avant modification en .old. De cette manière il est possible de revenir en arrière et on à une liste complète des fichiers à modifier en faisan un "ls | grep .old".
Commandes utiles
Débogage
Afficher le contenu des logs relatifs aux services de messagerie
# tail -f /var/log/mail.log
Montrer le contenu du fichier main.cf par défaut (celui que les développeurs on fixés à l'installation). Ce n'est pas l'état du fichier après modifications mais cela permet de remettre les valeurs par défaut si on rencontre des problèmes
# postconf -d
Montrer le contenu actuel du fichier main.cf sans les commentaire (utile pour poser des question dans des forum par exemple)
# postconf -n
Afficher l’ensemble de la configuration de Dovecot
# doveconf -n
ou
# dovecot -n
Gestion de la file d'attente de courrier
La file d'attente de courrier de Postfix (mail queue) est l'endroit où sont stockés les emails en cours d'envoi/récéption ou qui sont revenu au serveur suite à un bounce. Les commandes utiles permettant de la gérer sont les suivantes (tirées de ce document) :
Lister les messages en Queue
# postqueue -p
Supprimer un message en Queue
# postsuper -d DBB3F1A7
Supprimer tous les messages en Queue
# postsuper -d ALL
Mettre un messages en attente (hold)
# postsuper -h DBA3F1A7
Remettre un messages en mode normale (actif)
# postsuper -H DBA3F1A7
Remettre en Queue un message
# postsuper -r DBA3F1A7
Pour tous les messages
# postsuper -r ALL
Afficher le contenu d'un message
# postcat -q DBA3F1A9
Forcer l'envoie des messages en Queue (flush)
# postqueue -f
Glossaire
Sources
Mail queue : https://www.system-linux.eu/index.php?post/2009/01/27/Traitement-de-Queue-mail-Postfix