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. 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 = falcotsbrand.com 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@falcotsbrand.com jean@falcot.com contact@falcotsbrand.com laure@falcot.com, sophie@falcot.com # The alias below is generic and covers all addresses within # the falcotsbrand.com domain not otherwise covered by this file. # These addresses forward email to the same user name in the # falcot.com domain. @falcotsbrand.com @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
file is quite straightforward: two fields separated with whitespace. The first field is an email address within one of the virtual domains, and the second field is the location of the associated mailbox (relative to the directory specified in virtual_mailbox_base). If the mailbox name ends with a slash (/
), the emails will be stored in the maildir format; otherwise, the traditional mbox format will be used. The maildir format uses a whole directory to store a mailbox, each individual message being stored in a separate file. In the mbox format, on the other hand, the whole mailbox is stored in one file, and each line starting with “From
” (From
followed by a space) signals the start of a new message.
Exemple 11.5. Fichier /etc/postfix/vmailbox
# Jean's email is stored as maildir, with # one file per email in a dedicated directory jean@falcot.org falcot.org/jean/ # Sophie's email is stored in a traditional "mbox" file, # with all mails concatenated into one single file 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 adresses électroniques dépourvues 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 assez 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 impérativement 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
# Unfiltered addresses postmaster@falcot.com permissive support@falcot.com permissive sales-asia@falcot.com permissive # Aggressive filtering for some privileged users joe@falcot.com aggressive # Special rule for the mailing-list manager sympa@falcot.com reject_unverified_sender # Greylisting by default 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 courriers électroniques. 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 courriers. 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
/etc/init.d/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
# Enable SASL authentication smtpd_sasl_auth_enable = yes # Define the SASL authentication domain to use smtpd_sasl_local_domain = $myhostname [...] # Adding permit_sasl_authenticated before reject_unauth_destination # allows relaying mail sent by SASL-authenticated users smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination, [...]