👤 C3.2.1 — SSO, OIDC & Keycloak · Séance 2/2

Bloc B3 Module M3.2 BTS SIO SLAM 3h30
FormationBTS SIO option SLAM — IRIS Mediaschool
BlocB3 — Cybersécurité des services informatiques
ModuleM3.2 — Identité numérique et authentification
CoursC3.2.1 — Gestion des identités et des comptes · Séance 2/2
CompétenceB3.2 — Préserver l'identité numérique de l'organisation
Durée3h30 (10 min intro/rappel + 75 min théorie + 85 min TP + 10 min synthèse)
PrérequisC3.2.1 Séance 1 — LDAP/AD. InnovatTech : annuaire OpenLDAP déployé.

Introduction — Mise en situation SSO (10 min)

Lors de la séance 1, nous avons déployé l'annuaire OpenLDAP d'InnovatTech. Problème actuel : un utilisateur doit se connecter à 8 applications différentes avec 8 mots de passe. Avec SSO : 1 seule authentification → accès à toutes les applications. Objectif de cette séance : réduire la fatigue due aux mots de passe et améliorer la gestion centralisée des accès.

Section 1 — Protocoles SSO (~50 min)

SAML 2.0

SAML (Security Assertion Markup Language) est un protocole mature pour la fédération d'identité entre un Identity Provider (IdP) et des Service Providers (SP). L'IdP émet des assertions signées XML ; la confiance est établie par échange de métadonnées et certificats.

Flux SP-initiated (le plus courant) :

Utilisateur        SP (App)              IdP (Keycloak)
    │──GET /app──────►│                       │
    │                 │──Redirect AuthnRequest─►│
    │◄────────────────│                       │
    │────────────────────────────────────────►│  (login utilisateur)
    │◄────────────────────────────────────────│
    │  Assertion SAML (HTTP-POST)             │
    │──Assertion─────►│                       │
    │                 │──Valide + session─────  │
    │◄────────────────│  Accès accordé         │

OAuth2 — Authorization Code Flow

OAuth2 est un cadre d'autorisation (pas d'authentification) permettant à une application d'obtenir l'autorisation d'agir au nom d'un utilisateur. 4 étapes :

  1. Authorization Request : le client redirige l'utilisateur vers l'Authorization Server avec client_id, scopes, redirect_uri
  2. Authorization Code : après consentement, l'Authorization Server renvoie un code de courte durée
  3. Token Request : le client échange le code contre un access_token (+ refresh_token) via une requête POST directe
  4. Utilisation : le client utilise l'access_token pour appeler l'API protégée (Resource Server)
⚠️ OAuth2 ≠ Authentification

OAuth2 est un protocole d'autorisation : il permet d'obtenir une permission d'accès aux ressources, mais ne standardise pas l'authentification de l'utilisateur. C'est pour cette raison qu'OpenID Connect a été créé.

OpenID Connect (OIDC)

OIDC est une couche d'identité construite au-dessus d'OAuth2. Il ajoute un ID Token (JWT) qui transporte l'identité de l'utilisateur.

Structure d'un JWT

// Header.Payload.Signature (3 parties séparées par des points)
// Payload décodé (exemple) :
{
  "sub": "1234567890",          // Identifiant unique de l'utilisateur
  "name": "Léa Martin",         // Nom complet
  "email": "lmartin@innovattech.fr",
  "iss": "https://auth.innovattech.fr",  // Émetteur (Issuer)
  "aud": "crm-app",             // Application destinataire (Audience)
  "exp": 1708900000,            // Expiration (timestamp Unix)
  "iat": 1708896400             // Date d'émission (Issued At)
}

Scopes OIDC standards : openid (obligatoire), profile, email, phone. Le scope openid déclenche l'émission de l'ID Token.

SCIM — Provisioning automatisé

SCIM (System for Cross-domain Identity Management) est un protocole REST standardisé pour automatiser la création/modification/suppression d'utilisateurs et de groupes entre un annuaire central et des applications cloud. Plutôt que créer manuellement des comptes dans chaque application, SCIM automatise les opérations CRUD via des endpoints HTTP (POST /Users, PATCH /Users/{id}, DELETE /Users/{id}).

Section 2 — Keycloak (~25 min)

Keycloak est une solution open-source IAM (Identity and Access Management) qui propose un IdP complet supportant OIDC, OAuth2 et SAML.

Concepts clés

ConceptDescription
RealmEspace de noms isolé contenant utilisateurs, rôles et clients (ex : realm "innovattech")
ClientApplication qui s'authentifie auprès du realm (ex : "crm-app")
UserCompte utilisateur dans le realm
RoleReprésente des droits ou groupes de permissions
User FederationConnexion à un annuaire LDAP/AD externe pour synchroniser les comptes

Déploiement rapide (développement)

docker run -d --name keycloak   -p 8080:8080   -e KEYCLOAK_ADMIN=admin   -e KEYCLOAK_ADMIN_PASSWORD=AdminPass1!   quay.io/keycloak/keycloak:latest start-dev
# Accéder à http://localhost:8080

TP — Déployer Keycloak et configurer un SSO OIDC (85 min)

