Masquer le nom du logiciel dans la bannière SMTP de Postfix
Retire l'identité logicielle de la salutation SMTP en positionnant smtpd_banner = $myhostname ESMTP. Le défaut des distributions ($myhostname ESMTP $mail_name (Ubuntu)) annonce le produit MTA, et souvent le conditionnement, à tout client anonyme qui ouvre une connexion sur le port 25 : c'est de la reconnaissance offerte, qui permet à un attaquant de rapprocher votre MTA d'une liste de vulnérabilités connues avant même d'envoyer une commande.
Vérifié sur l’état résolu en cours d’exécution (ex. sshd -T, sysctl, systemctl show), attrape les drop-ins et Include qu’une lecture de fichier raterait. Réserve : runtime ≠ persistance ; une valeur correcte maintenant peut ne pas survivre à un redémarrage.
Ce que vérifie Pavois
Pavois lit la bannière effective avec postconf -h smtpd_banner et échoue si elle contient encore mail_name. postconf -h affiche la valeur résolue par Postfix, après main.cf et les valeurs par défaut intégrées, la variable $mail_name restant non substituée : sa seule présence dans le gabarit est ce qui divulgue le nom du produit au moment de la connexion. Quand postconf est absent (Postfix non installé), le contrôle renvoie ok.
describe command('if ! command -v /usr/sbin/postconf >/dev/null 2>&1; then echo ok; elif /usr/sbin/postconf -h smtpd_banner 2>/dev/null | grep -qi mail_name; then echo ko; else echo ok; fi') do
its('stdout.strip') { should eq 'ok' }
endComment vérifier qu’elle est appliquée
Lisez le gabarit résolu, puis la salutation que voit un vrai client :
postconf -h smtpd_banner # attendu : $myhostname ESMTP
printf 'QUIT\r\n' | nc localhost 25
La salutation doit afficher 220 hote.example.org ESMTP, sans nom de produit, version ni étiquette de distribution après ESMTP.
Inspecter et investiguer
journalctl -u postfix (ou /var/log/mail.log, /var/log/maillog sur RHEL) enregistre le rechargement qui applique la nouvelle bannière, ainsi que chaque ligne connect from ultérieure. Les balayages de collecte de bannière s'y repèrent : une rafale de connexions qui se déconnectent aussitôt après la salutation, sans jamais émettre de MAIL FROM.
Remédiation
Pavois exécute l'étape postfix-banner : postconf -e 'smtpd_banner = $myhostname ESMTP', avec un sed de dédoublonnage suivi d'un ajout en repli quand postconf manque, puis un rechargement de Postfix. Une garde not_if saute l'étape dès lors que main.cf déclare une bannière exempte de mail_name, ce qui garde confkit harden apply idempotent. $myhostname est conservé à dessein : la RFC 5321 attend que la salutation porte le nom pleinement qualifié du serveur, et plusieurs contrôles antispam rejettent une salutation qui ne le fait pas.
Pavois applique ceci avec son propre moteur harden, le plan ci-dessous, pas un script shell :
| command | mkdir -p /etc/postfix; touch /etc/postfix/main.cf; if command -v postconf >/dev/null 2>&1; then postconf -e 'smtpd_banner = $myhostname ESMTP'; else sed -ri '/^smtpd_banner/d' /etc/postfix/main.cf; echo 'smtpd_banner = $myhostname ESMTP' >> /etc/postfix/main.cf; fi; systemctl reload postfix 2>/dev/null || true |
|---|---|
| name | postfix-banner |
| not_if | grep -qs '^smtpd_banner' /etc/postfix/main.cf && ! grep '^smtpd_banner' /etc/postfix/main.cf | grep -qi mail_name |
| resource | exec |
pavois harden plan localoù la cible est local, un alias SSH user@hôte, ou un conteneur , Docs
Impact & précautions
Défense en profondeur, pas un correctif : masquer la bannière ne corrige rien, cela ne fait qu'augmenter le coût du ciblage. Le risque opérationnel est minime, mais vérifiez tout ce qui analyse la salutation : certaines sondes de supervision, tests de relais et règles antispam héritées s'appuient sur le nom du produit et devront être mises à jour. La bannière conserve son nom d'hôte et le mot-clé ESMTP : la conformité au protocole et les vérifications de DNS inverse ne sont pas affectées.