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...

Mail

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

Vus : 7458
Publié par Guillaume Vaillant : 52