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.
SRV% cd /Software/apache/apache-2.0/bin SRV% 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’attributsAMAccountName
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].