**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.**

# Howto Postfix

Le MTA (Mail Transport Agent) est l'élément principal d'un serveur de courriers électroniques. Tout courrier électronique transite forcément par un MTA. Il existe de nombreux MTA, appelés plus communément "serveurs mail". L'une des implémentations la plus connue est sendmail, qui est Open Source (écrit sous Sendmail license). Les alternatives sont les logiciels Postfix (écrit sous IBM PUBLIC LICENSE Version 1.0), Exim (écrit sous GNU General Public License), Qmail (distribué avec des restrictions), Courier (écrit sous GNU General Public License) ainsi que des logiciels propriétaires tels que Microsoft Exchange, Sun Java System Messaging Server, IBM Lotus Domino, etc.

Postfix est un logiciel écrit par Wietse Venema, un chercheur d'IBM, en alternative au fameux sendmail. Placé sous IBM PUBLIC LICENSE Version 1.0, sa première version date de 1998. Il a été conçu pour être sûr, rapide et facile à administrer. À l'heure où ces lignes sont écrites, la version stable est la version 2.7.

## Sommaire

* Installation
* Configuration de base
* Restrictions
* Authentification SMTP
* Support SSL/TLS
* Fichier main.cf détaillé
* Maintenance
* Utilisation avec un annuaire LDAP
* Postfix dans un chroot

## Installation

Postfix s'installe sur de nombreux systèmes (de nombreux UNIX, Linux, etc.) à partir des sources. Il existe un bon nombre d'extensions disponibles (Berkeley DB, LDAP, MySQL, PCRE, PostgreSQL, SASL, TLS, IPv6). Des paquets existent pour de nombreux systèmes (distributions Linux, *BSD, Mac OS X, Solaris, HP-UX, etc.).

Sous Debian, on fera :

~~~
# aptitude install postfix
~~~

## Configuration minimale 

Il faut avoir à l'esprit que Postfix, au contraire de Sendmail, n'a pas une architecture monolithique. En effet, par défaut, seul le processus master tourne en permanence et gère le démarrage d'autres processus qui ont des tâches dédiées (cleanup, smtpd, pickup, etc.) notamment la transition entre les différentes files d'attente de Postfix (incoming, active, deferred, corrupt, hold). La configuration de ces processus se trouve dans le fichier _master.cf_. Pour une configuration de base, il n'est pas utile d'éditer ce fichier.

La configuration générale de Postfix se trouve dans le fichier _main.cf_ dont voici un exemple (très) minimal :

~~~
command_directory = /usr/sbin
daemon_directory = /usr/lib/postfix
myhostname = [FQDN]
alias_maps = hash:/etc/aliases
~~~

[FQDN] correspond au nom de la machine complété du domaine auquel elle appartient. Par exemple hote.example.com est un nom d'hôte pleinement qualifié. Il faut absolument préciser un nom d'hôte pleinement qualifié (FQDN) à la variable myhostname si la commande hostname renvoie le nom d'hôte de la machine sans le domaine.

Il faut s'assurer que la base de données d'aliases existe, c'est-à-dire que le fichier _/etc/aliases_ existe (même vide, mais il est conseillé au minimum de l'utiliser pour les comptes système). Voici un exemple :

~~~
root: jdoe
abuse: root
noc: root
security: root

postmaster: msmith
MAILER-DAEMON: postmaster

daemon: /dev/null
bin: /dev/null
sys: /dev/null
~~~

Ensuite, il faut générer la base de données _aliases_ à l'aide de la commande _newaliases_. Le paramètre _alias_maps_ contient normalement par défaut _nis:mail.aliases_. Il faut donc préciser ce paramètre dans le fichier (très) minimal si l'on n'utilise pas NIS, sous peine d'obtenir des messages suivants : _warning: dict_nis_init: NIS domain name not set - NIS lookups disabled_

Avec cette configuration minimale, Postfix fonctionne. Pour une utilisation un peu plus aisée, vous pouvez préciser quelques paramètres supplémentaires :