Scénario : InnovatTech souhaite centraliser l'authentification de 3 applications (CRM, portail RH, ticketing). Votre mission : déployer Keycloak, créer le realm innovattech, configurer un client OIDC crm-app et démontrer un SSO fonctionnel.

Étapes

1. Déployer Keycloak avec Docker (commande ci-dessus)

2. Créer le realm innovattech dans l'interface d'administration

3. Créer un utilisateur de test lmartin avec mot de passe temporaire

4. Créer un client OIDC crm-app (type confidentiel, redirect URI : http://localhost:3000/callback)

5. Inspecter les endpoints OIDC :

# Récupérer les endpoints OIDC du realm innovattech
curl http://localhost:8080/realms/innovattech/.well-known/openid-configuration | python3 -m json.tool
# Identifie : authorization_endpoint, token_endpoint, jwks_uri, userinfo_endpoint

6. Tester le flux Authorization Code et décoder l'ID Token sur jwt.io, identifier ≥5 claims.

7. Optionnel : Configurer la User Federation LDAP pour synchroniser l'annuaire de la séance 1.

💡 Rappel sécurité

Ne jamais exposer le client_secret dans du code côté client (SPA, mobile). Utiliser PKCE pour les clients publics. Le mode start-dev n'est pas adapté à la production.

🔜 Cours suivant — C3.2.2

Politique de mots de passe et MFA : recommandations NIST SP 800-63B, passphrases, algorithmes de hachage modernes (Argon2, bcrypt), TOTP, FIDO2/WebAuthn et déploiement de la MFA sur SSH.

Synthèse (10 min)

Question : Quelle est la différence fondamentale entre OAuth2 et OpenID Connect ?

🎮 Quiz — Testez vos connaissances

3 QCM · 1 Vrai/Faux · 1 Question ouverte

QCM 1 — Nature d'OAuth2

OAuth2 est fondamentalement un protocole d'…

  1. Authentification (vérification d'identité)
  2. Autorisation (délégation de permissions d'accès)
  3. Chiffrement des communications
  4. Signature numérique des données
📋 Correction

B — Autorisation. OAuth2 est un cadre d'autorisation : il permet à une application (le client) d'obtenir l'autorisation d'agir au nom d'un utilisateur auprès d'un Resource Server. Il ne standardise pas l'authentification de l'utilisateur — c'est OpenID Connect qui ajoute cette couche d'identité.

QCM 2 — ID Token OIDC

Dans OpenID Connect, quel token transporte l'identité de l'utilisateur (claims comme nom, email…) ?

  1. access_token
  2. refresh_token
  3. id_token (JWT)
  4. bearer_token
📋 Correction

C — id_token (JWT). L'ID Token est un JWT (JSON Web Token) signé par l'Authorization Server qui contient des claims sur l'identité de l'utilisateur (sub, name, email, iss, aud, exp, iat…). Le client peut vérifier sa signature sans interroger une API supplémentaire. L'access_token, lui, est utilisé pour appeler les APIs protégées.

QCM 3 — Keycloak realm

Dans Keycloak, qu'est-ce qu'un realm ?

  1. Un certificat TLS pour sécuriser les communications
  2. Un espace de noms isolé contenant utilisateurs, rôles et clients
  3. Un protocole d'authentification propriétaire de Keycloak
  4. Un type de token utilisé pour les autorisations
📋 Correction

B. Un realm dans Keycloak est un espace de noms complètement isolé qui contient ses propres utilisateurs, rôles, clients et configurations. Par exemple, le realm "innovattech" contient tous les comptes et applications d'InnovatTech. On peut créer plusieurs realms pour séparer des environnements (développement, production) ou des organisations.

Vrai / Faux

OAuth2 seul peut être utilisé pour authentifier un utilisateur et connaître son identité sans extension supplémentaire.

📋 Correction

FAUX. OAuth2 est un protocole d'autorisation et ne définit pas comment authentifier un utilisateur ni comment obtenir des informations d'identité. Pour cela, il faut utiliser OpenID Connect (OIDC), qui est une extension d'OAuth2 ajoutant la notion d'ID Token (JWT) contenant les informations d'identité de l'utilisateur. SAML est une autre option pour la fédération d'identité.

Question ouverte

Décrivez les 4 étapes de l'Authorization Code Flow OAuth2 en précisant pour chaque étape les acteurs impliqués et les données échangées. Pourquoi ce flux est-il plus sécurisé que le Implicit Flow ?

📋 Éléments de réponse

Étape 1 — Authorization Request : le Client redirige l'utilisateur (Resource Owner) vers l'Authorization Server avec client_id, scopes demandés et redirect_uri. L'utilisateur s'authentifie et consent. Étape 2 — Authorization Code : l'Authorization Server redirige l'utilisateur vers le redirect_uri du client avec un paramètre code de courte durée (ne contient pas les droits en clair). Étape 3 — Token Request : le Client échange le code via une requête POST directe serveur-à-serveur (avec client_secret ou PKCE), en dehors du navigateur. L'Authorization Server retourne access_token et refresh_token. Étape 4 — Utilisation : le Client utilise l'access_token pour appeler le Resource Server. Ce flux est plus sécurisé que le Implicit Flow car l'access_token n'est jamais exposé dans l'URL du navigateur (il transite serveur-à-serveur), réduisant les risques de vol par historique de navigation ou logs proxy.