Configurer l'authentification LDAP sur Apache
Divulgâchage : Plutôt que s'embêter avec des extentions et des frameworks compliqués, pourquoi ne pas laisser apache authentifier vos utilisateurs via ldap ?
Auto-héberger ses services, c’est cool. Mais la gestion des utilisateurs, c’est vite lourd. Ce qui est beaucoup moins cool, c’est de créer des comptes partout et de devoir y mettre à jour les mots de passe à chaque fois qu’on a envie d’en changer. Et dans ce cas, un annuaire type LDAP/AD, c’est pratique.
J’ai récemment rencontré ce genre de problème en cherchant à installer un agrégateur de flux RSS en interne. Chez les arsouyes, on aime bien les flux RSS. C’est low tech et peu intrusif. Par contre, en tant que geek avec plusieurs PC et des dualboot, on se heurte rapidement à un problème de synchronisation :
- maintenir la liste des flux sur chaque PC ou OS,
- maintenir la liste de ce que j’ai déjà lu ou non,
- partager mes trouvailles.
Sans rentrer dans les détails1, mon choix s'est porté sur FreshRSS. Et je ne vais pas ici vous expliquer comment l’installer car leur doc est bien faite.
Et je n’avais pas envie de créer un utilisateur spécifique pour chacun. Le truc chouette, c’est qu’on peut demander à Apache de gérer l’authentification en interrogeant notre contrôleur de domaine, et que FreshRSS est capable de le prendre en compte. Et un truc encore mieux, c’est que ce n’est pas spécifique à FreshRSS, et que n’importe quel site que vous codez pourrait en fait s’interfacer facilement avec un AD2.
Apache et LDAP
Pour que notre Apache puisse discuter avec notre LDAP, il faut quelques petites lignes de conf.
Tout d’abord ,il est nécessaire d’installer les modules suivants et de les activer : mod_ldap et mod_authnz_ldap3.
a2enmod ldap authnz_ldapEnsuite, dans le fichier de configuration correspondant à votre site web, on restreint l'accès au répertoire voulu uniquement aux utilisateurs connectés avec LDAP. La configuration suivante doit se mettre dans la configuration de l'hôte virtuel correspondant au site (balise VirtualHost).
Afin de rendre le fichier de configuration plus lisible, nous allons utiliser Define pour définir les variables, puis nous les appellerons via la syntaxe ${nom_de_variable}. Voici à quoi va ressembler votre fichier de configuration. Il faudra bien sur donner une valeur à chacune des directives.
<Directory ${repertoire}>
AuthName ${message_d_auth}
AuthType ${type}
AuthBasicProvider ${module}
AuthLDAPURL ${url}
AuthLDAPBindDN ${bindname}
AuthLDAPBindPassword ${password}
Require ${who}
</Directory>
Les paramètres doivent être configurées conformément à votre annuaire. Dans notre cas, nous utilisons un Netserver7 et j’en profite donc pour détailler ce que, de notre coté, nous avons du utiliser.
Le répertoire sur lequel les directives doivent s’appliquer. Dans notre cas, nous avons mis FreshRSS dans /var/www/html
Define repertoire /var/www/html/
Le message d’authentification qui sera envoyée au client lorsqu’on lui demande d’envoyer son nom d’utilisateur et son mot de passe. Dans notre cas, nous avons choisi d’envoyer “Toc toc toc qui est là ?”4.
Define message_d_auth "Toc toc toc qui est là ?"
Le type d’authentification qui sera utilisé pour transmettre le nom d’utilisateur et le mot de passe au serveur. Dans notre cas, nous souhaitons que le navigateur transmette le nom d’utilisateur et le mot de passe en utilisant le protocole basic5 .
Define type Basic
Le module qui gère la vérification du mot de passe. Dans notre cas, nous souhaitons que ce soit ldap.
Define module ldap
L’URL de recherche dans l’annuaire LDAP. La majorité des infos dont vous avez besoin doivent se trouver quelque part dans l’interface de votre serveur LDAP (chez nous sous Système/Utilisateurs et Groupe) . Dans notre cas, pour que ça marche avec un Netserver7 :
Define url "ldaps://mon.serveur.mon.domain.org:636/dc=mon,dc=domain,dc=org?sAMAccountName?base?(objectClass=user)"
Où :
ldaps://: utiliser le protocole ldap dans sa version sécurisée6mon.serveur.mon.domain.org: renseignez ici l’adresse de votre annuaire:636: il s’agit du port par défaut pour LDAPS/dc=mon,dc=domain,dc=org: il s’agit du DN de base, c’est à dire la branche de l’annuaire où faire les recherches. Ici, ça correspond à la structure mon.domain.org?sAMAccountName: En gros, ça dit que la recherche se fait l’attributsAMAccountNameet qu’il doit être égal au nom de l’utilisateur fourni?base: Portée de la recherche. En gros, dans notre annuaire, pas besoin de faire une recherche récursive7?(objectClass=user): informe que n’importe quel objet correspondant fait l’affaire. De notre coté, on veut authentifier les utilisateurs (nos machines n’ont pas besoin d’accéder à un RSS)
Le nom d’utilisateur qui peut faire des requêtes sur l’annuaire LDAP. Cette information est également disponible quelque part dans l’interface de votre annuaire. Dans notre cas, l’utilisateur se nomme ldapservice
Define bindname ldapservice@mon.domain.org
Le mot de passe de l’utilisateur que l’on vient de renseigner. On va pas vous mettre le notre ici, vous saurez très bien renseigner le votre tout seul :).
Define password L3SUP3Rm0td3p4ss
Enfin, qui a le droit d’accéder au répertoire. On peut très bien filtrer sur les groupes ou les utilisateurs, mais dans notre cas, un utilisateur valide dans l’annuaire est amplement suffisant 8.
Define who valid-user
Ce qui donne au final un fichier du genre :
Define repertoire /var/www/html/
Define message_d_auth "Toc toc toc qui est là ?"
Define type Basic
Define module ldap
Define url "ldaps://mon.serveur.mon.domain.org:636/dc=mon,dc=domain,dc=org?sAMAccountName?base?(objectClass=user)"
Define bindname ldapservice@mon.domain.org
Define password L3SUP3Rm0td3p4ss
Define who valid-user
<Directory ${repertoire}>
AuthName ${message_d_auth}
AuthType ${type}
AuthBasicProvider ${module}
AuthLDAPURL ${url}
AuthLDAPBindDN ${bindname}
AuthLDAPBindPassword ${password}
Require ${who}
</Directory>
Après avoir enregistré le fichier, on redémarre apache.
Sous debian, c’est la commande suivante :
systemctl restart apache2Le cas de FreshRSS
Pour que FreshRSS soit au courant que c’est le serveur web qui gère l’authentification, c’est très simple car c’est prévu.
Dans la configuration (petite icone avec le rouage), aller dans Administration/Authentification. Dans le menu déroulant, il suffit de sélectionner la méthode d’authentification HTTP
À partir de maintenant, tous mes utilisateurs enregistrés dans mon Nethserver peuvent se servir du service 🎉.
Et après ?
En fait, ce n’est pas une fonctionnalité magique de FreshRSS qui tout d’un coup s’est mis à parler LDAP. FreshRSS fait juste confiance à Apache pour ce qui est de l’authentification : à partir du moment où Apache a validé, FreshRSS part du principe que c’est bon et se contente de récupérer les informations.
Cela signifie que techniquement, n’importe quel site peut s'appuyer sur Apache pour identifier ses visiteurs. Il suffit de lire la variable REMOTE_USER qui contient le nom de l'utilisateur connecté.
Par exemple, en PHP, l’authentification de l’utilisateur se fera avec les quelques petites lignes de codes suivantes9:
<?php
$username = htmlspecialchars($_SERVER['REMOTE_USER']);
echo "<h1>Bienvenue, $username !</h1>";C’est simple et élégant. Pas besoin d’ajouter des frameworks bizarres pour tenter d’interfacer son code avec ldap ; apache et les autres serveurs web le font nativement. Et pour le code applicatif, délesté des problèmes d’authentification, il peut maintenant se concentrer sur ce qui est important. Pour FreshRSS : récupérer les articles des flux RSS10.
Double effet kisskool, vu que l’interface fournie par le fournisseur d’identité est simplissime (il met le nom de l’utilisateur dans une variable), on peut le remplacer tout aussi simplement. Un petit bout de conf et vous pouvez mettre vos utilisateurs dans un fichier htpasswd, une base de donnée SQL ou, soyons fous, en utilisant Kerberos11.