Apache Guacamole : comment configurer l’authentification Active Directory (LDAP) ?
Sommaire
I. Présentation
Dans ce tutoriel, nous allons configurer un serveur Apache Guacamole pour permettre la connexion des utilisateurs Active Directory. Cette synchronisation (unidirectionnelle) avec l'Active Directory va également permettre de remonter les groupes Active Directory dans Apache Guacamole. Ainsi, nous pourrons attribuer des droits aux groupes Active Directory afin de donner des droits aux membres de ces groupes (selon la liste des membres de ces groupes dans l'annuaire AD).
Pour qu'Apache Guacamole s'appuie sur l'Active Directory, il y a plusieurs prérequis :
- Installer l'extension LDAP pour Guacamole
- Disposer d'un compte utilisateur dans l'Active Directory (pour interroger l'annuaire) - Pas besoin d'être admin !
- Identifier la partie de l'arborescence Active Directory qui sera utilisée comme base de recherche pour les objets
A cela, on peut ajouter :
- Disposer d'un groupe de sécurité qui contient tous les utilisateurs ayant le droit de se connecter à Guacamole. C'est facultatif, mais l'idée me plaît.
Avant de suivre ce tutoriel, il est recommandé d'avoir suivi celui sur l'installation et la configuration de base :
II. Installer l'extension LDAP pour Apache Guacamole
Tout d'abord, connectez-vous sur le serveur Guacamole en ligne de commande afin d'installer l'extension LDAP.
Ensuite, positionnez-vous dans "/tmp" et téléchargez l'archive tar.gz de l'extension :
cd /tmp wget https://downloads.apache.org/guacamole/1.5.2/binary/guacamole-auth-ldap-1.5.2.tar.gz
Une fois que c'est fait, décompressez cette archive tar.gz :
tar -xzf guacamole-auth-ldap-1.5.2.tar.gz
Puis, déplacer le fichier JAR de l'extension vers le répertoire "extensions" de Guacamole.
sudo mv guacamole-auth-ldap-1.5.2/guacamole-auth-ldap-1.5.2.jar /etc/guacamole/extensions
Pour que cette extension soit prise en charge, il convient de redémarrer Tomcat9 :
sudo systemctl restart tomcat9
Toutefois, vous pouvez attendre avant de le faire car vous devez encore configurer l'extension.
III. Connecter Guacamole à l'Active Directory
Toujours sur le serveur Apache Guacamole, ouvrez le fichier de configuration :
sudo nano /etc/guacamole/guacamole.properties
Dans ce fichier, il y a déjà d'autres propriétés définies, notamment les informations de connexion à la base de données MySQL (MariaDB). Vous devez configurer l'extension LDAP.
Premièrement, vous devez indiquer le nom du contrôleur de domaine, le port LDAP (389 par défaut) et la méthode de chiffrement (none avec du LDAP classique). Ce qui donne les lignes suivantes à ajouter dans le fichier :
### Active Directory # Controleur de domaine ldap-hostname: srv-adds-01.it-connect.local ldap-port: 389 ldap-encryption-method: none
Deuxièmement, à la suite, vous devez ajouter les informations sur le compte à utiliser pour s'authentifier auprès de l'annuaire Active Directory. Ce compte sert uniquement à lire le contenu de l'annuaire (utilisateurs, groupes, et membre des groupes). Dans l'exemple ci-dessous, le compte "[email protected]" est utilisé.
# Utilisateur pour connexion AD ldap-search-bind-dn: [email protected] ldap-search-bind-password: P@ssword!
Troisièmement, vous devez indiquer comment rechercher les utilisateurs dans l'Active Directory. Comme base DN, c'est-à-dire comme base de recherche, on évite de mettre la racine de l'annuaire Active Directory.
Ici, l'OU "OU=Tiering,OU=IT,DC=it-connect,DC=local" qui contient d'autres sous-OU ainsi que les comptes d'administration sera ciblée. Tout ce qui est en dehors de cette racine "ne sera pas vu" par Guacamole. Ceci correspond au paramètre "ldap-user-base-dn". Ensuite, le paramètre "ldap-username-attribute" sert à spécifier l'attribut AD utilisé pour les noms d'utilisateurs.
Enfin, le paramètre "ldap-user-search-filter" permet de déclarer le filtre de recherche. Ici, on prend tous les utilisateurs qui sont membres du groupe de sécurité Active Directory "GDL-Guacamole-Access".
# Recherche des utilisateurs ldap-user-base-dn: OU=Tiering,OU=IT,DC=it-connect,DC=local ldap-username-attribute: sAMAccountName ldap-user-search-filter: (&(objectClass=User)(sAMAccountName=*)(memberOf:1.2.840.113556.1.4.1941:=CN=GDL-Guacamole-Access,OU=Groupes,OU=T0,OU=Tiering,OU=IT,DC=it-connect,DC=local))
Quatrièmement, vous devez ajouter des paramètres de recherche pour les groupes. Si vous souhaitez uniquement rechercher les utilisateurs, cette partie n'est pas obligatoire. Sur le même principe, on indique la base de recherche et le filtre. Ici, on prend tous les groupes situés sous la base DN.
# Recherche des groupes
ldap-group-base-dn: OU=Tiering,OU=IT,DC=it-connect,DC=local
ldap-group-search-filter: (objectClass=Group)
Le fichier de configuration est prêt ! Sauvegardez et fermez le fichier. Il ne reste plus qu'à relancer Tomcat9 :
sudo systemctl restart tomcat9
Il y a d'autres paramètres disponibles pour l'extension LDAP. Ceci est détaillé dans la documentation officielle :
IV. Tester l'authentification Active Directory
Désormais, vous devez pouvoir vous connecter à Guacamole avec un compte utilisateur de l'Active Directory qui est membre du groupe "GDL-Guacamole-Access". Après avoir fait quelques tests, vous allez constater que :
- La connexion avec un compte utilisateur de l'Active Directory est opérationnelle, mais il n'y a aucune connexion accessible
- Le compte d'administration local de Guacamole ne voit aucun utilisateur ni aucun groupe
Que faire ?
Il faut que l'on ait un compte administrateur de Guacamole qui existe aussi dans l'Active Directory et qui soit dans le périmètre de nos filtres LDAP. Par exemple, vous pouvez créer le compte "Sync_Guacamole" dans Apache Guacamole en tant que nouvel administrateur (attribuez-lui tous les droits).
Attention, si vous mettez le même identifiant que dans l'AD ainsi que le même mot de passe, vous allez avoir des surprises. En effet, Guacamole recherche en priorité dans la base MySQL donc s'il parvient à vous authentifier via la base MySQL, il n'ira pas chercher dans l'AD donc les objets utilisateurs et groupes n'apparaîtront pas dans Guacamole.
Vous avez deux solutions :
- Utiliser un mot de passe robuste différent pour le compte dans Guacamole (comme ça, la connexion MySQL échouera donc il fera une tentative LDAP et là, ça fonctionnera)
- Modifier le fichier "guacamole.properties" pour prioriser l'utilisation de LDAP comme source d'authentification en ajoutant cette ligne :
extension-priority: ldap
Désormais, quand on se connecte avec Sync_Guacamole, on voit bien les utilisateurs de l'Active Directory :
Ainsi que les groupes de sécurité Active Directory :
Une bonne nouvelle !
V. Créer automatiquement les comptes Active Directory (facultatif)
Par défaut, Apache Guacamole ne va pas enregistrer dans sa base de données les comptes Active Directory qui n'ont pas fait l'objet d'une première connexion sur l'application. Si vous souhaitez créer ces comptes automatiquement, il y a une directive à ajouter dans le fichier "guacamole.properties" :
mysql-auto-create-accounts: true
Attention à ne pas confondre avec l'option ci-dessous qui bloque l'utilisation de comptes provenant de sources externes. Autrement dit, il ne sera pas possible de se connecter avec un compte LDAP (AD).
mysql-user-required: true
Comme à chaque fois, on termine en relançant le service Tomcat9 :
sudo systemctl restart tomcat9
VI. Droits sur les connexions
Toujours à partir du compte Sync_Guacamole, il est temps d'attribuer des droits sur les connexions pour nos utilisateurs Active Directory.
Il y a deux options :
- Attribuer les droits sur les utilisateurs
- Attribuer les droits sur les groupes
Dans cet exemple, si l'on modifie le groupe "GDL-Admins-T0", on peut constater qu'il n'a pas de membres : c'est normal, même s'il y a des membres dans l'AD, ils n'apparaîtront pas ici, mais les droits s'appliqueront tout de même. Il ne reste plus qu'à donner des droits à ce groupe de sécurité en cochant les connexions.
Vous devez faire cette association entre les groupes et les connexions puis valider. Désormais, l'utilisateur "admin.t0", membre du groupe "GDL-Admins-T0" doit pouvoir se connecter à Guacamole et accéder aux connexions !
Il ne reste plus qu'à choisir un serveur et la connexion sera établie avec le même identifiant et mot de passe que celui du compte Active Directory ! Enfin, ceci est vrai uniquement si la connexion est configurée pour utiliser les variables ${GUAC_USERNAME} et ${GUAC_PASSWORD} pour la connexion (expliqué dans le premier tutoriel sur Guacamole).
V. Conclusion
Suite à cette configuration, Apache Guacamole est capable d'authentifier les utilisateurs auprès de l'Active Directory et nous pouvons utiliser les groupes de sécurité Active Directory pour gérer les permissions sur les connexions ! Pour aller encore plus loin, il faudrait faire une évolution du schéma Active Directory pour gérer les connexions Guacamole directement en tant qu'objets Active Directory. C'est une possibilité évoquée et un peu documentée dans la documentation officielle d'Apache Guacamole.
Sur IT-Connect, retrouvez d'autres tutoriels sur Apache Guacamole :
Bonjour,
Merci pour cette présentation
j’ai suivi la procédure pour mon environnement
mais hélas aucune connexion entre l’ad et guacamole
il y a t’il une test possible afin de savoir si guacamole communique bien avec mon AD
Merci pour votre travail
Bonjour,
Enlève le ldap-user-search-filter, j’avais le meme problème jusqu’au moment ou j’ai enlevé cette ligne et là plus de pb.
Hello,
A mon avis c’est important de garder ce filtre pour cibler une partie de l’annuaire Active Directory, et ne pas permettre de récupérer tous les utilisateurs…
Bonjour Florian,
En fait je pense avoir trouvé mon problème.
Dans un OU j’ai un accent et ca pose problème je penses sa donne quelque chose comme:
CN=GDL-Guacamole-Access,OU=Groupés,OU=T0,OU=Tiering,OU=IT,DC=it-connect,DC=local
un mot comme ici Groupés à un accent.
Avez vous une solution ou un caractère d’échappement
?
Génère un compte local identique à un compte AD (SamAccountName) et tu verras les Users apparaitront par magie
Bonjour Florian
J’avais une question concernant Guacamole
ldap-user-search-filter: (&(objectClass=User)(sAMAccountName=*)(memberOf:1.2.840.113556.1.4.1941:=CN=GDL-Guacamole-Access,OU=Groupes,OU=T0,OU=Tiering,OU=IT,DC=it-connect,DC=local))
memberOf:1.2.840.113556.1.4.1941: <—– 1.2.840.113556.1.4.1941 ça vient d'où? car je n'arrive pas à faire fonctionner le ldap.
Bonjour, j’ai le même soucis si j’enlève le filtre ça fonctionne avec le filtre ça ne marche pas.
Version 1.5.3.
Pourtant le filtre en lui même fonctionne quand je le test dans mon active directory via la console où en powershell.
Bonjour Franck, j’ai trouvé la solution. C’est parce que ton utilisateur que tu spécifies dans ldap-search-bind-dn n’a pas le droit de lire l’attribut MemberOf. Donc le plus brutale est de le mettre dans le groupe Administrateurs ou alors il faut que tu délégues l’accès à ce champ pour ton utilisateur.
Very nice tutorial, It helped me to integrate AD with Guacamole Server.
Bonjour,
Merci pour ce tutoriel efficace et de qualité comme d’habitude avec it-connect !
J’ai pu mettre en place l’authentification LDAPS avec ssl / starttls.
Ca fonctionne mais dans les deux cas j’ai ces erreurs dans Tomcat (catalina.out) :
[2024-02-02 14:00:03] [info] 02-02-2024 14:00:03 [NioProcessor-1] WARN o.a.d.l.c.api.LdapNetworkConnection – null
[2024-02-02 14:00:03] [info] org.apache.mina.core.write.WriteToClosedSessionException: null
[2024-02-02 14:00:03] [info] #011at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.clearWriteRequestQueue(AbstractPollingIoProcessor.java:1192)
[2024-02-02 14:00:03] [info] #011at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.removeNow(AbstractPollingIoProcessor.java:1153)
[2024-02-02 14:00:03] [info] #011at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.removeSessions(AbstractPollingIoProcessor.java:864)
[2024-02-02 14:00:03] [info] #011at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:694)
[2024-02-02 14:00:03] [info] #011at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64)
[2024-02-02 14:00:03] [info] #011at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
[2024-02-02 14:00:03] [info] #011at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
[2024-02-02 14:00:03] [info] #011at java.base/java.lang.Thread.run(Thread.java:829)
[2024-02-02 14:00:03] [info] 02-02-2024 14:00:03 [https-openssl-nio-443-exec-1] INFO o.a.g.a.l.AuthenticationProviderService – User « tur » was successfully authenticated by LDAP server « 2k22fr-tstad.test.lan ».
[2024-02-02 14:00:03] [info] 02-02-2024 14:00:03 [https-openssl-nio-443-exec-1] INFO o.a.g.r.auth.AuthenticationService – User « tur » successfully authenticated from XXX.XXX.XXX.XXX.
Le certificat de la CA signant le certificat du contrôleur de domaine est bien dans le keystore java.
Ces logs sont présences en mode « ssl » ou « starttls » mais la connexion ldap fonctionne quand meme.
En mode LDAP simple je n’ai pas ces erreurs.
D’autre personnes dans le même cas ? Une idée pour résoudre la cause de ces logs / les faire taire ?
Bonjour Florian, j’ai suivi toutes tes étapes pour la configuration du Ldap. Cependant, je n’arrive toujours pas à me connecter à Guacamole avec un compte utilisateur de l’AD.
Est-ce que le compte utilisé pour la liaison doit appartenir au groupe qui doit acceder à guacamole?
Est-ce que le compte utilisé pour la liaison doit forcement être admin dans l’AD? Merci d’avance pour votre reponse.
Bonjour,
J’ai remarqué que lorsque des comptes AD sont dans le groupe AD « Protected Users », l’authentification fonctionne beaucoup moins bien.
Bonjour,
j’ai le même problème : compte dans le groupe « protected users » => on ne se connecte plus à l’interface
Dans le fichier catalina.out, on a le message « User « » did not successfully authenticate against any LDAP server.