~~~
mydestination = $myhostname solaris localhost
localhost.[domain.tld] 127.0.0.1 [adresses IP]
~~~

[domain.tld] correspond au domaine auquel la machine appartient et [adresses IP] est la liste des adresses IPv4 attachées aux interfaces de la machine sur lesquelles le serveur mail écoute. La paramètre mydestination permet de spécifier à Postfix la liste des noms et des adresses IP qu'il devra considérée comme locale. Ainsi, si vous envoyez un message avec une adresse non présente dans cette liste (mais pointant pourtant vers la machine), vous obtiendrez l'erreur suivante : mail for [adresse_non_listee] loops back to myself et le message ne sera pas délivré.
Restrictions

Pour de multiples raisons, il n'est pas question d'autoriser n'importe qui à envoyer un courrier électronique n'importe où. Il faut restreindre les courriers entrants à cause des courriers électroniques non sollicités, ainsi que les courriels sortants pour éviter que le service soit utilisé par des personnes non-dignes de confiance.

On peut avoir des restrictions à différents niveaux :

~~~
smtpd_client_restrictions  	Rejete toutes les commandes du client
smtpd_helo_restrictions  	Rejete les informations HELO/EHLO
smtpd_sender_restrictions  	Rejete l'information MAIL FROM
smtpd_recipient_restrictions  	Rejete l'information RCPT TO
smtpd_data_restrictions  	Rejete la commande DATA
smtpd_etrn_restrictions  	Rejete la commande ETRN
~~~

Les restrictions que l'on pourra imposer le seront par des tables d'accès, contrôle de la syntaxe utilisée, élements de la transaction, vérification DNS, RDNSBL, etc. Elles permettront d'exclure certains clients non désirables (non respect des normes de l'échange avec le serveur, adresses IP non résolues, etc.) et de permettre à d'autres d'envoyer des courriers à n'importe qui (authentification par adresses IP). Voici quelques arguments :

* check_X_access type:table où X = client, helo, recipient ou sender
* permit_X où X = auth_destination, mynetworks, mx_backup
* reject_X où X = unauth_destination, invalid_hostname, non_fqdn_hostname, non_fqdn_recipient, non_fqdn_sender, unauth_pipeling, unknown_client, unknown_hostname, unknown_recipient_domain, unknown_sender_domain

Ainsi, chaque serveur impose ses restrictions selon les contraintes imposées. Des restrictions raisonnables peuvent être :

~~~
mynetworks = 127.0.0.0/8,[::1]/128
smtpd_client_restrictions = permit_mynetworks, permit_sasl_authenticated,
    reject_unauth_destination, check_client_access hash:/etc/postfix/acces_client
smtpd_helo_restrictions = reject_invalid_hostname
smtpd_sender_restrictions = check_sender_access hash:/etc/postfix/acces_expediteur
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
~~~


## Fichier _main.cf_ détaillé 

On rappelle que la configuration principale de Postfix se trouve dans le fichier _main.cf_

Nous allons découper ce fichier en plusieurs sections afin d'en détailler les options.

### Section : Emplacements

~~~
## fichier principal de configuration de Postfix
## commentaires de Gregory Colpart reg AT evolix DOT fr
## version 1.0 : 1ere version publique (05.04.2010)

########################
# Section : Emplacements
########################

# Repertoire ou se trouvent les commandes de postfix [OBLIGATOIRE]
#par defaut, = $program_directory
command_directory = /usr/sbin

# Repertoire ou se trouvent les demons de postfix [OBLIGATOIRE]
#par defaut, = $program_directory
daemon_directory = /usr/lib/postfix

# Variable pour indiquer les emplacements des commandes et demons de postfix
#program_directory = /usr/lib/postfix

# Repertoire contenant les fichiers de boites aux lettres
#par defaut, = /var/mail
#mail_spool_directory =

# Repertoire de la file d'attente de postfix
#par defaut, = /var/spool/postfix
#queue_directory = 

# Boites aux lettres
#par defaut, =
home_mailbox = Maildir/

