Aller au contenu
medium

Sécurité opérationnelle IAM

12 min de lecture

Un système IAM mal opéré devient une cible de choix. Tokens trop longs, logs absents, secrets non rotationés, pas de runbook… Ce guide couvre les mesures de hardening essentielles, l’observabilité à mettre en place, et les procédures de réponse aux incidents. Parce que déployer Keycloak ne suffit pas — il faut l’opérer de manière sécurisée.

Ce guide vous donne les clés pour opérer un système IAM en production. À la fin, vous saurez :

  • Identifier les menaces courantes : phishing, token theft, session hijacking
  • Appliquer les mesures de hardening : PKCE, durées courtes, rotation
  • Observer votre IAM : logs, métriques, alertes
  • Répondre aux incidents : playbooks, révocation, communication

Prérequis : avoir lu les guides OAuth 2.x, OIDC et MFA/WebAuthn.

L’attaquant crée un faux site (ou email) pour capturer les credentials.

VarianteDescriptionCible
Phishing classiqueFaux formulaire de loginMot de passe
Phishing TOTPCapture OTP en temps réelMFA classique
OAuth phishingFausse page d’autorisationCode d’autorisation
Spear phishingCiblé sur une personne (admin, finance)Comptes à privilèges

Mitigation :

  • MFA phishing-resistant (WebAuthn, passkeys)
  • Formation des utilisateurs
  • Filtrage email (SPF, DKIM, DMARC)

Vol de tokens (access, refresh, session) pour usurper l’identité.

VecteurCommentImpact
XSSJavaScript malveillant lit le token en mémoireAccès API
CSRFL’utilisateur exécute une action sans le savoirChangement d’état
Log exposureToken loggé en clairPersistence de l’attaque
Man-in-the-MiddleInterception réseau (HTTP, proxy mal configuré)Tout

Mitigation :

  • Cookies HttpOnly, Secure, SameSite=Strict
  • Durées courtes (access token 5-15 min)
  • Rotation des refresh tokens
  • Validation de l’audience

Ces deux attaques ciblent le mécanisme de session plutôt que les credentials. Elles sont souvent sous-estimées car elles ne nécessitent pas de casser un mot de passe.

AttaqueDescription
Session hijackingL’attaquant vole un session ID existant
Session fixationL’attaquant force un session ID connu, puis attend que l’utilisateur se connecte

Mitigation :

  • Régénérer le session ID après login
  • Lier la session à l’IP / user-agent (avec prudence)
  • Durée de session limitée

L’attaquant obtient plus de droits que prévu.

TypeExemple
VerticalUser → Admin
HorizontalUser A accède aux données de User B

Mitigation :

  • Valider les permissions côté serveur (pas seulement UI)
  • Principle of Least Privilege
  • Tests de politiques automatisés

Rejouer un token ou une requête capturée.

Mitigation :

  • nonce dans les requêtes OIDC
  • Durées courtes + jti (JWT ID) unique
  • Token binding (lié à la session TLS)
MesurePourquoiImpact
PKCE obligatoireEmpêche l’interception du codeTous les clients
Access token 5-15 minLimite la fenêtre d’exploitationRefresh plus fréquent
Refresh token rotationChaque usage génère un nouveau refreshDétecte le vol
Audience validationEmpêche l’utilisation d’un token sur un autre serviceCritique
Issuer validationVérifie que le token vient du bon IdPCritique
// Checklist de validation JWT
function validateToken(token) {
const decoded = jwt.decode(token, { complete: true });
// 1. Signature valide
jwt.verify(token, publicKey, { algorithms: ['RS256'] });
// 2. Issuer attendu
if (decoded.payload.iss !== 'https://auth.example.com') throw new Error('Invalid issuer');
// 3. Audience correcte
if (!decoded.payload.aud.includes('my-api')) throw new Error('Invalid audience');
// 4. Non expiré
if (decoded.payload.exp < Date.now() / 1000) throw new Error('Token expired');
// 5. Not Before respecté
if (decoded.payload.nbf > Date.now() / 1000) throw new Error('Token not yet valid');
return decoded.payload;
}
ParamètreRecommandation
Durée de session15-30 min inactive, 8h max absolue
Cookie flagsHttpOnly, Secure, SameSite=Strict
Régénération IDAprès chaque élévation de privilège
InvalidationLogout = suppression côté serveur
  1. Rotation régulière

    Rotez les signing keys tous les 90 jours (automatisé).

  2. Secret management

    Utilisez un vault (HashiCorp Vault, AWS Secrets Manager).

  3. Pas de secrets dans le code

    Variables d’environnement ou fichiers montés, jamais en dur.

  4. Audit des accès

    Loggez qui accède aux secrets.

