Cette partie est assez complexe car la elle nécessite de nombreux serveurs interconnecté entre eux. Afin de garantir la réputation de l'IP publique du serveur il faut toujours veiller à ne pas relayer n'importe quel mail. Dans le cas contraire le serveur servira de relai spam et sera rapidement blacklisté.
Pour la mise en place du mail nous allons déployer un serveur Postfix associé à un serveur Dovecot. Afin de séparer les comptes système des comptes mails, l'authentification de Postfix sera déléguée par LMTP à Dovecot qui utilisera un fichier plat comme base d'authentification.
Pour démarrer il faut installer les packages dovecot postfix.
Dovecot
Nous allons conserver la configuration séparée dans différents fichiers.
Fichier 10-auth.conf
Dans le fichier /usr/local/etc/dovecot/conf.d/10-auth.conf
auth_username_format = %Ln
auth_mechanisms = plain login digest-md5 cram-md5
!include auth-passwdfile.conf.ext
Et le fichier /usr/local/etc/dovecot/conf.d/auth-passwdfile.conf.ext doit contenir à minima les lignes suivantes:
passdb {
driver = passwd-file
args = scheme=SHA256-CRYPT username_format=%u /usr/local/etc/dovecot/users
}
userdb {
driver = passwd-file
args = username_format=%u /usr/local/etc/dovecot/users
# Default fields that can be overridden by passwd-file
#default_fields = quota_rule=*:storage=1G
}
Ainsi le fichier /usr/local/etc/dovecot/users sera composé d'une ligne par compte, chaque ligne aura la structure suivante :
identifiant:Algorithme et hash du mot de passe:uid:guid::chemin vers le répertoire personnel de mails::
pour le champ "Algorithme et hash du mot de passe" on utilise la commande suivant pour obtenir la valeur:
doveadm pw -s SHA512-CRYPT
ce qui à titre d'exemple donne :
john:{SHA512-CRYPT}$6$NghdlFQTiFoQjAaU$SxdtT3Ax4/B44Jkgc7cebfWV3WmNWq/PstM1Dugn66Bgw7i9ppHmWXPAF10DsjTWKmBVZr0xSV8soApsonU8R.:3000:3000::/usr/local/srv/mails/john::
Pour ceux qui se posent la question, le mot de passe utilisé est "john".
Fichier 10-master.conf
Le fichier /usr/local/etc/dovecot/conf.d/10-master.conf contient tout les paramétrages pour les différents protocoles écoutés par le serveur Dovecot.
service imap-login {
inet_listener imap {
port = 143
}
inet_listener imaps {
port = 993
ssl = yes
}
# Number of connections to handle before starting a new process. Typically
# the only useful values are 0 (unlimited) or 1. 1 is more secure, but 0
# is faster. <doc/wiki/LoginProcess.txt>
#service_count = 1
# Number of processes to always keep waiting for more connections.
#process_min_avail = 0
# If you set service_count=0, you probably need to grow this.
#vsz_limit = $default_vsz_limit
}
service pop3-login {
inet_listener pop3 {
port = 110
}
inet_listener pop3s {
port = 995
ssl = yes
}
}
service submission-login {
inet_listener submission {
port = 587
}
inet_listener submissions {
port = 465
}
}
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
group = postfix
mode = 0600
user = postfix
}
# Create inet listener only if you can't use the above UNIX socket
#inet_listener lmtp {
# Avoid making LMTP visible for the entire internet
#address =
#port =
#}
}
service imap {
# Most of the memory goes to mmap()ing files. You may need to increase this
# limit if you have huge mailboxes.
#vsz_limit = $default_vsz_limit
# Max. number of IMAP processes (connections)
#process_limit = 1024
}
service pop3 {
# Max. number of POP3 processes (connections)
#process_limit = 1024
}
service submission {
# Max. number of SMTP Submission processes (connections)
#process_limit = 1024
}
service auth {
# Postfix smtp-auth
unix_listener /var/spool/postfix/private/auth {
mode = 0600
user = postfix
group = postfix
}
# Auth process is run as this user.
user = $default_internal_user
}
service auth-worker {
# Auth worker process is run as root by default, so that it can access
# /etc/shadow. If this isn't necessary, the user should be changed to
# $default_internal_user.
#user = root
}
service dict {
# If dict proxy is used, mail processes should have access to its socket.
# For example: mode=0660, group=vmail and global mail_access_groups=vmail
unix_listener dict {
#mode = 0600
#user =
#group =
}
}
Fichier 10-mail.conf
Dans le fichier /usr/local/etc/dovecot/conf.d/10-mail.conf il faut mettre la valeur suivante :
mail_location = maildir:~/Maildir
On utilise ainsi un sous répertoire Maildir dans chaque répertoire racine des utilisateurs Dovecot.
Fichier 10-ssl.conf
Dans le fichier /usr/local/etc/dovecot/conf.d/10-ssl.conf il suffit de mettre les lignes suivantes :
ssl = yes
ssl_cert = </usr/local/etc/letsencrypt/live/XXXXXX/cert.pem
ssl_key = </usr/local/etc/letsencrypt/live/XXXXXX/privkey.pem
Adaptez en fonction de votre installation.
Ajouter le démarrage automatique du service dovecot : sysrc dovecot_enable="YES"
Postfix
Il faut tout d'abord comprendre que les serveurs de mails sont très scruté tant par des personnes malveillantes pour tenter d'envoyer des spams que par les listes noires de serveurs de spam. Aussi il faut toujours faire attention et tant que le serveur n'est pas sécurisé, pensez à arrêter le service.
Fichier main.cf
Dans le fichier /usr/local/etc/postfix/main.cf
mail_owner = postfix
compatibility_level=3.6
unknown_local_recipient_reject_code = 550
mynetworks_style = host
myhostname = mail.XXXXXX.tld
mydomain = XXXXXX.tld
myorigin = $mydomain
mydestination = $myhostname $mydomain localhost.$mydomain localhost
local_recipient_maps =
mynetworks_style = host
inet_interfaces = all
inet_protocols = all
local_transport = lmtp:unix:private/dovecot-lmtp
virtual_mailbox_domains = YYYYYY.tld
#virtual_mailbox_base = /usr/local/srv/mails
#virtual_mailbox_maps = passwd:/usr/local/etc/dovecot/users
virtual_transport = lmtp:unix:private/dovecot-lmtp
virtual_alias_maps = hash:/usr/local/etc/postfix/virtual
virtual_alias_domains = $virtual_alias_maps
smtpd_banner = $myhostname ESMTP $mail_name
smtpd_tls_chain_files = /usr/local/etc/postfix/ssl/ecdsa.pem
smtpd_tls_CApath = /etc/ssl/certs
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtpd_tls_ciphers = high
smtpd_tls_security_level = may
smtpd_tls_mandatory_protocols = >=TLSv1.2
smtpd_tls_exclude_ciphers = NULL, MD5, DES, RC4
smtpd_recipient_restrictions = permit_sasl_authenticated permit_inet_interfaces reject_unauth_destination
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_relay_restrictions = permit_sasl_authenticated permit_mynetworks permit_inet_interfaces reject_unauth_destination
smtp_tls_CApath = /etc/ssl/certs
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtp_tls_mandatory_ciphers = high
smtp_tls_mandatory_protocols = >=TLSv1.2
smtp_tls_note_starttls_offer = no
smtp_tls_exclude_ciphers = NULL, MD5, DES, RC4
smtp_tls_security_level = may
smtp_tls_note_starttls_offer = no
Le champ smtpd_relay_restriction est essentiel car c'est lui qui protège votre serveur de faire serveur relais. Dans mon exemple il s'agit bien d'un serveur autonome. Selon la complexité de votre infrastructure mail cela peut s'avérer totalement différent.
Le champ smtpd_tls_chain_files est celui à utiliser pour charger les certificats et ce quelques soit l'algorithme utilisé ( RSA, ECDSA, etc ... ). Les fichier doivent être composés de la clef privée suivie du certificat lui-même.
Attention, le domaine $mydomain ne doit pas être présent dans $virtual_mailbox_domains.
Fichier master.cf
Dans le fichier /usr/local/etc/postfix/master.cf
smtp inet n - n - - smtpd
submission inet n - n - - smtpd
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_sasl_type=dovecot
-o smtpd_sasl_path=private/auth
-o smtpd_sasl_security_options=noanonymous
-o smtpd_sasl_local_domain=$myhostname
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
-o smtpd_sender_login_maps=hash:/usr/local/etc/postfix/controlled_envelope_senders
# -o smtpd_sender_restrictions=reject_sender_login_mismatch,reject_non_fqdn_sender
# -o smtpd_recipient_restrictions=reject_non_fqdn_recipient,reject_unknown_recipient_domain,permit_sasl_authenticated,reject
smtps inet n - y - - smtpd
-o syslog_name=postfix/smtps
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
Il faut ensuite générer les table de hash à partir de fichiers plats, pour cela on utilise la commande :
postmap /usr/local/etc/postfix/virtual
Ajouter le démarrage automatique du service postfix : sysrc postfix_enable="YES"
Spamassasin
A VENIR UN JOUR !
SPF DKIM DMARC
A VENIR UN JOUR !
https://www.malekal.com/installer-configurer-postfix-spf-dkim-dmarc/#Configurer_OpenDKIM
https://linux-audit.com/postfix-hardening-guide-for-security-and-privacy/#incoming-email-configuration