# Transmettre les mails a un MDA
#par defaut, =
#mailbox_command = /usr/bin/procmail

# Separateur entre noms d'utilisateur et extensions d'adresse
# mettre + pour intégration avec amavis
#par defaut, =
recipient_delimiter = +

# Controle si le repertoire existe (souvent pour les systemes de fichiers montes)
#par defaut, = no
#require_home_directory =

# Commande pour transmettre le courrier a un MDA
#par defaut, =
#mailbox_command = /usr/bin/procmail

# Banniere SMTP affichee
#par default, = $myhostname ESMTP $mail_name
smtpd_banner = $myhostname ESMTP mail server

# Groupe des commandes set-gid ayant des acces en ecriture
#par defaut, = postdrop
# setgid_group = postdrop

# Produire des "biff notifications" aux utilisateurs pour
# prevenir de l'arrivee de nouveaux mails
# par default, = yes
#biff = no
~~~

### Section : domaines

~~~
####################
# Section : domaines
####################

# Indique le nom d'hote pleinement qualifie ou se trouve postfix [OBLIGATOIRE]
#par defaut, = [retour de la commande Unix hostname]
myhostname = computer.example.com

# Variable indiquant le domaine dans lequel se trouve la machine
#par defaut, = [partie domain de la variable $myhostname]
#mydomain =

# Liste des noms de domaine (ou IP) consideres comme local
#par defaut, = $myhostname, localhost.$mydomain, localhost
mydestination = $myhostname

# Indique le domaine apparaissant dans le courrier envoye
#par defaut, = $myhostname
myorigin = example.com

# Liste de domaine fonctionnant UNIQUEMENT avec des alias virtuels
#par defaut, = $virtual_alias_maps
virtual_alias_domains = [ domaines avec alias virtuels ]

# Liste de domaine fonctionnant avec des comptes virtuels
#par defaut, = $virtual_mailbox_maps
virtual_mailbox_domains = [ domaines avec comptes virtuels ]

# Repertoire de base de l'espace de stockage
#par defaut, =
virtual_mailbox_base = /

# Ajoute $mydomain aux adresse ne compoirtant que la partie hote sans le domaine
#par defaut, = yes
#append_dot_mydomain = no

# Ajoute $myorigin aux adresses ne comportant pas de composante de domaine
#par defaut, = yes
#append_at_myorigin = no

# Liste de domaines cachant des sous-domaines internes
#par defaut, =
#masquerade_domains = 

# A l'exception de certains comptes :
#par defaut, =
#masquerade_exceptions = root, admin

# Champs d'application de la reecriture des sous-domaines caches
#par defaut, = envelope_sender, header_sender, header_recipient
#masquerade_classes =

# Sites eligibles pour un vidage rapide (postqueue -s [domain.tld])
#par defaut, = $relay_domains
#fast_flush_domains = 

# Interfaces sur lesquelles ecoutent postfix
#par defaut, = all
#inet_interfaces = all

# Envoyer les mails avec une IP spécifique
smtp_bind_address = 192.168.1.1

# Adresse IP externe du firewall/proxy si derriere NAT ou proxy
# evite principalement les boucles si MX secondaire et MX primaire indisponible
#par defaut, =
#proxy_interfaces = [adresse IP]

# Domaines acceptes pour faire relai (MX 2aire)
#relay_domains = [domaine a relayer] 
~~~

### Section : base de donnees

~~~
###########################
# Section : base de donnees
###########################

# Liste des bases de donnees utilisees par l'agent de distribution locale
# Pour regenerer une base de donnees : postalias /etc/aliases (par ex)
#par defaut, = hash:/etc/aliases, nis:mail.aliases
alias_maps = hash:/etc/aliases hash:/etc/postfix/liste_diff ldap:ldapaliases

# Liste des bases de donnees locales 
# Pour regenerer avec newaliases
#par defaut, = hash:/etc/aliases
alias_database = hash:/etc/aliases hash:/etc/postfix/liste_diff

# Chemin vers la commande newaliases
#par defaut, = /usr/bin/newaliases
#newaliases_path =

