apache : authentification ldap en version 2.2

Je viens de migrer mon serveur Apache de la version 2.0 vers 2.2. Dans l'ensemble, ça c'est bien passé sauf que le module d'authentification ldap a changé entre les 2 versions. Voici le descriptif des modifications que j'ai fait pour que cela refonctionne.


authentification LDAP sous Apache 2.0


Sous apache 2.0, l'authentification ldap s'effectuait grâce au module mod_auth_ldap .
Une description complète de ces directives est accessible sur le site de la fondation Apache .

Voici un exemple d'authentification LDAP sous Apache 2.0 pour le répertoire /doc :

  <Directory /doc/>
         AuthType Basic
         AuthName "Krystalia Users Only"
         AuthLDAPURL ldap://localhost/dc=krystalia,dc=net?uid?sub
         AuthLDAPGroupAttribute member
         Require group cn=web,ou=groupes,dc=krystalia,dc=net
         Require valid-user
         AllowOverride None
         Order allow,deny
          allow from all
   </Directory>

Quitte à me répéter par rapport à ce billet, je vais de nouveau décrire les directives principales :

  • AuthType : Il s'agit de la directive permettant de choisir le mode d'authentification de l'utilisateur. Il s'agit soit de Basic soit de Digest. Basic est le seul qui mode qui focntionne avec l'authentification par LDAP mais le mot de passe transite en clair sur Internet. Pour plus de sécurité, on peut l'utiliser sur des pages accédées uniquement par SSL.
  • AuthName : le nom qui apparait dans la mire de demande de mot de passe. Cela permet aussi d'accéder à tout les répertoires du site portant le même nom d'authentification. Cela peut être intéressant dans certaines configurations.

Et voici les directives spécifiques au module mod_auth_ldap :

  • AuthLDAPURL : il s'agit de l'adresse d'accès à l'annuaire ldap. Elle permet de préciser à quel serveur on accède, à partir de quel racine de l'annuaire, le champ auquel le nom d'utilisateur entré dans la boite dialog sera comparé ainsi que le niveau de récursivité de la requète.

Ici on accède à la base LDAP situé sur le serveur local(localhost) sur le port ldap standard à la racine "dc=krystalia,dc=net", en utilisant l'attribut uid pour l'authentification et en permettant des recherches récursives (mode sub)

  • AuthLDAPGroupAttribute : il s'agit de l'attribut déterminant l'appartenance au groupe. En général, il s'agit soit de member soit de uniquemember.
  • Require valid-user : cela indique que l'on demande uniquement à ce que l'utilisateur est réussi à s'authentifier sur l'annuaire ldap pour le laisser accéder au répertoire.


Authentification LDAP sous Apache 2.2

A partir d'Apache 2.1, on utilise le module mod_authnz_ldap qui fait office à la fois de module d'authentification mais aussi d'autorisation. En clair, on peut maintenant spécifier des critères relatifs à ldap dans la directive Require.
Voici le même exemple d'authentification LDAP sous Apache 2.2 pour le répertoire /doc :

    <Directory /doc/>
               AuthBasicProvider ldap
               AuthUserFile /dev/null
               AuthType Basic
               AuthName "Krystalia Users Only"
               AuthLDAPURL ldap://localhost/dc=krystalia,dc=net?uid?sub
               AuthLDAPGroupAttribute_ member
               Require ldap-group cn=web,ou=groups,dc=krystalia,dc=net
               Options Indexes FollowSymLinks MultiViews
               AllowOverride None
               Order allow,deny
               allow from all
               # Uncomment this directive is you want to see apache2's
               # default start page (in /apache2-default) when you go to /
               #RedirectMatch ^/$ /apache2-default/
       </Directory>


Je ne parlerais que des nouvelles directives :

  • AuthBasicProvider : permet de spécifier que l'on utilise ldap comme module d'authentification.
  • AuthUserFile : Fichier devant contenir la liste des utilisateurs et mot de passe. Je reviendrais sur cette directive plus loin.
  • Require ldap-group : permet de spécifier le groupe ldap auquel l'utilisateur doit appartenir.


La grande modification apportée est au niveau du Require, on peut maintenant spécifier des critères ldap. Ci-dessus, il s'agit d'un groupe ldap. Mais on peut aussi spécifier les options suivantes :

  • Require ldap-user
  • Require ldap-dn
  • Require ldap-attribute
  • Require ldap-filter

Je vous invite à visiter la page du site de la fondation Apache pour une description de toute ces options.

Piège lors de la migration


La migration en elle-même est relativement simple. Les modifications entre les deux modules n'étant pas très importante.



Il y a quand même un bug dans certaines versions d'Apache 2.2. Si on ne met pas la directive suivante :

 AuthUserFile /dev:null

On se retrouve avec une authentification qui ne fonctionne plus avec des messages de ce type dans le log :

   Wed Aug 27 17:12:42 2008]  error Internal error: pcfg_openfile() called with NULL filename

La directive AuthUserFile est censé spécifier le fichier où se trouve les comptes et mot de passes. On pourrait penser ne pas en avoir besoin avec l'authentification LDAP mais il y a un bug qui fait que même si le module d'authentification ne se sert pas de ce fichier, on a besoin de le préciser. Ici on spécifie /dev/null pour éviter tout problème.

Remarque : il y a du avoir une correction effectuée depuis sur la distribution ubuntu car je viens de réessayer et on a plus besoin de spécifier cette directive.

Conclusion


L'authentification avec LDAP et la disparition du module mod_security sur ma distribution lors de l'upgrade sont les seules points qui m'ont posé un problème lors de l'upgrade ce qui est plutôt positif :-) En tout cas, les possibilités d'authentification ldap commentcent à devenir très complète sous Apache. Si on pouvait utiliser le module digest avec, ce serait parfait.