Compilation et configuration d'un serveur Apache 2.0 avec LDAP sous Solaris

Introduction

Les modules LDAP (Lightweight Directory Active Protocol) d'Apache permettent de sécuriser l'accès à des répertoires de sites Web. L'objectif consiste à autoriser l'accès à un site intranet pour des utilisateurs identifiés, l'authentification est réalisée via le login/mot de passe du compte LDAP, ce qui permet d'éviter de définir des comptes et mots de passe dans des fichiers .htaccess ou autres méthodes Apache utilisant des bases de données. Toute l'authentification repose sur les comptes déjà existant dans l'annuaire LDAP qui dans le contexte de cette documentation est un annuaire Microsoft Active Directory.

Avant d'aller plus en avant dans la compilation et la configuration d'un serveur Apache 2.0 avec LDAP sous Solaris, il est important d'avoir des notions sur les librairies clientes OpenLDAP sous Solaris, car ces librairies sont nécessaires à la compilation : pour plus d'informations sur ce sujet, consulter au préalable la documentation Compilation des librairies clientes LDAP avec OpenLDAP 2.3.43 sous Solaris

Cette documentation est spécifique aux serveurs Apache 2.0.x, elle n'est pas valable pour les versions des serveurs Apache 2.1 et supérieures.

Tous les pré-requis de compilation sont supposés disponibles sur la machine Solaris :

% gcc -v
Reading specs from /usr/local/lib/gcc/sparc-sun-solaris2.9/3.4.2/specs
Configured with: ../configure --with-as=/usr/ccs/bin/as
--with-ld=/usr/ccs/bin/ld --disable-nls
Thread model: posix
gcc version 3.4.2

Compilation

Pré-requis de l'environnement de compilation

Le binaire ar est indispensable pour la compilation d'Apache 2.0. Le binaire ar compile les librairies .a nécessaires et sans précautions, la compilation est en échec car le binaire ar n'est pas installé dans des répertoires standards comme /usr/local/bin etc…, il est installé dans le répertoire /usr/ccs/bin.

Après vérification de la présence du binaire ar dans le répertoire /usr/ccs/bin, il faut modifier la variable d'environnement PATH ou AR afin de référencer le répertoire /usr/ccs/bin pour l'utilisateur root qui réalise la compilation : dans le contexte de cet article, c'est la variable PATH qui est modifiée en passant en K-Shell. Par précaution également, pour retrouver les packages nécessaires lors de la compilation, les répertoires /usr/local/bin et /usr/local/lib sont respectivement référencés dans les variables PATH et LD_LIBRARY_PATH :


% ksh
% export PATH=/usr/ccs/bin:/usr/local/bin:$PATH
% export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

Préparation de la compilation

Les sources sont récupérées depuis le site httpd.apache.org sous la forme d'une archive compressée tgz (httpd-2.0.63.tar.gz) et installées dans le répertoire /export/home/compilation/apache en tant que root.

L'archive est décompressée :


% cd /export/home/compilation/apache
% gunzip httpd-2.0.63.tgz

Puis les fichiers sont extraits de l'archive httpd-2.0.63.tar avec la commande tar :


% tar xvf httpd-2.0.63.tar

Les fichiers sources sont extraits par la commande tar dans le répertoire /export/home/compilation/apache/httpd-2.0.63.

Commande configure

Pour obtenir plus d'aide sur la configuration de la compilation d'Apache 2.0, la commande ./configure --help en se positionnant dans le répertoire des sources (/export/home/compilation/apache/httpd-2.0.63) donne toutes les options de la compilation.


% cd httpd-2.0.63

% ./configure --help

L'installation du serveur Apache 2.0 est réalisée dans le répertoire /Software/apache/apache-2.0, l'option --prefix=/Software/apache/apache-2.0 est donc donnée à la commande configure.

Pour réaliser la compilation d'Apache 2.0 avec LDAP, les options de configuration ci-dessous sont nécessaires :


   --with-ldap
   --with-ldap-lib=<chemin vers les librairies OpenLDAP>
   --with-ldap-include=<chemin vers les fichiers h include OpenLDAP>
   --enable-ldap
   --enable-authnz-ldap

Dans cette documentation, OpenLDAP est installé dans le répertoire /Software/openldap.

L'option --with-ldap permet d'activer le module mod_ldap, module qui permet d'améliorer les performances à travers par exemple la mise en œuvre d'un pool de connexions LDAP et un cache LDAP. Le module mod_ldap doit être lié à au moins à un des SDK LDAP suivants : OpenLDAP (ce qui est le cas dans cet article), Novell LDAP SDK ou iPlanet(Netscape) SDK. Les directives --with-ldap-lib et --with-ldap-include dans la commande configure donnent les chemins vers le SDK OpenLDAP pour la mise en œuvre du module mod_ldap.

Le module mod_ldap est encore expérimental, mais aucun problème n'a été rencontré après un an d'utilisation.