# Base de donnes d'alias virtuels
# ne pas oublier : postmap /etc/postfix/virtual
#par defaut, = $virtual_maps
virtual_alias_maps = hash:/etc/postfix/virtual

# Base de donners des boites virtuelles
# ne pas oublier : postmap /etc/postfix/vmailbox
#par defaut, = 
virtual_mailbox_maps = hash:/etc/postfix/vmailbox

# Reecriture des adresses
#par defaut, =
#canonical_maps = hash:/etc/postfix/canonical

# Reecriture des adresses a l'arrivee (ecrase $canonical_maps)
#par defaut, =
#recipient_canonical_maps = hash:/etc/postfix/canonical

# Reecriture des adresses au depart
#par defaut, =
#sender_canonical_maps = hash:/etc/postfix/canonical

# Adresses changees
#relocated_maps = hash:/etc/postfix/relocated

# Boite pour receptionner tous les utilisateurs inconnus
#luser_relay = spam

# Liste de base de donnees contenant les adresses locales permettant de rejeter les messages aux utilisateurs inconnus
# (sera nulle pour recuperer les courriels vers les utilisateurs inconnus)
#par defaut, = proxy:unix:passwd.byname $alias_maps
#local_recipient_maps =

# MAILING-LIST nommee xx
# dans le fichier /etc/aliases :
# xx: user1@domain1 user2@domain2 etc.
# owner-xx: admin@domain
# Utiliser ou non l'alias xx-owner comme adresse d'enveloppe d'expedition
#par defaut, = yes
#owner_request_special = 

# Utiliser l'adresse relle de l'admin au lieu de xx-owner
#par defaut, = no
#expand_owner_alias =
~~~

### Section : paramètres de la file d'attente

~~~
###########################################
# Section : parametres de la file d'attente
###########################################

# Lorsqu'un message n'a pas ete delivre, Postfix adjoint une marque indiquant le moment ou la prochaine tentaive pourra avoir lieu

# Delai au-dela duquel les messages non delivres seront renvoyes a l'expediteur
#par defaut, = 5d
#maximal_queue_lifetime = 

# Intervalle de temps ou postfix examinera la file 
# Il examine notamment la file deferred pour voir si de NOUVEAUX messages sont arrives
# Il faut aussi que la marque indique qu'ils soient prets
#par defaut, = 1000s
#queue_run_delay = 

# A chaque echec, le delai de la prochaine distribution double, avec les restrictions suivantes :
# Delai minimal
#par defaut, = 1000s
#minimal_backoff_time = 
# Delai maximal
#par defaut, = 4000s
#maximal_backoff_time =

# Si maxproc est vide (master.cf), nombre maximal est :
#par defaut, = 100
#default_process_limit = 

# Nombre maximal de destinataires stockes en memoire par qmgr pour un transport particulier
#par defaut, = 10000
#default_recipient_limit =

# Nombre limitant de messages envoyes simultanement INITIALEMENT pour une destination particuliere
# (forcement majoree par maxproc du master.cf ou $default_process_limit)
#par defaut, = 5
#initial_destination_concurrency =

# Une fois ces messages distribues, si il reste des messages dans la file d'attente pour cette destination
# particuliere, postfix augmente le nombre de tentative tant qu'il ne detecte pas de probleme avec
# la destination, avec la limite suivante :
#par defaut, = 20
#default_destination_concurrency_limit = 

# Cette limite peut etre differente selon le type de transport utilise :
#par defaut, = $default_destination_concurrency_limit
#lmtp_destination_concurrency_limit = 
#par defaut, = 2
#local_destination_concurrency_limit = 
#par defaut, = $default_destination_concurrency_limit
#relay_destination_concurrency_limit = 
#par defaut, = $default_destination_concurrency_limit
#smtp_destination_concurrency_limit = 
#par defaut, = $default_destination_concurrency_limit
#virtual_destination_concurrency_limit = 

