iampammfa
MDstable
IAM & PAM — Gestion des Identités et Accès Privilégiés
Architecture IAM/PAM : MFA, RBAC, gestion des comptes à privilèges, coffre-fort des secrets, audit des sessions
playbookintermediate 2026-06-19 5 min read
iampammfarbacprivileged-accessidentityactive-directory
IAM vs PAM
IAM Identity and Access ManagementGrer QUI peut accder QUOITous les utilisateurs employs prestataires systmesOutils Active Directory Keycloak Azure ADPAM Privileged Access ManagementGrer les accs des comptes HAUTS PRIVILGESAdmins root comptes de service critiquesOutils CyberArk HashiCorp Vault Teleport Smallstep
Architecture IAM — Concepts
RBAC (Role-Based Access Control)
Principe Droits attribus via des RLES pas directement aux utilisateursExempleRole "soc-analyst"Lecture alertes SIEMLecturecriture TheHiveLecture MISPPAS daccs serveurs de prodRole "soc-lead"Tout "soc-analyst"Gestion utilisateurs TheHiveAccs Velociraptor lectureRole "admin-infra"Accs SSH serveurs via bastionPas daccs SIEMAttribution User membre de Groupe a Role permet Permission
Principle of Least Privilege
Chaque compte na que les droits strictement ncessairesPas de comptes partags 1 personne 1 compteComptes admin spars des comptes user marcadmin vs marcComptes de service avec droits minimaux et sans login interactifRevue des droits trimestrielle access reviewRvocation immdiate au dpart dun employ
Active Directory — Bonnes pratiques IAM
powershell
# Tier Model Microsoft — Séparer les comptes admin par niveau# Tier 0 : Domain Admins, Enterprise Admins (DC uniquement)# Tier 1 : Server Admins (serveurs membres)# Tier 2 : Workstation Admins (postes de travail)# Créer un compte admin Tier 0 séparéNew-ADUser -Name "marc.t0" -GivenName "Marc" -Surname "T0-Admin" `-UserPrincipalName "marc.t0@domain.local" `-Path "OU=Tier0-Admins,OU=Admin,DC=domain,DC=local" `-AccountPassword (ConvertTo-SecureString "P@ssw0rd!" -AsPlainText -Force) `-Enabled $true# Fine-Grained Password Policy pour les adminsNew-ADFineGrainedPasswordPolicy -Name "Admins-PSO" `-Precedence 10 `-MinPasswordLength 20 `-PasswordHistoryCount 24 `-MaxPasswordAge "30.00:00:00" `-LockoutThreshold 5 `-LockoutDuration "00:30:00"Add-ADFineGrainedPasswordPolicySubject "Admins-PSO" -Subjects "Domain Admins"# Audit des membres des groupes sensiblesGet-ADGroupMember "Domain Admins" | Select-Object Name, SamAccountNameGet-ADGroupMember "Enterprise Admins" | Select-Object Name, SamAccountName# Comptes inactifs depuis 90 jours$cutoff = (Get-Date).AddDays(-90)Get-ADUser -Filter {LastLogonDate -lt $cutoff -and Enabled -eq $true} `-Properties LastLogonDate | Select-Object Name, LastLogonDate
MFA — Authentification Multi-Facteurs
Méthodes MFA (par niveau de sécurité)
| Méthode | Sécurité | Résistance phishing | |---------|----------|---------------------| | SMS OTP | Faible | Non (SIM swap) | | TOTP (Google Auth, Authy) | Moyen | Non | | Push notification (Duo) | Moyen | Non (MFA fatigue) | | FIDO2 / WebAuthn | Très haute | Oui | | Hardware key (YubiKey) | Très haute | Oui |
MFA sur SSH (Linux)
bash
# Google Authenticator PAMapt install libpam-google-authenticator# Pour chaque utilisateurgoogle-authenticator# Répondre oui à toutes les questions# Sauvegarder le QR code et les codes de secours# /etc/pam.d/sshdauth required pam_google_authenticatorso# /etc/ssh/sshd_configChallengeResponseAuthentication yesAuthenticationMethods publickeykeyboard-interactivesystemctl restart sshd
Keycloak — SSO + MFA centralisé
yaml
# docker-compose.ymlservices:keycloak:image: quay.io/keycloak/keycloak:24.0ports:- "8080:8080"environment:- KEYCLOAK_ADMIN=admin- KEYCLOAK_ADMIN_PASSWORD=ChangeMe!2026- KC_DB=postgres- KC_DB_URL=jdbc:postgresql://postgres/keycloak- KC_DB_USERNAME=keycloak- KC_DB_PASSWORD=keycloak_passcommand: start-devdepends_on:- postgrespostgres:image: postgres:15environment:- POSTGRES_DB=keycloak- POSTGRES_USER=keycloak- POSTGRES_PASSWORD=keycloak_pass
# Configuration Keycloak — Realm SOC1 Crer Realm "soc"2 Authentication > Required Actions > Configure OTP enabled3 Authentication > Flows > Browser OTP conditionnel4 Clients Ajouter TheHive Shuffle Grafana OIDC5 Users Assigner rles selon RBAC
PAM — Gestion des accès privilégiés
HashiCorp Vault — Coffre-fort des secrets
bash
# Installation Vaultwget https//releases.hashicorp.com/vault/1.17.0/vault_1.17.0_linux_amd64.zipunzip vault_117zip && mv vault /usr/local/bin/# Dockerdocker run -d --name vault-p 82008200-e VAULT_DEV_ROOT_TOKEN_IDmyroot-e VAULT_DEV_LISTEN_ADDRESS00008200hashicorp/vaultlatest# Accès GUI : http://localhost:8200export VAULT_ADDR'http://localhost:8200'export VAULT_TOKEN'myroot'
bash
# Stocker des secretsvault kv put secret/databasehostdbinternalusernameapp_userpasswordSuperSecret123# Lire un secretvault kv get secret/databasevault kv get -field=password secret/database# Secret dynamique — Vault génère un compte DB temporairevault secrets enable databasevault write database/config/mydbplugin_namepostgresql-database-pluginconnection_url"postgresql://{{username}}:{{password}}@postgres:5432/prod"allowed_roles"app-role"username"vault-admin"password"vault-admin-pass"vault write database/roles/app-roledb_namemydbcreation_statements"CREATE ROLE '{{name}}' WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}'; GRANT SELECT ON ALL TABLES IN SCHEMA public TO '{{name}}';"default_ttl"1h"max_ttl"24h"# Obtenir un credential temporairevault read database/creds/app-role# → username: v-app-role-abc123# → password: A1B2-XXXX (expire dans 1h)
Teleport — Bastion et audit de sessions
yaml
# docker-compose.ymlservices:teleport:image: public.ecr.aws/gravitational/teleport:15ports:- "3022:3022" # SSH- "3080:3080" # Web UI + API- "3025:3025" # Tunnelvolumes:- ./teleport.yaml:/etc/teleport/teleport.yaml- teleport_data:/var/lib/teleportcommand: startvolumes:teleport_data:
yaml
# teleport.yamlteleport:nodename: teleport-serverdata_dir: /var/lib/teleportlog:output: stderrseverity: INFOauth_service:enabled: yescluster_name: soc-labssh_service:enabled: yeslabels:env: labproxy_service:enabled: yesweb_listen_addr: 0.0.0.0:3080public_addr: teleport.soc-lab:3080
bash
# Créer un admintctl users add admin --roles=editor,access,auditor# Connexion SSH via Teleport (avec MFA)tsh login --proxy=teleport.soc-lab:3080 --user=marctsh ssh userserveur# Audit des sessions (enregistrement vidéo)# Web UI : https://teleport.soc-lab:3080/web/cluster/soc-lab/audit/events
Checklist IAM/PAM
IAMTous les comptes nominatifs pas de comptes gnriquesMFA activ sur tous les accs VPN SSH web appsRBAC configur revue trimestrielle des droitsOffboarding immdiat dsactivation J0SSO centralis Keycloak pour les apps internesLogs dauthentification collects dans le SIEMPAMComptes admin spars des comptes userMots de passe admin stocks dans Vault rotation autoAccs serveurs uniquement via bastion TeleportSessions admin enregistres audit completCredentials applicatifs dans Vault pas dans le codeCredentials de service rotation automatique TTLBreak-glass account pour urgence monitored
OPS·BRAIN v1.092 notes · Securitylocal