postfix ldap
par julien, juillet 2007
Par défaut, le système Postfix accepte tous les mails à destination d'un domaine particulier mais, n'ayant pas connaissance des comptes existant sur ce domaine, il ne peut filtrer plus précisement les mails entrants. La solution est de relier postfix à l'outil de gestion des utilisateurs, ici LDAP. Pour cela, il faut tout d'abord avoir un système LDAP fonctionnel.
Travaillant sous Debian (Etch, en l'occurrence), la première chose à faire est un
apt-get install slapd
Comme Debian est bien faite, dpkg pose la majorité des questions importantes pendant l'installation, ce qui fait que le fichier /etc/ldap/slapd.conf est quasiment fonctionnel. Il faut toutefois s'assurer que la version 2 du protocole est activée car postfix-ldap fonctionne encore avec cette version.
####################################################################### # Global Directives: # Features to permit allow bind_v2
Si cette ligne n'est pas décommentée, postfix va loguer des erreurs de connections à LDAP.
Pour ce qui est de la base de données principale, celle de Linuxwall ressemble à ca :
{..............} ####################################################################### # Specific Backend Directives for bdb: # Backend specific directives apply to this backend until another # 'backend' directive occurs backend bdb checkpoint 512 30 ####################################################################### # Specific Backend Directives for 'other': # Backend specific directives apply to this backend until another # 'backend' directive occurs #backend <other> ####################################################################### # Specific Directives for database #1, of type bdb: # Database specific directives apply to this databasse until another # 'database' directive occurs database bdb # The base of your directory in database #1 suffix "dc=linuxwall,dc=info" # rootdn directive for specifying a superuser on the database. This is needed # for syncrepl. rootdn "cn=admin,dc=linuxwall,dc=info" # mdp root obtenu avec "slappasswd -h '{SSHA}' -v" rootpw {SSHA}machintruchashbidulequiestsupersecret # Where the database file are physically stored for database #1 directory "/var/lib/ldap" # For the Debian package we use 2MB as default but be sure to update this # value if you have plenty of RAM dbconfig set_cachesize 0 2097152 0 {..............}
Avec ca, vous pouvez mettre en place un phpldapadmin sur apache (https évidemment ;) ) et vous connecter pour créer vos comptes. Personnellement, j'utilise l'attribut 'Courier mail account' dans phpldapadmin.
Quand il reçoit un mail, postfix check la table des alias dans /etc/aliases (par défaut) pour voir si le mail doit être forwarder autre part. Il est possible de rajouter une directive dans le 'main.cf' pour que postfix requête LDAP avant ou après avoir checké cette table. Bien entendu, la première chose à faire est d'installer, toujours avec apt-get, le package postfix-ldap :
apt-get install postfix-ldap
Ensuite, a directive à ajouter est :
local_recipient_maps = ldap:/etc/postfix/ldap_local_recipient.cf, $alias_maps
sachant que alias_maps est habituellement placé sur la valeur
alias_maps = hash:/etc/aliases
Mais ce qui nous interesse ici, c'est 'ldap_local_recipient.cf'. Ce fichier doit contenir la méthode à utiliser pour interroger LDAP. Vous pouvez utiliser le modèle ci-dessous :
server_host = 127.0.0.1 server_port = 389 search_base = dc=linuxwall,dc=info # le %s signifie "adresse du destinataire telle que fourni par la commande "RCPT TO:" query_filter = (mail=%s) result_attribute = mail
Il ne reste plus qu'a recharger Postfix et à tester. La commande postmap nous permet de vérifier que cela fonctionne :
sachiel:/# postmap -q switcher@linuxwall.info ldap://etc/postfix/ldap_local_recipient.cf switcher@linuxwall.info sachiel:/# postmap -q jeankevin@linuxwall.info ldap://etc/postfix/ldap_local_recipient.cf sachiel:/#
Dans le premier cas, postmap renvoie une réponse positive à la requête. Notez bien que vous devez requêter sous la forme user@domain et pas autrement. Dans le second cas, postmap ne renvoie rien, l'entrée n'a pas été trouvée.
Et voilà ! ;)~~DISCUSSION~~