# On peut aussi limiter le nombre maximum de destinataire pour un meme message
# Si le nombre de destinataire depasse la limite, postfix divise en groupe d'adresses plus petites et envoie des copies distinctes du message
#par defaut, =  10000
#default_destination_recipient_limit =
#par defaut, = $default_destination_recipient_limit
#lmtp_destination_recipient_limit = 
#par defaut, = 1
#local_destination_recipient_limit = 
#par defaut, = 20000
#qmgr_message_recipient_limit = 
#par defaut, = $default_destination_recipient_limit
#relay_destination_recipient_limit = 
#par defaut, = $default_destination_recipient_limit
#smtp_destination_recipient_limit = 
#par defaut, = 1000
#smtpd_recipient_limit = 
#par defaut, = $default_destination_recipient_limit
#virtual_destination_recipient_limit =

# Nombre maximum de destinataires pour un transport lorsque priorite superieure de transport
#par defaut, = 1000
#default_extra_recipient_limit = 

# Types d'incidents a rapporter
# resource : message non delivre pour probleme de ressource
# software : message non delivre pour probleme de logiciels 
# policy   : envoie le transcription smtp d'un message rejete par restrictions
# protocol : envoie toute transcription smtp erronee
# delay    : envoie les entetes de messages differes
# bounce   : envoie les entetes de tous les message renvoyes
# 2bounce  : envoie les entetes de tous les messages renvoyes non delivres
#par defaut, = resource, software
notify_classes = resource, software, bounce, 2bounce, delay, policy, protocol

# A qui les reporter ?
#Pour delay
#par defaut, = postmaster
delay_notice_recipient = delay
#Pour policy, protocol, resource, software
#par defaut, = postmaster
error_notice_recipient = error
#Pour bounce
#par defaut, = postmaster
bounce_notice_recipient = bounce
#Pour 2bounce
#par defaut, = postmaster
2bounce_notice_recipient = bounce
~~~

### Section : restrictions

~~~
########################
# Section : restrictions
########################

# Restrictions au depart de la conversation 
#par defaut, = 
smtpd_client_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination, check_client_access hash:/etc/postfix/acces_client
# Restrictions au niveau de la commande HELO/EHLO
#par defaut, = 
smtpd_helo_restrictions = reject_invalid_hostname
# Restrictions au niveau de la commande MAIL FROM
#par defaut, = 
smtpd_sender_restrictions = check_sender_access hash:/etc/postfix/acces_expediteur
# Restrictions au niveau de la commande MAIL FROM
#par defaut, = permit_mynetworks, reject_unauth_destination
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination

# Attendre la commande 'RCPT TO' avant d'evaluer les restrictions ?
# (peut poser pb avec certains clients et permet d'avoir renseignements suppl)
#par defaut, = yes
#smtpd_delay_reject = 

# Definition des plages IP appartenant a mynetworks
#par defaut, toutes les plages d'adresses IPv4 (et IPv6) des interfaces
mynetworks = 127.0.0.0/8,[::1]/128,10.0.0.0/16

# Exiger la commande HELO/EHLO
#par defaut, = no
smtpd_helo_required = yes

# Exiger syntaxe conforme dans les commandes MAIL FROM ou RCPT TO
#par defaut, = no
#strict_rfc821_envelopes =

# Rejeter le courrier provenant d'une adresse inexistante ?
#par defaut, = no
#smtpd_reject_unlisted_sender =

# Rejeter le courrier a destination d'une adresse inexistante ?
#par defaut, = yes
#smtpd_reject_unlisted_recipient =
~~~



### Utilisation avec un annuaire LDAP

Les bases de données d'utilisateurs et de leurs paramètres peuvent être stockés dans une base de données externe. On peut ainsi utiliser une base de donnée ou un annuaire LDAP. Dans le cas de Postfix, on peut l'utiliser avec MySQL ou OpenLDAP.

Dans le fichier main.cf de Postfix, on utilisera une configuration type :

~~~
alias_maps = [autres bases] ldap:blabla
blabla_server_host = [serveur ldap]
blabla_search_base = [dn de base]
blabla_result_attribute = [type de champs à chercher]
~~~

