debconf
. Les réponses permettront de générer un premier fichier /etc/postfix/main.cf
.
@
»). Pour Falcot, la réponse est mail.falcot.com
. C'est la seule question posée en standard, mais elle ne suffit pas pour avoir une configuration satisfaisante, les administrateurs exécutent donc dpkg-reconfigure postfix
afin de pouvoir personnaliser plus de paramètres.
localhost
, mais pas le domaine principal falcot.com
, qu'il faut ajouter manuellement. D'une manière générale, il convient habituellement de donner ici tous les noms de domaines pour lesquels cette machine fait office de serveur MX (c'est-à-dire tous ceux pour lesquels le DNS indique qu'elle est apte à accepter du courrier). Ces informations sont ensuite stockées dans la variable mydestination
du fichier /etc/postfix/main.cf
(principal fichier de configuration de Postfix).
192.168.0.0/16
à la réponse par défaut. Si la question n'est pas posée, il faut modifier le fichier de configuration et y changer la variable mynetworks
, comme on le voit sur l'exemple plus loin.
procmail
peut aussi être proposé pour délivrer le courrier localement. Cet outil permet aux utilisateurs de trier leur courrier entrant, ce pour quoi ils doivent indiquer des règles de tri dans leur fichier ~/.procmailrc
.
Exemple 11.1. Fichier /etc/postfix/main.cf
initial
# See /usr/share/postfix/main.cf.dist for a commented, more complete version # Debian specific: Specifying a file name will cause the first # line of that file to be used as the name. The Debian default # is /etc/mailname. #myorigin = /etc/mailname smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU) biff = no # appending .domain is the MUA's job. append_dot_mydomain = no # Uncomment the next line to generate "delayed mail" warnings #delay_warning_time = 4h readme_directory = no # TLS parameters smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key smtpd_use_tls=yes smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache # See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for # information on enabling SSL in the smtp client. smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination myhostname = mail.falcot.com alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases myorigin = /etc/mailname mydestination = mail.falcot.com, falcot.com, localhost.localdomain, localhost relayhost = mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 192.168.0.0/16 mailbox_command = procmail -a "$EXTENSION" mailbox_size_limit = 0 recipient_delimiter = + inet_interfaces = all inet_protocols = all
virtual_alias_domains
et indiquer le fichier stockant les correspondances d'adresses dans la variable virtual_alias_maps
.
Exemple 11.2. Directives à ajouter au fichier /etc/postfix/main.cf
virtual_alias_domains = marqueafalcot.tm.fr virtual_alias_maps = hash:/etc/postfix/virtual
/etc/postfix/virtual
, décrivant les correspondances, emploie un format relativement simple. Chaque ligne contient deux champs séparés par une série de blancs, dont le premier est le nom de l'alias et le second une liste d'adresses électroniques vers lesquelles il pointe. La syntaxe spéciale @domaine.fr
englobe tous les alias restants d'un domaine.
Exemple 11.3. Exemple de fichier /etc/postfix/virtual
webmaster@marqueafalcot.tm.fr jean@falcot.com contact@marqueafalcot.tm.fr laure@falcot.com, sophie@falcot.com # L'alias ci-dessous est générique, il englobe toutes les # adresses électroniques du domaine marqueafalcot.tm.fr # non employées ailleurs dans ce fichier. # Ces adresses sont renvoyées au même nom d'utilisateur # mais dans le domaine falcot.com @marqueafalcot.tm.fr @falcot.com
virtual_mailbox_domains
et préciser le fichier donnant les boîtes aux lettres avec la variable virtual_mailbox_maps
. Le paramètre virtual_mailbox_base
indique le répertoire sous lequel les différentes boîtes aux lettres seront stockées.
virtual_uid_maps
et virtual_gid_maps
définissent des tables de correspondances entre l'adresse électronique, l'utilisateur et le groupe Unix propriétaire de la boîte aux lettres. Pour indiquer systématiquement le même propriétaire, la syntaxe static:5000
dénote un UID/GID fixe.
Exemple 11.4. Directives à ajouter au fichier /etc/postfix/main.cf
virtual_mailbox_domains = falcot.org virtual_mailbox_maps = hash:/etc/postfix/vmailbox virtual_mailbox_base = /var/mail/vhosts
/etc/postfix/vmailbox
est de nouveau très simple : deux champs séparés par des blancs. Le premier indique une adresse électronique de l'un des domaines virtuels et le second l'emplacement relatif de la boîte aux lettres associée (par rapport au répertoire donné par virtual_mailbox_base). Si le nom de la boîte aux lettres se termine par une barre de division (/
), cette boîte sera stockée au format maildir ; dans le cas contraire, c'est le traditionnel mbox qui sera retenu. Le format maildir emploie un répertoire complet pour représenter la boîte aux lettres et chaque message est stocké dans un fichier. A contrario, une boîte aux lettres au format mbox est stockée dans un seul fichier et chaque ligne débutant par From
(From
suivi d'une espace) marque le début d'un nouveau message électronique.
Exemple 11.5. Fichier /etc/postfix/vmailbox
# le courrier de jean est stocké au format maildir # (1 fichier par courrier dans un répertoire privé) jean@falcot.org falcot.org/jean/ # le courrier de sophie est stocké dans un fichier # "mbox" traditionnel (tous les courriers concaténés # dans un fichier) sophie@falcot.org falcot.org/sophie
smtpd_client_restrictions
contrôle les machines autorisées à communiquer avec le serveur de courrier électronique.
Exemple 11.6. Restrictions en fonction de l'adresse du client
smtpd_client_restrictions = permit_mynetworks, warn_if_reject reject_unknown_client, check_client_access hash:/etc/postfix/access_clientip, reject_rbl_client sbl-xbl.spamhaus.org, reject_rbl_client list.dsbl.org
permit_mynetworks
, placée en tête de la liste des règles, accepte inconditionnellement toute machine du réseau local (tel que défini par la variable mynetworks
dans la configuration).
reject_unknown_client
de warn_if_reject
, qui transforme le refus en simple avertissement enregistré dans les logs. Ils peuvent ainsi surveiller le nombre de messages qui auraient été refusés et décider plus tard d'activer ou non cette règle en connaissant pleinement ses effets.
/etc/postfix/access_clientip
. Une liste blanche permet à l'administrateur de préciser les serveurs de confiance dispensés des règles suivantes.
HELO
(ou EHLO
) suivie du nom du serveur de courrier électronique, dont il est possible de vérifier la validité.
Exemple 11.7. Restrictions sur le nom annoncé lors du EHLO
smtpd_helo_restrictions = permit_mynetworks, reject_invalid_hostname, check_helo_access hash:/etc/postfix/access_helo, reject_non_fqdn_hostname, warn_if_reject reject_unknown_hostname
permit_mynetworks
autorise toutes les machines du réseau local à s'annoncer librement. C'est important car certains logiciels de courrier électronique respectent mal cette partie du protocole SMTP et peuvent donc annoncer des noms fantaisistes.
reject_invalid_hostname
refuse tout courrier dont l'annonce EHLO
indique un nom de machine syntaxiquement incorrect. La règle reject_non_fqdn_hostname
refuse tout message dont le nom de machine annoncé n'est pas complètement qualifié (un nom qualifié inclut le nom de domaine). La règle reject_unknown_hostname
refuse le courrier si la machine annoncée n'existe pas dans la base de données du DNS. Cette dernière règle refusant malheureusement trop de messages, elle est atténuée par le warn_if_reject
pour évaluer son impact avant de décider de l'activer ou non.
permit_mynetworks
au début a l'effet secondaire intéressant de n'appliquer les règles suivantes qu'à des machines extérieures au réseau local. Il est ainsi possible de mettre en liste noire tous ceux qui s'annoncent membres du réseau falcot.com
... ce qui s'effectue en ajoutant la ligne falcot.com REJECT You're not in our network!
au fichier /etc/postfix/access_helo
.
MAIL FROM
du protocole SMTP, information qu'il est possible de vérifier de plusieurs manières.
Exemple 11.8. Vérifications sur l'expéditeur
smtpd_sender_restrictions = check_sender_access hash:/etc/postfix/access_sender, reject_unknown_sender_domain, reject_unlisted_sender, reject_non_fqdn_sender
/etc/postfix/access_sender
associe des traitements particuliers à certains expéditeurs. En général, il s'agit simplement de les placer dans une liste blanche ou noire.
reject_unknown_sender_domain
requiert un domaine d'expéditeur valide, nécessaire à une adresse valide. La règle reject_unlisted_sender
refuse les expéditeurs locaux si leur adresse n'existe pas. Personne ne peut ainsi envoyer de courrier issu d'une adresse invalide dans le domaine falcot.com
. Tout message d'expéditeur tartempion@falcot.com
ne serait donc accepté que si cette adresse existe vraiment.
reject_non_fqdn_sender
refuse les messages en provenance d'adresses électroniques sans nom de domaine complètement qualifié. Concrètement, elle refusera un courrier provenant de utilisateur@machine
: celui-ci doit s'annoncer comme utilisateur@machine.domaine.fr
ou utilisateur@domaine.fr
.
RCPT TO
du protocole SMTP. On pourra également vérifier ces informations, même si c'est moins intéressant que pour l'expéditeur.
Exemple 11.9. Vérifications sur le destinataire
smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination, reject_unlisted_recipient, reject_non_fqdn_recipient
reject_unauth_destination
est la règle de base imposant à tout courrier provenant de l'extérieur de nous être destiné ; dans le cas contraire, il faut refuser de relayer le message. Sans cette règle, votre serveur est un relais ouvert qui permet aux spammeurs d'envoyer des courriers non sollicités par son intermédiaire. Elle est donc indispensable et on la placera de préférence en début de liste pour qu'aucune autre règle ne risque d'autoriser le passage du courrier avant d'avoir éliminé les messages ne concernant pas ce serveur.
reject_unlisted_recipient
refuse les messages à destination d'utilisateurs locaux inexistants (ce qui est logique). Enfin, la règle reject_non_fqdn_recipient
refuse les adresses électroniques non qualifiées. Il est ainsi impossible d'écrire à jean
ou à jean@machine
; il faut employer la forme complète de l'adresse : jean@machine.falcot.com
ou jean@falcot.com
.
DATA
du protocole SMTP précède l'envoi des données contenues dans le message. Elle ne fournit aucune information en soi, mais prévient de ce qui va suivre. Il est pourtant possible de lui mettre en place des contrôles.
reject_unauth_pipelining
refuse le message si le correspondant envoie une commande sans avoir attendu la réponse à la commande précédente. Les robots des spammeurs font régulièrement cela : pour travailler plus vite, ils se moquent des réponses et visent seulement à envoyer un maximum de courriers, dans le laps de temps le plus court.
RCPT TO
(annonce du destinataire).
EHLO
invalide, Postfix connaîtra l'émetteur et le destinataire lorsqu'il annoncera le refus. Il peut donc enregistrer un message de log plus explicite que s'il avait interrompu la connexion dès le début. De plus, beaucoup de clients SMTP ne s'attendent pas à subir un échec sur l'une des premières commandes du protocole SMTP et les clients mal programmés seront moins perturbés par ce refus tardif.
Exemple 11.11. Activation des filtres sur le contenu
header_checks = regexp:/etc/postfix/header_checks body_checks = regexp:/etc/postfix/body_checks
Exemple 11.12. Exemple de fichier /etc/postfix/header_checks
/^X-Mailer: GOTO Sarbacane/ REJECT I fight spam (GOTO Sarbacane) /^Subject: *Your email contains VIRUSES/ DISCARD virus notification
GOTO Sarbacane
(un logiciel d'envoi en masse de courriers), elle refuse le message. La seconde expression contrôle le sujet du message : s'il indique une notification de virus sans intérêt, elle accepte le message mais le supprime immédiatement.
check_policy_service
comme restriction supplémentaire :
smtpd_recipient_restrictions = permit_mynetworks, [...] check_policy_service inet:127.0.0.1:10023
postgrey
et lui envoyer des informations concernant le message concerné. De son côté, Postgrey récupère le triplet (adresse IP, expéditeur, destinataire) et regarde dans sa base de données s'il l'a déjà rencontré récemment. Si oui, il répond en ordonnant d'accepter le message, sinon il répond de le refuser temporairement et enregistre dans sa base de données le triplet en question.
smtpd_restriction_classes
et on les définit par simple affectation tout comme on définirait smtpd_recipient_restrictions
. Ensuite la directive check_recipient_access
permet d'employer une table de correspondances pour définir les restrictions à employer pour un destinataire donné.
Exemple 11.13. Définir des classes de restriction dans main.cf
smtpd_restriction_classes = greylisting, aggressive, permissive greylisting = check_policy_service inet:127.0.0.1:10023 aggressive = reject_rbl_client sbl-xbl.spamhaus.org, check_policy_service inet:127.0.0.1:10023 permissive = permit smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination, check_recipient_access hash:/etc/postfix/recipient_access
Exemple 11.14. Fichier /etc/postfix/recipient_access
# Adresses sans filtrage postmaster@falcot.com permissive support@falcot.com permissive sales-asia@falcot.com permissive # Filtrage agressif pour quelques privilégiés joe@falcot.com aggressive # Règle spéciale pour le robot de gestion de listes sympa@falcot.com reject_unverified_sender # Par défaut, le greylisting falcot.com greylisting
clamav
. En plus du paquet clamav, ils ont installé les paquets arj, unzoo, unrar et lha, qui permettent aussi à l'antivirus d'analyser le contenu d'archives dans l'un de ces formats.
clamav-milter
. Un milter (terme dérivé de l'expression mail filter) est un logiciel de filtrage de courriers spécialement conçu pour s'interfacer avec les serveurs de courrier électronique. Les milters exploitent une interface de programmation (API) dédiée qui assure de bien meilleures performances comparé aux filtres gérés en dehors des serveurs de courrier. Sendmail a été le premier à introduire cette technologie mais Postfix lui a emboîté le pas.
dpkg-reconfigure clamav-milter
, il s'agit de répondre inet:10002@127.0.0.1
à la question portant sur l'interface de communication avec Sendmail.
clamav
convient dans la majorité des situations mais dpkg-reconfigure clamav-base
permet de personnaliser les paramètres les plus importants.
/etc/postfix/main.cf
:
# Virus check with clamav-milter smtpd_milters = inet:[127.0.0.1]:10002
service postfix reload
pour faire prendre en compte cette modification.
saslpasswd2
. L'option -u
précise le domaine d'authentification, il doit correspondre au paramètre smtpd_sasl_local_domain
de Postfix. L'option -c
sert à créer un utilisateur et l'option -f
permet de modifier une base SASL située ailleurs qu'à son emplacement standard (/etc/sasldb2
).
#
saslpasswd2 -h `postconf -h myhostname` -f /var/spool/postfix/etc/sasldb2 -c jean
[... saisir deux fois le mot de passe de jean ...]
/etc/sasldb2
vers la base employée par Postfix. Cela s'effectue avec la commande ln -sf /var/spool/postfix/etc/sasldb2 /etc/sasldb2
.
postfix
dans le groupe sasl
afin qu'il puisse accéder à la base de données des comptes SASL. Ensuite, il faut ajouter quelques paramètres pour activer SASL, puis modifier le paramètre smtpd_recipient_restrictions
pour autoriser les clients authentifiés par SASL à envoyer des courriels à tous les destinataires.
Exemple 11.15. Modification de /etc/postfix/main.cf
pour activer SASL
# Activer l'authentification par SASL smtpd_sasl_auth_enable = yes # Définir le domaine d'authentification SASL employé smtpd_sasl_local_domain = $myhostname [...] # Ajout de permit_sasl_authenticated avant reject_unauth_destination # pour relayer le courrier des usagers authentifiés par SASL smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination, [...]