PilierDonnées IAM
LogsAuthentifications, autorisations, erreurs
MétriquesLatence, taux de succès/échec, MFA adoption
TracesParcours utilisateur, corrélation avec les apps
ÉvénementPrioritéDétails à capturer
Login success/failureHauteUser, IP, user-agent, timestamp, MFA utilisé
Token issuanceHauteClient, scopes, audience
Token refreshMoyenneRefresh token ID, rotation
LogoutMoyenneUser, session ID
Password changeHauteUser, IP, méthode (self/admin)
MFA enrollment/unenrollHauteUser, type d’authenticator
Admin actionsCritiqueQui, quoi, sur qui
MétriqueAlerte si
Login failure rate> 5% sur 5 min
MFA failure rate> 10% (possible MFA fatigue attack)
Token refresh rateSpike inhabituel
Latency P99 auth> 2s
Active sessionsSpike ou chute brutale
User: alice@example.com
IP: 203.0.113.42 (nouveau pays: RU)
Action: Password change
Time: 03:47 UTC (inhabituel)
MFA: OTP (pas WebAuthn habituel)
→ ALERTE : Possible account takeover
IncidentGravitéExemples
Credential compromiseCritiqueMot de passe admin fuité
Session hijackHauteToken volé, accès non autorisé
MFA bypassCritiqueFaille dans le flow MFA
Privilege escalationCritiqueUser devient admin
DoS sur l’IdPHauteIdP indisponible = personne ne peut se connecter
  1. Containment immédiat

    • Révoquer toutes les sessions de l’utilisateur
    • Invalider tous les refresh tokens
    • Désactiver le compte si nécessaire
  2. Investigation

    • Quand le credential a-t-il été compromis ?
    • Quelles actions ont été effectuées ?
    • D’autres comptes sont-ils affectés ?
  3. Remediation

    • Forcer un changement de mot de passe
    • Réenrôler le MFA
    • Vérifier les modifications (email, permissions)
  4. Communication

    • Informer l’utilisateur
    • Notifier le management si données sensibles
    • Déclaration réglementaire si nécessaire (RGPD, etc.)
  5. Post-mortem

    • Comment l’attaque s’est-elle produite ?
    • Quelles mesures pour éviter la récidive ?
  1. Identifier le scope

    • Quel token ? Access, refresh, session ?
    • Quel utilisateur / service account ?
    • Depuis quand ?
  2. Révoquer

    • Invalider le token (si token opaque + store)
    • Révoquer le refresh token
    • Terminier la session
  3. Analyser l’impact

    • Quelles API ont été appelées ?
    • Quelles données ont été accédées ?
  4. Renforcer

    • Réduire la durée des tokens
    • Activer la rotation des refresh tokens
    • Ajouter token binding si possible
Type de tokenStratégie de révocation
Access token (JWT)Durée courte (5-15 min), pas de révocation individuelle
Access token (opaque)Lookup en base, révocation immédiate
Refresh tokenStore côté serveur, révocation par rotation ou explicite
SessionStore côté serveur, invalidation immédiate

Pour une compromission majeure :

Fenêtre de terminal
# Keycloak : révoquer toutes les sessions d'un realm
POST /admin/realms/{realm}/logout-all
# Keycloak : révoquer les sessions d'un utilisateur
POST /admin/realms/{realm}/users/{userId}/logout

Côté resource server, vérifiez si le token est toujours valide :

Fenêtre de terminal
POST /oauth2/introspect
Content-Type: application/x-www-form-urlencoded
token=eyJhbGci...&token_type_hint=access_token

Réponse :

{
"active": false,
"reason": "Token revoked"
}
  1. Générer une nouvelle clé

    Ajouter à la JWKS sans supprimer l’ancienne.

  2. Publier la nouvelle clé

    La JWKS expose maintenant 2 clés (ancienne + nouvelle).

  3. Basculer la signature

    L’IdP signe les nouveaux tokens avec la nouvelle clé.

  4. Attendre l’expiration

    Les anciens tokens expirent naturellement.

  5. Supprimer l’ancienne clé

    Retirer de la JWKS après expiration du plus long token.

ÉtapeAction
1Générer un nouveau secret
2Configurer l’application avec le nouveau (dual-secret)
3Tester que le nouveau fonctionne
4Révoquer l’ancien secret
5Supprimer l’ancien des configurations
  • PKCE activé sur tous les clients
  • Access tokens ≤ 15 min
  • Refresh token rotation activée
  • Cookies HttpOnly, Secure, SameSite=Strict
  • MFA obligatoire pour les admins
  • Validation iss, aud, exp, nbf sur tous les tokens
  • Secrets dans un vault, pas dans le code
  • Logs envoyés au SIEM
  • Alertes configurées (failure rate, anomalies)
  • Rotation des signing keys planifiée (90 jours)
  • Playbooks de réponse aux incidents documentés
  • Tests de pénétration réguliers (focus auth)
  • Revue des permissions et accès admin (trimestriel)

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.