Dans l'annuaire LDAP on a notamment des champs ressemblant à :

~~~
dn: uid=nnom,[dn de base]
objectClass: inetOrgPerson
objectClass: inetLocalMailRecipient
objectClass: posixAccount
sn: Nom
givenName: Prenom
cn: Nom Prenom
displayName: Nom Prenom
mailLocalAddress: pnom@example.com
uid: nnom
userPassword: ****
uidNumber: 1006
gidNumber: 1006
homeDirectory: /chemin_boite/
~~~

Prenons un exemple d'une configuration de comptes virtuels. La configuration de Postfix peut être :

~~~
virtual_mailbox_domains = virtual.example.com
virtual_mailbox_base = /
virtual_mailbox_maps = ldap:ldapaliases2
ldapaliases2_server_host = localhost
ldapaliases2_search_base = ou=Virtualmail,ou=Mail,dc=example,dc=com
ldapaliases2_bind = yes
ldapaliases2_bind_dn = cn=Manager,ou=Virtualmail,ou=Mail,dc=example,dc=com
ldapaliases2_bind_pw = ******
ldapaliases2_query_filter = (mailLocalAddress=%s)
ldapaliases2_result_attribute = homeDirectory
~~~

Au niveau de l'annuaire LDAP :

~~~
dn: uid=mvegas,ou=Onlymail,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: inetLocalMailRecipient
objectClass: posixAccount
sn: Vegas
givenName: Mister
cn: Virtual Mister
displayName: Mister Vegas
mailLocalAddress: mvegas@example.com
uid: mvegas
userPassword: ****
uidNumber: 1006
gidNumber: 1006
homeDirectory: /home/vmail/virtual.example.com/mvegas/
~~~

Quelques remarques :

Il faut qu'il y ait les permissions sur le homeDirectory. Dans ce cas, les répertoires seront créés automatiquement lors du premier mail reçu.

Vous pouvez obtenir des messages de ce genre :

~~~
warning: dict_ldap_connect: Unable to bind to server ldap://localhost:389 as : 2 (Protocol error)
~~~

Il faut alors ajouter au fichier _slapd.conf_ : `allow bind_v2`


## Support SSL/TLS 

Afin d'éviter de faire circuler en clair les informations (identifiants, contenu des messages) et de s'assurer que l'on s'adresse au bon serveur,
il est conseillé d'utiliser le support SSL/TLS de Postfix.

Pour cela, il est nécessaire de gérer des certificats : voir [wiki:HowtoSSL]

Voici ensuite un exemple de configuration de Postfix (fichier _main.cf_) :

~~~
smtpd_use_tls = yes
smtpd_tls_loglevel = 1
smtpd_tls_key_file = /etc/ssl/private/mail.example.com.key
smtpd_tls_cert_file = /etc/ssl/certs/mail.example.com/crt
smtpd_tls_CAfile=/etc/ssl/certs/sub.class1.server.ca.pem
~~~

On peut ensuite vérifier l'activation en obtenant le message suivant dans une session SMTP suite à un EHLO :

~~~
250-STARTTLS
~~~

Il est ensuite pratique d'activer les ports tcp/587 (SMTP Submission) et tcp/465 (SMTPS) pour faciliter l'accès
au serveur SMTP, notamment pour les utilisateurs derrière une connexion n'autorisant pas l'accès sur le port tcp/25.
Cela s'active dans le fichier _master.cf_ :

~~~
submission inet n       -       -       -       -       smtpd
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING
smtps     inet  n       -       -       -       -       smtpd
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING
~~~
## Authentification SMTP

Cette solution est décrite dans la RFC 2554 : SMTP Service Extension for Authentication. Il faut néanmoins prendre garde, car cette possibilité fait baisser le niveau de sécurité de votre service. En effet, tout repose désormais sur les paramètres d'authentification et, outre des moyens sociaux, il faut veiller à ce que ces paramètres ne soient pas interceptés, c'est-à-dire ne circulent pas en clair sur des canaux non sécurisés. Il sera donc prudent de rajouter une couche de chiffrement, ou alors d'exclure certains types d'authentification comme les types PLAIN ou LOGIN.

