Sécuriser Postfix
Restrictions sur l’émetteur
1. Contrôle des adresses pour les utilisateurs authentifiés
1.2. Présentation
Compatible uniquement avec les serveur smtp Postfix dont l’authentification est activée.
- Par défaut, les utilisateurs disposant d’un compte de messagerie sur le serveur, peuvent envoyer des messages en utilisant n’importe quel adresse mail. Voici un exemple :
root@alice.lan: > telnet 10.0.0.44 25
Trying 10.0.0.44…
Connected to 10.0.0.44.
Escape character is ‘^]’.
220 alice.lan ESMTP Postfix
AUTH LOGIN YWxpY2U=
334 UGFzc3dvcmQ6
YWxpY2U=
235 2.7.0 Authentication successful
mail from:<cache@fictif.tld>
250 2.1.0 Ok
rcpt to:<nicolas@cachelou.fr>
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
test
.
250 2.0.0 Ok: queued as 7CBDD62846
quit
221 2.0.0 Bye
Connection closed by foreign host.
- Dans la commande ci-dessus, un courriel a pus être envoyé depuis le compte smtp de alice vers l’adresse mail nicolas@cachelou.fr en « présentant » comme adresse d’émetteur cache@fictif.tld.
1.2. Mise en place de la stratégie
Pour éviter tout abus et toute usurpation d’adresse de courriel, il est nécessaire de mettre en place des restrictions sur l’adresse mail de l’émetteur. Pour cela, il sera nécessaire d’utiliser une table de correspondance mettant en relation le compte de messagerie et l’adresse de courriel autorisée à être utilisée.
- Editer le fichier de configuration /etc/postfix/main.cf puis ajouter la ligne ci-dessous. Le paramètre smtpd_sender_login_maps permet d’indiquer l’emplacement de la table de correspondance sur le serveur de messagerie.
smtpd_sender_login_maps = hash:/etc/postfix/sender_login
- Juste après la ligne :
smtpd_helo_restrictions =
__reject_unknown_helo_hostname
- Juste en dessous de ce paramètre, ajouter les lignes ci-dessous. Ces lignes indiquent à Postfix de vérifier systématiquement la correspondance entre l’adresse de l’émetteur et le login du compte mail utilisé via la table de correspondance sender_login :
smtpd_sender_restrictions =
__permit_mynetworks
__reject_sender_login_mismatch
1.3. Ajouter une entrée dans la table
- Dans cette exemple, nous allons ajouter la ligne suivante au fichier sender_login :
alice@mail.glx__________alice
- Ici, on autorise le compte de messagerie alice à envoyer des courriels avec l’adresse de messagerie alice@mail.glx.
- Pour que cette configuration soit applicable, il est nécessaire de régénérer la base avec la commande postconf :
root@alice.lan:/etc/postfix # postmap sender_login
- Puis, de redémarrer le serveur de messagerie Postfix :
root@alice.lan:/etc/postfix # service postfix restart
1.4. Tester la restriction
- Suite à l’application des paramètres, tentons de renvoyer un courriel depuis le compte de messagerie alice en utilisant une adresse fictive :
root@alice.lan: > telnet 10.0.0.44 25
Trying 10.0.0.44…
Connected to 10.0.0.44.
Escape character is ‘^]’.
220 alice.lan ESMTP Postfix
AUTH LOGIN YWxpY2U=
334 UGFzc3dvcmQ6
YWxpY2U=
235 2.7.0 Authentication successful
mail from:<cache@fictif.tld>
250 2.1.0 Ok
rcpt to:<nicolas@cachelou.fr>
553 5.7.1 <cache@fictif.tld>: Sender address rejected: not owned by user alice@mail.glx
- La tentative d’envoi est rejetée par le serveur de messagerie Postfix. Ce dernier indique que l’adresse de messagerie de l’émetteur n’est pas permise pour l’utilisateur alice.
2. Contrôle du domaine de messagerie pour les courriers entrants
2.1. Présentation
Lorsque le serveur de messagerie Postfix traite des messages électroniques en provenance de l’extérieur, il est possible de vérifier si ces émetteurs se présentent avec une adresse de messagerie valide. Deux contrôles peuvent êtres activés sur le serveur :
- Vérification de la synthaxe du domaine de messagerie utilisé dans l’adresse de l’expéditeur (du type mon-domaine.tld).
- Vérification de la présence d’enregistrement DNS de type MX pour le domaine de messagerie présenté.
2.2. Configuration
- Editer le fichier de configuration /etc/postfix/main.cf, puis ajouter les lignes :
smtpd_recipient_restrictions =
__reject_non_fqdn_sender,
__reject_unknown_sender_domain
- Après les lignes :
smtpd_sender_restrictions =
__permit_mynetworks
__reject_sender_login_mismatch
- Puis, de redémarrer le serveur de messagerie Postfix :
root@alice.lan: # service postfix restart
2.3. Tester la configuration
- Depuis un serveur de messagerie tierce (dans l’exemple, Geocoucou), envoyons un courriel depuis une adresse de messagerie fictive composé d’un nom d’hôte, vers l’adresse de messagerie alice@mail.glx :
root@geocoucou: # telnet 10.0.0.49 25
Trying 10.0.0.49…
Connected to 10.0.0.49.
Escape character is ‘^]’.
220 geocoucou.net.ncad.fr ESMTP Postfix (GLX-LNN46/Angius)
mail from:
250 2.1.0 Ok
rcpt to:alice@mail.glx
250 2.1.5 Ok
data
354 End data with .
test
.
250 2.0.0 Ok: queued as 1EAF620F9E
- Maintenant, vérifions le fichier de journalisation du serveur de messagerie Postfix hébergeant la boîte de messagerie alice@mail.glx :
Feb 2 14:22:05 alice postfix/smtpd[9659]: NOQUEUE: reject: RCPT from geocoucou.net.ncad.fr[10.0.0.49]: 504 5.5.2
<inconnu@existe-pas>: Sender address rejected: need fully-qualified address; from=<inconnu@existe-pas> to=alice@mail.glx
proto=ESMTP helo=<geocoucou.net.ncad.fr>
- Dans le fichier de journalisation il y a bien une entrée correspondant au courriel envoyé depuis le serveur de messagerie Geocoucou. Cependant, il a été refusé par le serveur de messagerie Postfix au motif que l’adresse de l’expéditeur est incomplète.
- Depuis un serveur de messagerie tierce (dans l’exemple, Geocoucou), envoyons un courriel depuis une adresse de messagerie fictive composé d’un nom de domaine invalide, vers l’adresse de messagerie alice@mail.glx :
root@geocoucou: # telnet 10.0.0.49 25
Trying 10.0.0.49…
Connected to 10.0.0.49.
Escape character is ‘^]’.
220 geocoucou.net.ncad.fr ESMTP Postfix (GLX-LNN46/Angius)
mail from:<inconnu@existe-pas.tld>
250 2.1.0 Ok
rcpt to:<alice@mail.glx>
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
test
.
250 2.0.0 Ok: queued as 1F99B20F7F
- Maintenant, vérifions le fichier de journalisation du serveur de messagerie Postfix hébergeant la boîte de messagerie alice@mail.glx :
Feb 2 13:38:14 alice postfix/smtpd[9319]: NOQUEUE: reject: RCPT from geocoucou.net.ncad.fr[10.0.0.49]: 450 4.1.8 <inconnu@existe-pas.tld>: Sender address rejected: Domain not found; from=<inconnu@existe-pas.tld> to=<alice@mail.glx> proto=ESMTP helo=<geocoucou.net.ncad.fr>
- Dans le fichier de journalisation il y a bien une entrée correspondant au courriel envoyé depuis le serveur de messagerie Geocoucou. Cependant, il a été refusé par le serveur de messagerie Postfix au motif que le domaine de messagerie de l’expéditeur n’existe pas.
3. Filtrage des courriels
3.1. Configuration de Postfix
Il est possible d’effectuer du filtrage sur les courriels reçus avec Postfix. La méthode de filtrage utilisée est basée sur une liste noire. Les adresses de messagerie ou noms de domaine contenus dans cette liste seront bloqués à la réception d’un courriel en provenance de ces adresses.
- Depuis le fichier de configuration /etc/postfix/main.cf, modifier la ligne :
smtpd_recipient_restrictions =
__reject_non_fqdn_sender,
__reject_unknown_sender_domain
- Par :
smtpd_recipient_restrictions =
__reject_non_fqdn_sender,
__reject_unknown_sender_domain,
__check_sender_access hash:/etc/postfix/block_recipient
- Puis, de redémarrer le serveur de messagerie Postfix :
root@alice.lan: # service postfix restart
3.2. Configuration de la liste noire
Pour illustrer un cas pratique, nous allons mettre en liste noire l’adresse de messagerie nicolas.cachelou@ncad.local.
- Créer le fichier block_recipient à la racine /etc/postfix et y insérer la ligne suivante :
nicolas.cachelou@ncad.local__________REJECT
- Générer le fichier de base à l’aide de la commande postmap :
root@alice.lan: # postmap /etc/postfix/block_recipient
- Redémarrer le service Postfix pour prendre en compte les modifications :
root@alice.lan: # service postfix restart