La commande configure finale est donc la suivante :

% ./configure --prefix=/Software/apache/apache-2.0 \
			--with-ldap \
			--with-ldap-lib=/Software/openldap/lib \
			--with-ldap-include=/Software/openldap/include \
			--enable-ldap \
			--enable-authnz-ldap

Commandes make et make install

Les commandes make et make install sont ensuite successivement lancées pour compiler et installer dans le répertoire de destination /Software/apache/apache-2.0.

Opérations post-installation

Par défaut la commande "make install" réalise l'installation dans le répertoire /Software/apache/apache-2.0 avec l'utilisateur root utilisé pour la compilation. Si le serveur Apache 2.0 doit être démarré avec un autre utilisateur comme l'utilisateur apache par exemple, il faut que l'utilisateur apache devienne propriétaire du répertoire /Software/apache/apache-2.0 ainsi que de tous les sous répertoires. Ce changement de propriétaire est réalisé avec la commande chown -R.


% cd /Software/apache
% chown -R apache apache-2.0

Les autres étapes de configuration du serveur Apache dans le fichier httpd.conf (port etc...) ne sont pas le sujet de cette documentation.

Configuration du serveur Apache 2.0 avec LDAP

Le binaire httpd et les librairies OpenLDAP

La commande ldd permet de voir rapidement comment le binaire httpd dans le répertoire /Software/apache/apache-2.0/bin est lié aux librairies OpenLDAP, ce qui permet de confirmer la disponibilité du module LDAP au sein du serveur Apache 2.0.


apache% cd /Software/apache/apache-2.0/bin
apache% ldd httpd

        libaprutil-0.so.0 =>     /Software/apache/apache-2.0/lib/libaprutil-0.so.0
        libldap-2.3.so.0 =>      /Software/openldap/lib/libldap-2.3.so.0
        liblber-2.3.so.0 =>      /Software/openldap/lib/liblber-2.3.so.0
        libgen.so.1 =>   /usr/lib/libgen.so.1
        libexpat.so.0 =>         /usr/local/lib/libexpat.so.0
        libiconv.so.2 =>         /usr/local/lib/libiconv.so.2
        libapr-0.so.0 =>         /Software/apache/apache-2.0/lib/libapr-0.so.0
        libsendfile.so.1 =>      /usr/lib/libsendfile.so.1
        librt.so.1 =>    /usr/lib/librt.so.1
        libm.so.1 =>     /usr/lib/libm.so.1
        libsocket.so.1 =>        /usr/lib/libsocket.so.1
        libnsl.so.1 =>   /usr/lib/libnsl.so.1
        libresolv.so.2 =>        /usr/lib/libresolv.so.2
        libpthread.so.1 =>       /usr/lib/libpthread.so.1
        libdl.so.1 =>    /usr/lib/libdl.so.1
        libc.so.1 =>     /usr/lib/libc.so.1
        libgcc_s.so.1 =>         /usr/local/lib/libgcc_s.so.1
        libaio.so.1 =>   /usr/lib/libaio.so.1
        libmd5.so.1 =>   /usr/lib/libmd5.so.1
        libmp.so.2 =>    /usr/lib/libmp.so.2
        libthread.so.1 =>        /usr/lib/libthread.so.1
        /usr/platform/SUNW,Sun-Fire-V440/lib/libc_psr.so.1
        /usr/platform/SUNW,Sun-Fire-V440/lib/libmd5_psr.so.1

Deux librairies libldap-2.3.so.0 et liblber-2.3.so.0 prennent en charge le module LDAP, librairies qui sont dans les librairies clientes OpenLDAP (/Software/openldap/lib).

Configuration du cache LDAP pour Apache 2.0 (module mod_ldap)

Il est possible de définir un cache LDAP au sein du serveur Apache 2.0 lorsque le module mod_ldap a été compilé. Voici ce qui a été appliqué dans le fichier httpd.conf pour paramétrer lache LDAP :


# Parametrage du cache LDAP
LDAPSharedCacheSize 200000
LDAPSharedCacheFile "/Software/apache/apache-2.0/cache/ldap.cache"
LDAPCacheEntries 1024
LDAPCacheTTL 600
LDAPOpCacheEntries 1024
LDAPOpCacheTTL 600

Les connexions au serveur LDAP sont mises en cache requête par requête. Ceci permet de rester connecté pour la prochaine requête au serveur LDAP sans avoir à renouveler les opérations unbind/connect/rebind. Lorsque le serveur Apache est très sollicité en requêtes concurrentes, une nouvelle connexion est créée dans ce pool, ainsi le pool de connexions au serveur LDAP ne devient pas un goulot d'étranglement.

Voici une brève description de quelques paramètres du cache LDAP