Un mécanisme d'authentification souvent utilisé est SASL (Simple Authentication and Security Layer), librairie développée par le projet Cyrus. La lecture du document Cyrus SASL for System Administrators donnera des élements pour installer et configurer conrrectement une authentification basée sur la librairie Cyrus. L'installation se fera à partir des sources ou de paquets (sasl2-bin libsasl2 libsasl2-modules). Certains modules sont optionnels et permettent d'utiliser diverses méthodes d'authentification (libsasl2-modules-gssapi-heimdal libsasl2-modules-kerberos-heimdal). Sous Debian Sarge, on installera le paqut postfix-tls qui contient notamment les extensions SASL pour Postfix.

Plusieurs bases d'authentification sont possibles selon les configurations :

* *shadow* : authentification basée sur le fichier _/etc/shadow_
* *pam* utilise directement les librairies PAM (on peut donc par exemple utiliser LDAP ou RADIUS)
* *pwcheck* : authentification basée sur le deamon pwcheck utilisant aussi le fichier /etc/shadow (précision pour Debian Sarge : saslauthd est dans le paquet cyrus-common)
* *saslauthd* : authentification basée sur le deamon saslauthd qui est plus flexible que pwcheck et peut utiliser PAM (mais aussi shadow, ldap, kerberos, etc,.) (précision pour Debian Sarge : saslauthd est dans le paquet sasl2-bin)

  La configuration s'effectue dans dans _/etc/default/saslauthd_ :

~~~
  START=yes
  MECHANISMS="pam"
  OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd"
~~~

  Et ajouter l'utilisateur `postfix` au groupe `sasl`.

  On vérifie la validité des utilisateurs par :

~~~
  $ testsaslauthd -u username -p password
~~~

  Note : attention, sous Debian Sarge, _testsaslauth_ ne tient apparemment pas compte du mécanisme passé en paramètre de saslauthd, c'est OK depuis Etch

  saslauthd utilise le fichier pam.d/smtp (ou pam.d/other) dans ce cas (quelques modifications sont nécessaires si Postfix est chrooté, voir section CHROOT)
* *auxprop* (ou sasldb pour SASL version 1) : utilisation de /etc/sasldb(2)

  C'est l'authentification utilisée par défaut par Postfix (si aucun paramètre pwcheck_method n'est précisé dans le smtpd.conf)

  Commandes : sasldblistusers(2), saslpasswd(2)

  Note : possibilité d'utiliser une base de données avec l'option auxprop_plugin: sql (quelques modifications sont nécessaires si Postfix est chrooté, voir section CHROOT)


Si vous utilisez une authentification non disponible, vous obtiendrez probablement :

~~~
warning: SASL authentication problem: unknown password verifier
~~~

Plusieurs possibilités de type d'authentification : NTLM, LOGIN, PLAIN, DIGEST-MD5, CRAM-MD5, KERBEROS4, GSSAPI, etc.

Nous devons maintenant configurer postfix afin qu'il utilise SASL. Voir Postfix SMTP Authentification.

Nous ajoutons les paramètres suivants :

~~~
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_sasl_authenticated, reject
~~~

Un fichier _smtpd.conf_ contiendra la méthode d'authentification et les types disponibles :

~~~
pwcheck_method: [choix_methode]
mech_list: [choix_type]
~~~

Note concernant Debian Sarge : le paquet authsasld ne permet que les types PLAIN et LOGIN. Si l'on autorise un autre type, il cherchera le fichier /etc/sasldb2 (a priori, le paquet n'a pas été compilé avec les options --enable-cram --enable-digest).

Exemple, authentification en PLAIN :

~~~
EHLO [hostname]
AUTH PLAIN [mon_auth]
~~~

On obtient [mon_auth] ainsi :

~~~
$ printf 'username\0username\0password' | openssl base64
~~~

Deuxième exemple, authentification en LOGIN :

