utilisation d’un serveur LDAP comme source d’authentification pour des utilisateurs virtuels
En remplaçant mon serveur perso, j’avais décidé de limiter les comptes système sur la machine, et donc de passer autant que possible par des utilisateurs virtuels.
J’ai donc pour cela configuré un serveur LDAP, et je m’en sers comme support pour l’authentification des différents services dont je peux avoir besoin: mail, FTP, ou même en partie de l’authentification HTTP.
La suite de cet article est donc un récapitulatif des conf nécessaires pour ça.
Note: je n’y détaillerai pas l’installation et la configuration du serveur LDAP, ou des services qui s’interfacent avec: je ne m’occuperai que de la partie service+LDAP.
Structure du serveur LDAP:
Voici la structure de la base LDAP que j’utilise dans la suite de ce document:
- dc=example,dc=com
- ou=virtual
- ou=users
- cn=username
- uid=login
- homeDirectory=chemin absolu vers le HOME de l’utilisateur virtuel
- userPassword={CRYPT}mot de passe crypté avec crypt()
- uidNumber=entier (id de l’utilisateur virtuel)
- homePostalAddress=chemin vers Maildir/ (inclu)
- mail=email de l’utilisateur
- ou=domains pour la partie mail
- dc=nom du domaine
- ou=aliases pour la partie mail
- cn=description alias
- uid=alias
- homePostalAddress cible(s)/membre(s) de l’alias
FTP (pure-ftpd):
Dans mon cas, j’ai commencé par installer le package pure-ftpd-ldap.
Personnellement, je n’utilise que l’authentification LDAP, donc, le dossier /etc/pure-ftpd/auth ne contient qu’un seul élément, un lien 30ldap qui pointe vers ../conf/LDAPConfigFile.
Ce fichier ne contient qu’une ligne qui est le chemin absolu vers la conf LDAP utilisée par le serveur FTP (/etc/pure-ftpd/db/ldap.conf).
Ce fichier ressemble à ça:
LDAPServer 127.0.0.1 LDAPPort 389 LDAPBaseDN ou=users,ou=virtual,dc=example,dc=com LDAPAuthMethod BIND
On peut aussi préciser ceci (là, ce sont les valeurs par défaut qui me conviennent):
LDAPFilter (&(objectClass=posixAccount)(uid=\\L)) # \\L est le login LDAPHomeDir homeDirectory # attribut où le home de l'utilisateur est défini.
Une fois que l’on a tout configuré comme on le veut, on redémarre pure-ftpd et c’est parti, on peu se connecter avec les logins/password définis dans le LDAP.
Note: Le chemin défini dans l’attribut homeDirectory de l’utilisateur virtuel doit appartenir à l’id définit dans l’attribut uidNumber. Même si cet uid ne correspond à rien sur le système.
WWW (apache2 + auth):
Pour utiliser la base LDAP comme source d’authentification (dans les .htaccess par exemple), il faut disposer du module authnz_ldap, l’activer (a2enmod authnz_ldap) et reloader apache.
Ensuite, là où on en a besoin, il suffit d’adapter ce bout de conf:
AuthBasicProvider ldap AuthType Basic AuthzLDAPAuthoritative off AuthName "`_o< ... >o_´" AuthLDAPURL "ldap://127.0.0.1:389/ou=users,ou=virtual,dc=example,dc=com?uid?sub?(objectClass=*)" NONE Require valid-user
On peut bien sur préférer restreindre l’accès à la ressource à une sélection d’utilisateurs, en remplaçant le «Require valid-user» par:
Require ldap-user toto tata titi...
postfix (smtp)
Pour commencer, j’ai installé le package postfix-ldap pour avoir un postfix avec support LDAP.
Pour la partie LDAP, il faut commencer par créer ces fichiers qui permettront plus tard à postfix de faire sa tambouille avec les alias et les comptes utilisateurs:
- /etc/postfix/ldap-domains.cf (définition des domaines virtuels):
server_host = 127.0.0.1 version = 3 search_base = ou=domains,ou=virtual,dc=example,dc=com query_filter = (&(objectClass=domain)(dc=%s)) result_attribute = dc
- /etc/postfix/ldap-accounts.cf (définition des utilisateurs):
server_host = 127.0.0.1 version = 3 search_base = ou=users,ou=virtual,dc=example,dc=com query_filter = (&(objectClass=inetOrgPerson)(mail=%s)) result_attribute = homePostalAddress
- /etc/postfix/ldap-aliases.cf (définition des aliases):
server_host = 127.0.0.1 version = 3 search_base = ou=aliases,ou=virtual,dc=example,dc=com query_filter = (&(objectClass=inetOrgPerson)(cn=%s)) result_attribute = homePostalAddress
Maintenant, on peut dire à postfix comment utiliser tout ça, en ajoutant ça dans son /etc/postfix/main.cf:
virtual_mailbox_domains = ldap:/etc/postfix/ldap-domains.cf virtual_mailbox_base = /home/virtual virtual_mailbox_maps = ldap:/etc/postfix/ldap-accounts.cf virtual_minimum_uid = 50000 virtual_gid_maps = static:50000 virtual_uid_maps = static:50000 virtual_alias_maps = ldap:/etc/postfix/ldap-aliases.cf
Notes complémentaires:
- J’ai tout de même du créer un compte et un groupe sur le système:
- groupe virtusers, gid 50000
- utilisateur virtusers, uid 50000, HOME=$virtual_mailbox_maps, SHELL=/bin/nologin
- l’attribut homePostalAddress (pour les entrées dans ou=users,…) est relatif au $virtual_maibox_base et permet de définir où se trouve le Maildir de l’utilisateur.
- pour chaque utilisateur virtuel du LDAP, il y a un attribut uidNumber, qui est unique et supérieur à 50000…
- il ne faut pas oublier l’attribut mail des utilisateurs virtuels, sinon, ça se passe pas mal à la réception des emails.
dovecot (imap et pop)
Ici, il y a deux fichiers à modifier.
D’abord le /etc/dovecot/dovecot.conf, en particulier le bloc auth default {} (je ne mets que les parties intéressantes):
auth default { ... passdb ldap { args = /etc/dovecot/dovecot-ldap.conf } userdb prefetch { } userdb ldap { args = /etc/dovecot/dovecot-ldap.conf } ... }
Il faut aussi modifier le fichier /etc/dovecot/dovecot-ldap.conf dont il est question dans le fichier précédent:
hosts = 127.0.0.1 uris = ldap://127.0.0.1 tls = no debug_level = 0 auth_bind = yes auth_bind_userdn = cn=%u,ou=users,ou=virtual,dc=example,dc=com ldap_version = 3 base = ou=virtual,dc=example,dc=com scope = subtree user_attrs = homeDirectory=home,uidNumber=uid,gidNumber=gid user_filter = (&(objectClass=posixAccount)(|(uid=%u)(mail=%u))) pass_attrs = uid=user,userPassword=password,homeDirectory=userdb_home,uidNumber=userdb_uid,gidNumber=userdb_gid pass_filter = (&(objectClass=posixAccount)(uid=%u)) default_pass_scheme = CRYPT
Maintenant, on peut redémarrer dovecot…