LDAPShareCacheSize Nombre de bytes alloués pour le cache LDAP. Par défaut, 100 Kb. Lorsque la valeur est 0, le cache n'est pas utilisé.
LDAPSharedCacheFile Spécifie la localisation du fichier de cache de mémoire partagée. Si ce paramètre n'est pas appliqué, une mémoire partagée anonyme sera utilisée si la plateforme le permet.
LDAPCacheEntries Nombre maximum de recherches réussies dans le serveur LDAP et mises en cache. Par défaut, 1024 recherches sont mises en cache.
LDAPCacheTTL Temps en secondes durant lequel les entrées demeurent valides dans le cache.

Il est possible de monitorer le cache LDAP. Le nom du gestionnaire de contenu est ldap-status qu'il suffit de rajouter dans le fichier htppd.conf.


<Location /ldap-status>
   SetHandler ldap-status
</Location>

Pour interroger la page des performances du cache LDAP : http://<servername>/ldap-status

Cache Name Entries Avg. Chain Len. Hits Hits % Ins/Rem Purges Avg Purge Time
LDAP URL Cache 1 (0% full) 1.0 0/1 0% 1/0 (none) 0
ldap://SRVDCTFR1:3268/OU=FR, DC=mycompany,DC=intranet?sAMAccountName?sub? (objectClass=user) (Searches) 1 (0% full) 1.0 0/2 0% 1/0 (none) 0
ldap://SRVDCTFR1:3268/OU=FR, DC=mycompany,DC=intranet?sAMAccountName?sub? (objectClass=user) (Compares) 0 (0% full) 0.0 0/0 100% 0/0 (none) 0
ldap://SRVDCTFR1:3268/OU=FR, DC=mycompany,DC=intranet?sAMAccountName?sub? (objectClass=user) (DNCompares) 0 (0% full) 0.0 0/0 100% 0/0 (none) 0

Directives LDAP dans le fichier httpd.conf pour sécuriser l'accès à un site

Les directives LDAP d'authentification sont données dans une section <Directory > </Directory> dans le ficher httpd.conf du serveur Apache. Dans l'exemple ci-dessous, l'accès au répertoire /dba/docroot/secure est sécurisé par une authentification LDAP :


<Directory "/dba/docroot/secure">
# mod_auth_ldap
AuthLDAPEnabled On
AuthLDAPAuthoritative On
AuthName "Connexion securisee"
AuthType Basic
AuthLDAPUrl "ldap://SRVDCTFR1:3268/OU=FR,DC=mycompany,DC=intranet?sAMAccountName?sub?(objectClass=user)"
AuthLDAPBindDN "<domain>\\<user>"
AuthLDAPBindPassword "<password>"

Require user doej smithj

</Directory>
  • La directive AuthLDAPEnabled (on | off) active ou désactive l'authentifcation LDAP pour le répertoire.
  • La directive AuthLDAPAuthoritative (on | off) empêche ou non tous les autres modules d'authentification si l'authentifcation LDAP est en échec.
  • La directive AuthName est le titre qui apparaîtra dans la fenêtre de login/mot de passe.
  • La directive AuthType est le type d'authentification (basic | digest)
  • La directive AuthLDAPUrl spécifie les paramètres de connexion au serveur LDAP (serveur, port : ldap://<server>:port) ainsi que la racine de l'annuaire LDAP à scruter (OU=xxx,DC=yyyy ...) puis l'attribut à rechercher en fonction du user donné : dans le cas d'un annuaire LDAP Microsoft AD, c'est l'attribut sAMAccountName qui est recherché.
  • La directive AuthLDAPBindDN est le compte LDAP en lecture seule qui est utilisé pour interroger l'annuaire LDAP, il est donné sous la forme <domain>\\<user>.
  • La directive AuthLDAPBindPassword est le mot de passe du compte LDAP en lecture décrit ci-dessus interrogeant l'annuaire LDAP.

Il existe de multiples options pour autoriser les accès à tous les utilisateurs existant dans l'annuaire LDAP, à un groupe de l'annuaire LDAP, ou à des utilisateurs nommés de l'annuaire LDAP, ces options sont données avec la directive Require : dans l'exemple ci-dessus, seuls les utilisateurs doej et smithj de l'annuaire LDAP sont autorisés à accéder au répertoire /dba/docroot/secure.

Pour autoriser tous les membres d'un annuaire LDAP :


require valid-user

Pour autoriser un groupe d'un annuaire LDAP :


require group cn=Administrators

Pour autoriser un ou des utilisateurs d'un annuaire LDAP :


require user bjenson fuser jmanager
Il faut être très prudent sur la racine de l'arborescence de l'annuaire LDAP à investiguer, à titre d'exemple une authentification Apache avec LDAP est en échec lorsque plusieurs entrées sur un filtre sont trouvées dans l'annuaire LDAP avec le message d'erreur "search found tow or more matches" :

[Tue May 22 19:48:56 2007] [warn] [client 10.128.148.144] [22471]
        auth_ldap authenticate: user doej authentication failed;
                URI / [User is not unique (search found two or more matches)][No such object].