Aller au contenu

Authentification SAML

Intégration de Guacamole avec un fournisseur d'identité SAML 2.0 (Azure AD, Okta, Keycloak, etc.) pour une authentification centralisee.


Concepts SAML

SAML 2.0 est un protocole de fédération d'identité basé sur des assertions XML signees. Guacamole joue le rôle de Service Provider (SP) et delègue l'authentification a un Identity Provider (IdP).

sequenceDiagram
    actor Utilisateur
    participant Guacamole as Guacamole (SP)
    participant IdP

    Utilisateur->>Guacamole: Acces a l'application
    Guacamole->>Utilisateur: Redirect vers IdP (AuthnRequest)
    Utilisateur->>IdP: Authentification (login/MFA)
    IdP->>Utilisateur: Assertion SAML signee (redirect)
    Utilisateur->>Guacamole: POST assertion (ACS URL)
    Guacamole->>Guacamole: Verification signature + extraction attributs
    Guacamole->>Utilisateur: Session ouverte

Terminologie

Terme Définition
SP (Service Provider) L'application qui consomme l'identité — ici Guacamole
IdP (Identity Provider) Le fournisseur d'identité — Azure AD, Okta, Keycloak...
Metadata Fichier XML décrivant le SP ou l'IdP (certificats, URLs)
Assertion Réponse XML signee par l'IdP contenant les attributs utilisateur
Entity ID Identifiant unique du SP, sous forme d'URL
ACS URL Assertion Consumer Service URL — endpoint Guacamole recevant l'assertion

Configuration guacamole.properties

Editez /etc/guacamole/guacamole.properties sur la VM (ou mettez à jour le template Ansible pour le prochain build) :

# SAML Identity Provider
saml-idp-metadata-url: https://login.microsoftonline.com/TENANT_ID/federationmetadata/2007-06/federationmetadata.xml
saml-idp-url: https://login.microsoftonline.com/TENANT_ID/saml2

# Service Provider
saml-entity-id: https://guacamole.exemple.com/guacamole
saml-callback-url: https://guacamole.exemple.com/guacamole

# Attribut de groupe (optionnel)
saml-group-attribute: groups

Configuration IdP

L'URL de metadata (saml-idp-metadata-url) est spécifique à chaque IdP :

  • Azure AD : https://login.microsoftonline.com/{TENANT_ID}/federationmetadata/2007-06/federationmetadata.xml
  • Okta : https://{DOMAIN}.okta.com/app/{APP_ID}/sso/saml/metadata
  • Keycloak : https://{HOST}/realms/{REALM}/protocol/saml/descriptor

Guacamole téléchargé ce fichier au démarrage de Tomcat. L'URL doit être accessible depuis la VM Guacamole.

Après modification, redemarrez Tomcat :

sudo systemctl restart tomcat9

Informations a fournir à l'IdP

L'administrateur de l'IdP a besoin de ces informations pour créer l'application SAML :

Information Valeur
Entity ID / Identifier https://guacamole.exemple.com/guacamole
ACS URL / Reply URL https://guacamole.exemple.com/guacamole
Name ID Format urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified
Attribut attendu : username Doit correspondre au login Guacamole
Attribut attendu : groups Noms des groupes Guacamole (optionnel)

Le Name ID transmis par l'IdP devient le nom d'utilisateur dans Guacamole.


Fallback admin local

Si l'IdP est indisponible ou mal configuré, l'accès à l'interface de login local est possible via :

https://guacamole.exemple.com/guacamole/#/?login=local

Cette URL contourne SAML et affiche le formulaire de login standard. Utile pour l'administration en cas de problème avec l'IdP.


Auto-création des comptes

Lorsqu'un utilisateur s'authentifie via SAML pour la première fois, Guacamole peut créer automatiquement son compte dans PostgreSQL :

postgresql-auto-create-accounts: true

Ce parametre est déjà present dans le template Ansible du chapitre précédent. Le compte est créé sans connexions assignees : l'administrateur doit ensuite lui attribuer des accès.


Priorité des providers

Guacamole charge les extensions JAR par ordre alphabetique du nom de fichier. Si plusieurs extensions d'authentification sont presentes, l'ordre de chargement déterminé la priorité.

Pour forcer SAML en premier, renommez les fichiers JAR avec un préfixe numérique (01-guacamole-auth-sso-saml-...jar) ou assurez-vous que l'ordre alphabetique naturel correspond à la priorité souhaitee.

Dans la configuration de ce tutoriel, JDBC et SAML coexistent : SAML gère l'authentification, JDBC stocke les connexions et les permissions.


Tests SAML

Étape 1 : vérifier la metadata SP

Guacamole expose sa propre metadata a :

https://guacamole.exemple.com/guacamole/api/ext/saml/metadata

Verifiez que l'EntityID et l'ACS URL correspondent à ce que vous avez configuré.

Étape 2 : tester le flux

  1. Ouvrez https://guacamole.exemple.com/guacamole/ dans un navigateur prive
  2. Vous devez être redirige vers la page de login de l'IdP
  3. Authentifiez-vous avec un compte IdP valide
  4. Vous devez être redirige vers Guacamole avec une session ouverte

Étape 3 : vérifier les logs

sudo journalctl -u tomcat9 -f | grep -i saml

Les erreurs courantes sont des problèmes de signature (certificat IdP obsolète) ou d'URL de callback incorrecte.


HTTPS recommande en production

SAML signe les assertions XML mais ne les chiffre pas systematiquement. En HTTP, les assertions transitent en clair et peuvent être rejouees (replay attack). En production, Guacamole doit imperativement être expose en HTTPS via un reverse proxy (nginx, Caddy, Cloud Load Balancer).

L'IdP refuse souvent d'envoyer des assertions vers des URLs HTTP non securisees.