~~~
EHLO [hostname]
AUTH LOGIN
[mon_login]
[mon_password]
~~~

On obtient [mon_login] et [mon_password] ainsi :

~~~
$ printf 'username' | openssl base64
$ printf 'password' | openssl base64
~~~

Pour en savoir plus, lisez Authentification SASL avec Postfix

On peut aussi restreindre au niveau de Postfix les types d'authentification possibles :

~~~
smtpd_sasl_security_options = noanonymous, noplaintext
~~~

### Authentification client SMTP

Postfix, lorsqu'il communique avec d'autres serveurs en tant que client, peut avoir besoin de s'authentifier. On peut donc lui passer des paramètres d'authentifications pour certains serveurs :

~~~
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
~~~

Le fichier sasl_passwd contiendra :

~~~
foo.com             username:password
bar.com             username
~~~

On peut choisir des options pour le mode compte, par exemple les types d'authentification autorisés :

~~~
smtp_sasl_security_options = noplaintext
~~~

### Gestion du chroot de Postfix

Enfermer Postfix dans un chroot permet de restreindre les accès à d'autres applications en cas de faille de sécurité. Cette protection s'indique au fichier master.cf. Par défaut, cette protection est activée sous Debian. Le répertoire de chroot se situe dans _/var/spool/postfix_

L'utilisation de chroot impose quelques modifications, notamment si l'on utilise l'authentification SMTP :

* saslauthd

  Pour SASL avec la méthode saslauthd, il faut préciser la directive suivante dans le fichier _/etc/default/saslauthd_ :

~~~
  OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd"
~~~

  Note : avant Etch, il était nécessaire de réaliser un hack de ce type :

~~~
  # mkdir /var/spool/postfix/var ; mkdir /var/spool/postfix/var/run
  # mv /var/run/saslauthd/ /var/spool/postfix/var/run/
  # chown -R postfix /var/spool/postfix/var/run/saslauthd
  # ln -s /var/spool/postfix/var/run/saslauthd /var/run/saslauthd
~~~

  Ne pas oublier de mettre des droits de lecture sur les répertoires _/var/spool/postfix/var/_ et _/var/spool/postfix/var/run/_ afin d'autoriser l'utilisateur _postfix_.
  L'utilisateur _postfix_ sera ajouté au groupe _sasl_ si nécessaire (si le répertoire saslauthd appartient à _root:sasl_). Sans ces changements, on obtiendra un message :

~~~
  warning: SASL authentication failure: cannot connect to saslauthd server: Permission denied
~~~
* auxprop

  Pour SASL avec la méthode auxprop (ou sasldb) :

~~~
  # mv /etc/sasldb2 /var/spool/postfix/etc/sasldb2
  # ln -s /var/spool/postfix/etc/sasldb2 /etc/sasldb2
~~~
* resolv.conf

  Le fichier _/etc/resolv.conf_ est copié dans _/var/spool/postfix/etc/resolv.conf_. Il faut le tenir synchronisé en cas de modification (notamment en cas d'installation sur un réseau différent du réseau final).

## Divers

### Restreindre selon le From

~~~
check_recipient_access hash:/etc/postfix/protected_users,

smtpd_restriction_classes = onlylocal
onlylocal = check_sender_access hash:/etc/postfix/onlylocal, reject

/etc/postfix/protected_users :
lcdr@ onlylocal
~~~

### Transporter les mails vers un autre serveur et/ou port

On devra s'assurer que cette directive est bien en place dans /etc/postfix/main.cf :

~~~
transport_maps = hash:$config_directory/transport
~~~

On pourra alors éditer le fichier /etc/postfix/transport :

~~~
toto.com    smtp:mail.toto.com:587
~~~

Ainsi les mails du domaine toto.com irons vers le serveur mail.toto.com sur le port 587

### Chercher Mails entre deux date (Maildir)

Exemple : Chercher les emails entre le 18 mai 2016 et 11 octobre 2016

~~~
$ find $HOME/Maildir -type f -newermt 2016-05-18 ! -newermt 2016-09-11
~~~
