Project Oxygen & Ideo-LabIDEO LAB Dashboard 2026

🔒 AWS IAM – Identity & Access Management

Le cƓur de la sĂ©curitĂ© AWS : gestion des identitĂ©s (utilisateurs, groupes, rĂŽles), des policies JSON et du principe de moindre privilĂšge.

1.1

Concept : IAM, le cƓur de la sĂ©curitĂ© AWS

Service central qui contrĂŽle qui peut faire quoi, oĂč et sur quelles ressources dans AWS.

Security Identity
1.2

Identités IAM : Users, Groups, Roles

Gestion fine des comptes humains, techniques et des rĂŽles pour les services.

Users Roles
1.3

Policies JSON : Allow / Deny

Structures JSON qui décrivent les autorisations accordées ou refusées.

Policy JSON Allow/Deny
2.1

Managed vs Inline Policies

Différence entre policies réutilisables et policies rattachées à une seule identité.

Managed Inline
2.2

Authentification : Console & API

AccĂšs via console, clĂ©s d’API, profils de rĂŽles, Identity Center / SSO.

Access Keys SSO
2.3

MFA & Sécurisation du compte root

Protéger le compte root, activer MFA partout, supprimer les clés root.

MFA Root Account
3.1

RĂŽles IAM pour services AWS

EC2, Lambda, ECS, Glue : déléguer des autorisations aux services via des rÎles.

Service Role EC2/Lambda
3.2

AssumeRole & STS

Assumer un rĂŽle temporaire pour les accĂšs cross-account ou temporaires.

STS Temporary Creds
4.1

Service Control Policies (SCP)

Gouvernance globale avec AWS Organizations pour restreindre tous les comptes.

SCP Organizations
4.2

Resource-Based Policies

Policies directement sur les ressources (S3, KMS, SNS, SQS
).

S3 Policy KMS
5.1

Tags & ABAC (Attribute-Based Access)

ContrÎler les accÚs sur la base de tags sur les ressources et les identités.

Tags ABAC
5.2

Top 10 bonnes pratiques IAM

MFA, rotations, moindre privilÚge, séparation des comptes, audits réguliers.

Best Practices Security
1. Introduction : IAM, le Gardien du Temple
Le SystÚme Nerveux de la Sécurité AWS

IAM est un service Global (rĂ©pliquĂ© mondialement, pas spĂ©cifique Ă  une rĂ©gion). Il rĂ©pond Ă  deux questions fondamentales pour chaque requĂȘte API :

1. Authentication (AuthN)

"Qui es-tu ?"
Vérification de l'identité via Login/Password, Access Keys, ou Token MFA.
Résultat : "Tu es l'utilisateur Bob".

2. Authorization (AuthZ)

"As-tu le droit de faire ça ?"
Vérification des permissions (Policies) attachées à l'identité.
Résultat : "Bob a le droit de lire S3, mais pas de supprimer".

Le Principe "Deny by Default"

Sur AWS, tout ce qui n'est pas explicitement autorisé est INTERDIT.

  • Vous crĂ©ez un nouvel utilisateur ? Il ne peut rien faire.
  • Vous crĂ©ez un nouveau rĂŽle ? Il ne peut rien faire.
  • Il faut attacher une Policy pour "ouvrir" des droits.
Le Jargon IAM (Indispensable)
TermeDéfinitionExemple
PrincipalL'entitĂ© qui fait l'action. Peut ĂȘtre un Humain (User) ou une Machine (Service, Role).User Alice, Service lambda.amazonaws.com.
IAM UserIdentité permanente avec des credentials long terme (Password / Access Keys).Déprécié pour les humains (Préférez SSO). Ok pour CI/CD (parfois).
IAM RoleIdentité temporaire que l'on "endosse" (Assume). Fournit des clés temporaires (STS).Une Lambda qui écrit dans DynamoDB. Un Admin qui se logue via SSO.
IAM GroupCollection d'utilisateurs. Un groupe ne peut PAS contenir d'autres groupes.Groupe Developers, Groupe Admins.
PolicyDocument JSON définissant les droits.AdministratorAccess, S3ReadOnly.
Root User : L'email utilisé pour créer le compte AWS. Il a tous les droits, impossibles à restreindre.
RÚgle : Sécurisez-le avec MFA, enfermez le mot de passe dans un coffre-fort, et ne l'utilisez JAMAIS au quotidien.
Anatomie d'une Policy

Une Policy est une liste de "Statements". Voici la structure standard :

                            {
                            "Version": "2012-10-17",
                            "Statement": [
                            {
                            "Sid": "AllowS3Read",
                            "Effect": "Allow",
                            "Action": [
                            "s3:GetObject",
                            "s3:ListBucket"
                            ],
                            "Resource": [
                            "arn:aws:s3:::mon-bucket",
                            "arn:aws:s3:::mon-bucket/*"
                            ],
                            "Condition": {
                            "IpAddress": {
                            "aws:SourceIp": "192.0.2.0/24"
                            }
                            }
                            }
                            ]
                            }
Les 4 ÉlĂ©ments ClĂ©s (PARC)
  • Principal (Qui ?) : Implicite si attachĂ©e Ă  un User/Role. Explicite dans les Bucket Policies.
  • Action (Quoi ?) : Le verbe API (ex: dynamodb:PutItem). Le wildcard * est possible (ex: s3:*).
  • Resource (Sur quoi ?) : L'objet ciblĂ© dĂ©fini par son ARN (Amazon Resource Name).
  • Condition (Quand ?) : Optionnel. Filtres (IP, Heure, MFA, Tags).
L'Algorithme de Décision AWS

Quand une requĂȘte arrive, AWS Ă©value TOUTES les policies applicables (Identity-based, Resource-based, SCP, Boundaries). Voici l'ordre logique :

1. Explicit Deny ?
2. Explicit Allow ?
3. Implicit Deny
  • 1. Explicit Deny : Si N'IMPORTE QUELLE policy dit "Effect": "Deny", c'est fini. Le refus l'emporte toujours. (C'est le "Veto").
  • 2. Explicit Allow : S'il n'y a pas de Deny, AWS cherche au moins un "Effect": "Allow". Si trouvĂ©, accĂšs accordĂ©.
  • 3. Implicit Deny : Si rien n'est dit (ni Allow, ni Deny), c'est refusĂ© par dĂ©faut.
IAM vs The World

IAM est le moteur interne, mais comment gérer vos utilisateurs humains ?

ServicePublic CibleRelation avec IAM
IAM Identity Center
(ex-AWS SSO)
Vos employés (Workforce).Vous connectez votre Active Directory / Okta. L'utilisateur se logue sur un portail web. AWS lui assigne temporairement un RÎle IAM.
Amazon CognitoVos clients (App Mobile/Web).GĂšre l'inscription/login (Facebook, Google, Email). Échange le token login contre un RĂŽle IAM limitĂ© pour accĂ©der Ă  AWS (ex: uploader sa photo sur S3).
AWS OrganizationsVos comptes AWS.Utilise des SCPs (Service Control Policies) pour restreindre ce que les admins IAM peuvent faire dans chaque compte (ex: Interdire de créer des ressources hors d'Europe).
2. Identités IAM : Humains & Machines
IAM Users : Pour qui vraiment ?

Un IAM User est une identité persistante créée dans votre compte AWS.
Tendance 2026 : AWS recommande de NE PLUS créer d'IAM Users pour les humains, mais d'utiliser IAM Identity Center (SSO).

Caractéristiques
  • Console Access : Login + Password + MFA.
  • Programmatic Access : Access Key ID + Secret Access Key.
  • Limite : 5000 users par compte.
Le Risque des Long-Term Credentials

Les Access Keys (AKIA...) n'expirent jamais par défaut.
Si un développeur commite sa clé sur GitHub, votre compte est piraté en 5 minutes (Crypto-mining).
Solution : Préférez les RÎles (Clés temporaires).

IAM Groups : La Gestion à l'échelle

N'attachez JAMAIS de Policy directement à un User ("Inline Policy"). C'est ingérable. Utilisez toujours des Groupes.

Groupe TypePermissions (Exemple)Membres
AdminsAdministratorAccessTech Leads, CTO. (MFA Obligatoire).
DevelopersPowerUserAccess (Tout sauf IAM).Équipe Dev.
Audit / FinanceReadOnlyAccess + Billing.ContrĂŽleurs de gestion, Auditeurs externes.
RÚgle : Un User peut appartenir à plusieurs groupes. Les permissions s'additionnent (Union), sauf si un DENY explicite est présent quelque part.
IAM Roles : L'Identité Temporaire

Un RÎle est un "chapeau" qu'on peut porter temporairement. Il n'a pas de mot de passe ni de clé permanente.

Qui peut assumer un rĂŽle ? (Trust Policy)
  • Services AWS : "Je suis une Lambda, je veux Ă©crire dans S3".
  • Cross-Account : "Je suis un User du compte A, je veux voir le compte B".
  • Web Identity : "Je suis loguĂ© avec Google/Facebook".
  • SAML 2.0 : "Je viens de l'Active Directory d'entreprise".
La Mécanique STS (Security Token Service)
  1. L'entité appelle sts:AssumeRole.
  2. STS vérifie la "Trust Policy".
  3. STS renvoie des clés temporaires (AKIA..., Secret, SessionToken).
  4. Durée de vie : 15 min à 12h (configurable).
Le Compte Root : "Break Glass Only"
Le Root User a TOUS les droits. Il peut fermer le compte, changer les contacts de facturation et contourner toutes les restrictions IAM.
Checklist de sécurisation Root
  • MFA Hardware : Utilisez une clĂ© physique (YubiKey) stockĂ©e dans un coffre.
  • Supprimer les Access Keys : Le root ne doit JAMAIS avoir de clĂ©s API.
  • Pas d'usage quotidien : Ne l'utilisez que pour changer le plan de support ou rĂ©cupĂ©rer un compte cassĂ©.
  • Alarme CloudWatch : Configurez une alerte SMS/Slack si le compte Root se connecte ("RootAccountUsage").
Types de Credentials (Identifiants)
TypeFormatDuréeUsage
Console PasswordLogin + Pwd + MFAPermanent (avec rotation)AccĂšs humain via navigateur.
Access Keys
(Long Term)
AKIA... + SecretPermanent (Danger !)Scripts CLI locaux, vieux serveurs on-premise.
À Ă©viter si possible.
Session Tokens
(Short Term)
ASIA... + Secret + TokenTemporaire (1h par défaut)RÎles IAM, EC2 Instance Profile, Lambda, SSO.
X.509 CertsClé privée / CertificatDate d'expirationRare. Utilisé pour certains appels API SOAP (Legacy) ou IoT.
3. Policies : Syntaxe, Variables & Évaluation
Déchiffrer le JSON

Une Policy est une collection de "Statements". Chaque Statement est une rĂšgle autonome.

                            {
                            "Version": "2012-10-17",
                            "Statement": [
                            {
                            "Sid": "AllowS3HomeDir",
                            "Effect": "Allow",
                            "Action": [
                            "s3:PutObject",
                            "s3:GetObject"
                            ],
                            "Resource": "arn:aws:s3:::mon-bucket/${aws:username}/*"
                            },
                            {
                            "Sid": "DenyProduction",
                            "Effect": "Deny",
                            "Action": "*",
                            "Resource": "*",
                            "Condition": {
                            "StringNotEquals": {
                            "aws:RequestedRegion": "eu-west-3"
                            }
                            }
                            }
                            ]
                            }
Les ÉlĂ©ments ClĂ©s
  • Effect : Allow ou Deny. Le Deny gagne toujours.
  • Action : Le verbe API (ex: s3:List*). Attention Ă  NotAction qui autorise tout SAUF ce qui est listĂ© (dangereux avec Allow).
  • Resource : L'objet ciblĂ© (ARN). Wildcards * autorisĂ©s.
  • Principal : Obligatoire uniquement pour les Resource-based Policies (Bucket Policy, Trust Policy).
OĂč stocker la Policy ?

Il existe trois façons d'attacher des droits. Le choix impacte la maintenabilité.

TypeDescriptionBest Practice
AWS Managed
Générique
Créées par AWS (ex: AdministratorAccess). On ne peut pas les modifier.Utile pour démarrer vite, mais souvent trop permissif (viole le principe de moindre privilÚge).
Customer Managed
Standard
Créées par vous. Autonomes. Réutilisables sur plusieurs RÎles/Users.Recommandé. Supporte le Versioning (jusqu'à 5 versions pour rollback facile).
Inline Policy
Spécifique
IntĂ©grĂ©e directement dans l'objet User/Role. Si on supprime le RĂŽle, la policy disparaĂźt.À utiliser pour les exceptions strictes (ex: Ă©viter qu'un admin ne s'enlĂšve ses propres droits) ou pour contourner la limite de taille des Managed Policies.
Le Flux de Décision : "Ai-je le droit ?"

Quand une requĂȘte arrive, AWS compile TOUTES les policies (SCP, Resource, Identity, Boundary).

L'Algorithme en 4 étapes
  1. 1. DENY Explicite ? Si une seule policy dit "Deny", c'est fini. REFUSÉ.
  2. 2. SCP (Organizations) Allow ? Si une SCP ne donne pas l'autorisation, c'est un Deny implicite.
  3. 3. ALLOW Explicite ? Y a-t-il au moins une policy qui dit "Allow" ? Sinon REFUSÉ (Implicite).
  4. 4. Boundary / Session ? Si une Boundary existe, l'Allow doit ĂȘtre prĂ©sent DANS la Boundary ET dans l'Identity Policy (Intersection).
Astuce Debug : Si vous avez un "Access Denied" incompréhensible, vérifiez s'il n'y a pas une SCP au niveau du compte ou une Permission Boundary sur le rÎle.
Variables & Conditions : L'IAM Dynamique

Au lieu de créer 1000 policies pour 1000 utilisateurs, créez une seule policy générique avec des variables.

Variables Magiques
  • ${aws:username} : Le nom de l'user IAM.
  • ${aws:PrincipalTag/Department} : La valeur du tag "Department" sur le rĂŽle.
"Resource": "arn:aws:s3:::home-bucket/${aws:username}/*"

Cette ligne donne Ă  chaque utilisateur l'accĂšs UNIQUEMENT Ă  son dossier personnel.

Conditions Puissantes
  • Date : DateLessThan (AccĂšs temporaire).
  • IP : IpAddress (Restriction VPN).
  • MFA : Bool: { "aws:MultiFactorAuthPresent": "true" } (Force le MFA pour les actions critiques).
Permissions Boundaries : La "Laisse" pour Admin

Comment dĂ©lĂ©guer la crĂ©ation de RĂŽles Ă  un dĂ©veloppeur sans qu'il ne se crĂ©e un rĂŽle "Admin" pour lui-mĂȘme ?

Sans Boundary

Alice (Dev) a le droit CreateRole.
Elle crée un RÎle "SuperAdmin" avec AdministratorAccess.
Elle assume ce rĂŽle.
Résultat : Alice est devenue Admin du compte (Privilege Escalation).

Avec Boundary

On oblige Alice à attacher la Boundary "DevBoundary" à tous les rÎles qu'elle crée.
Cette Boundary interdit l'accĂšs Admin.
MĂȘme si Alice attache "AdministratorAccess", l'intersection avec la Boundary bloquera les droits.

Formule : Droits Effectifs = (Identity Policy) ∩ (Permissions Boundary).

4. Authentification : Clés, MFA & HygiÚne
Long-Term vs Short-Term Credentials

La fuite de clés d'accÚs est la cause n°1 des piratages cloud. Comprenez la différence pour réduire le risque.

Access Keys (AKIA...)
  • Quoi : ClĂ©s statiques liĂ©es Ă  un IAM User.
  • DurĂ©e : Infinie (jusqu'Ă  rotation manuelle).
  • Risque : Critique. Si commitĂ© sur GitHub, c'est fini.
  • Usage : À bannir pour les humains. OK pour vieux serveurs hors AWS.
STS Tokens (ASIA...)
  • Quoi : ClĂ©s dynamiques gĂ©nĂ©rĂ©es par sts:AssumeRole.
  • DurĂ©e : 15 min Ă  12h (Max).
  • SĂ©curitĂ© : Expire automatiquement. NĂ©cessite un SessionToken.
  • Usage : RĂŽles EC2, Lambda, SSO, MFA.
MFA : Ne demandez pas, obligez !

Activer le MFA dans la console ne suffit pas. Un utilisateur peut utiliser la CLI sans MFA si vous ne l'interdisez pas explicitement.

Policy : "Force MFA"
{ "Effect": "Deny", "Action": "*", "Resource": "*", "Condition": { "BoolIfExists": { "aws:MultiFactorAuthPresent": "false" } } }

Cette policy bloque TOUT si le MFA n'est pas présent lors de l'auth.

Types de MFA supportés
  • FIDO2 / WebAuthn (Best) : YubiKey, TouchID. RĂ©sistant au phishing.
  • Virtual MFA (Standard) : Google Authenticator, Authy. Gratuit.
  • Hardware TOTP : Token physique Gemalto (Pour les environnements haute sĂ©curitĂ©).
Cycle de vie des clés (HygiÚne)

Une clé de plus de 90 jours est une faille de sécurité.

ÉtapeAction Ops
1. CréationGénérer la clé 2 (Key2). L'application a maintenant Key1 (Active) et Key2 (Inactive).
2. PropagationDéployer Key2 dans l'application/script.
3. DésactivationPasser Key1 en statut Inactive (ne pas supprimer tout de suite !).
4. ValidationAttendre quelques jours pour voir si quelque chose casse.
5. SuppressionSupprimer définitivement Key1.
Automatisation : Utilisez AWS Secrets Manager pour faire tourner les credentials de base de données (RDS) automatiquement sans intervention humaine.
S'authentifier en CLI comme un Pro

N'utilisez pas aws configure avec des Access Keys statiques. Utilisez SSO.

La méthode moderne (SSO)
                            # 1. Configurer le profil
                            aws configure sso
                            > SSO start URL: https://my-org.awsapps.com/start
                            > SSO Region: us-east-1
                            > Account: Production
                            > Role: Developer

                            # 2. Se loguer (Ouvre le navigateur)
                            aws sso login --profile prod-dev

                            # 3. Utiliser (Valide 8h)
                            aws s3 ls --profile prod-dev
Avantages
  • Pas de clĂ©s stockĂ©es en clair dans ~/.aws/credentials.
  • MFA gĂ©rĂ© par votre fournisseur d'identitĂ© (Okta, Azure AD).
  • Passage facile d'un compte Ă  l'autre.
IAM Credential Report : L'Audit

Comment savoir qui n'a pas activé son MFA ou qui a une clé vieille de 3 ans ?

  • Credential Report : Un fichier CSV tĂ©lĂ©chargeable qui liste tous les users, status du MFA, date de derniĂšre rotation de mot de passe, et date de derniĂšre utilisation des clĂ©s.
  • Access Analyzer : DĂ©tecte les ressources (S3, KMS, Roles) qui sont accessibles publiquement ou depuis un autre compte AWS.
La commande "Kill Switch"

Si une clé fuite, désactivez-la immédiatement :
aws iam update-access-key --access-key-id AKIA... --status Inactive --user-name Bob

5. RÎles IAM : AssumeRole, Trust & Fédération
Le Concept : "Qui a le droit de porter le chapeau ?"

Un RÎle IAM est composé de deux documents JSON distincts. On oublie souvent le second.

  • Permissions Policy : "Que peut faire ce rĂŽle ?" (ex: Lire S3).
  • Trust Policy : "Qui peut assumer ce rĂŽle ?" (Le Principal).
Analogie : Le RĂŽle est un badge d'accĂšs visiteur.
- Permission : "Ouvre la porte du Labo".
- Trust : "Seulement les employés du service R&D peuvent prendre ce badge".
Exemple de Trust Policy (JSON)
                            {
                            "Version": "2012-10-17",
                            "Statement": [
                            {
                            "Effect": "Allow",
                            "Principal": {
                            "Service": "ec2.amazonaws.com"  // Seul EC2 peut prendre ce rĂŽle
                            },
                            "Action": "sts:AssumeRole"
                            }
                            ]
                            }
Service Roles : Donner des droits aux machines

Ne mettez jamais de clés d'accÚs (AKIA) en dur dans le code de vos applications. Utilisez des rÎles.

ServiceMécanismeSécurité (iam:PassRole)
EC2Instance Profile. Le service de mĂ©tadonnĂ©es (IMDS) dĂ©livre les clĂ©s temporaires Ă  l'OS.EmpĂȘcher un dĂ©veloppeur de lancer une EC2 avec un rĂŽle "Admin" (Privilege Escalation).
LambdaExecution Role. Les clés sont injectées dans les variables d'environnement (cachées).Donner le minimum requis (ex: juste écrire dans CloudWatch et lire DynamoDB).
ECS / EKSTask Role. Chaque conteneur peut avoir son propre rîle (Isolation fine).Évite de donner les droits du Node (EC2) à tous les Pods.
AccĂšs Cross-Account : Le Pattern "Jumphole"

Comment permettre à un développeur du compte A (Dev) d'accéder au S3 du compte B (Prod) ?

Compte B (Cible/Prod)
  1. Créer un RÎle CrossAccountS3Access.
  2. Trust Policy : Autoriser le Compte A (Principal: AWS: "123456789012").
  3. External ID : Ajouter une condition sts:ExternalId pour Ă©viter le problĂšme du "Confused Deputy" (si vous ĂȘtes un SaaS).
Compte A (Source/Dev)
  1. L'utilisateur Dev doit avoir le droit sts:AssumeRole sur l'ARN du rĂŽle du compte B.
  2. Il lance la commande CLI pour changer de contexte.
Fédération OIDC : GitHub Actions sans Clés !

En 2025, on ne stocke plus de AWS_ACCESS_KEY_ID dans les secrets GitHub. On utilise OIDC.

Le Flux Sécurisé
  1. GitHub contacte AWS : "Je suis le repo mon-org/mon-repo, donne-moi un accĂšs".
  2. AWS vérifie la signature JWT de GitHub.
  3. AWS vérifie que le repo matche la Trust Policy.
  4. AWS renvoie des clés temporaires pour le déploiement.
La Trust Policy OIDC
                            {
                            "Effect": "Allow",
                            "Principal": {
                            "Federated": "arn:aws:iam::123:oidc-provider/token.actions.githubusercontent.com"
                            },
                            "Action": "sts:AssumeRoleWithWebIdentity",
                            "Condition": {
                            "StringLike": {
                            "token.actions.githubusercontent.com:sub": "repo:mon-org/mon-repo:*"
                            }
                            }
                            }
Comment devenir quelqu'un d'autre (CLI)

Commande indispensable pour tester des droits ou accéder à la Prod.

# 1. Demander les clés aws sts assume-role \ --role-arn arn:aws:iam::987654321098:role/ProductionAdmin \ --role-session-name MyDebugSession # 2. La réponse (Credentials temporaires) { "Credentials": { "AccessKeyId": "ASIA...", <-- Notez le 'ASIA' (Temporaire) "SecretAccessKey": "wJalrX...", "SessionToken": "AQoDYX...", <-- Indispensable ! "Expiration": "2023-10-27T15:00:00Z" } } # 3. Vérifier qui je suis aws sts get-caller-identity
Astuce : Configurez votre fichier ~/.aws/config avec des profils source_profile et role_arn pour que la CLI fasse l'assume-role automatiquement.
6. SCP : La Gouvernance Multi-Compte (Organizations)
SCP : La Constitution de votre Cloud

Les Service Control Policies (SCP) ne sont pas de l'IAM classique. Elles se configurent dans le Management Account (le compte payeur) et s'appliquent aux comptes membres.

Structure AWS Organizations
  • Root : La racine de l'organisation. Une SCP ici affecte 100% des comptes.
  • OU (Organizational Unit) : Dossiers logiques (ex: "Prod", "Sandbox"). Permet de cibler les rĂšgles.
  • Account : Le compte AWS cible.
Le Pouvoir Absolu

Une SCP limite ce que le Root User d'un compte membre peut faire.
Si une SCP interdit S3 sur le compte "Prod", mĂȘme l'utilisateur Root du compte "Prod" ne pourra pas utiliser S3.
Exception : Les SCP n'affectent PAS le Management Account lui-mĂȘme.

L'Intersection des Droits

SCP n'accorde JAMAIS de permissions. C'est un filtre (Guardrail).
Pour qu'une action soit autorisĂ©e, elle doit ĂȘtre permise par la SCP ET par IAM.

SCP (Organisation)IAM (Compte Local)Résultat Final
Allow S3Allow S3 ACCORDÉ
Allow S3Deny S3 (ou pas d'Allow) REFUSÉ (IAM bloque)
Deny S3Allow FullAdmin REFUSÉ (SCP bloque)
Analogie : La SCP est le disjoncteur général de la maison. IAM est l'interrupteur de la chambre. Si le disjoncteur est coupé, l'interrupteur ne sert à rien.
Deny List vs Allow List

Il existe deux façons de configurer vos SCPs.

1. Deny List (Standard)
  • Config : On laisse la policy par dĂ©faut FullAWSAccess (Allow *).
  • Action : On ajoute des SCPs spĂ©cifiques pour INTERDIRE les actions dangereuses.
  • Avantage : Scalable. Les nouveaux services AWS fonctionnent automatiquement.
  • RecommandĂ© pour 99% des entreprises.
2. Allow List (Zero Trust)
  • Config : On SUPPRIME FullAWSAccess.
  • Action : On ajoute des SCPs pour AUTORISER explicitement chaque service (EC2, S3...).
  • InconvĂ©nient : Maintenance infernale. Si AWS sort un nouveau service, personne ne peut l'utiliser avant mise Ă  jour.
Les "Must-Have" en Production
1. Region Lock (Conformité RGPD)

Interdire de créer des ressources hors de l'Europe (sauf services globaux).

                    {
                    "Version": "2012-10-17",
                    "Statement": [
                    {
                    "Sid": "DenyOutsideEU",
                    "Effect": "Deny",
                    "NotAction": [
                    "iam:*", "route53:*", "cloudfront:*", "waf:*" // Services globaux exclus
                    ],
                    "Resource": "*",
                    "Condition": {
                    "StringNotEquals": {
                    "aws:RequestedRegion": [ "eu-west-1", "eu-west-3" ]
                    }
                    }
                    }
                    ]
                    }
2. Protection de l'Audit (Anti-Hacker)

Interdire la dĂ©sactivation de CloudTrail ou Config, mĂȘme pour un Admin.

"Action": [ "cloudtrail:StopLogging", "cloudtrail:DeleteTrail", "config:StopConfigurationRecorder" ], "Effect": "Deny", "Resource": "*"
Debugger un "Explicit Deny"

Quand une SCP bloque, le message d'erreur est souvent vague : "User is not authorized to perform: ec2:RunInstances with an explicit deny".

Est-ce IAM ou SCP ?
  • VĂ©rifiez les policies IAM locales (Managed & Inline).
  • VĂ©rifiez les SCPs attachĂ©es au Compte, Ă  l'OU parente, et Ă  la Root. (L'hĂ©ritage est cumulatif sur les Deny).
L'outil magique : DecodeMessage

Les erreurs CLI contiennent souvent un message encodé.

aws sts decode-authorization-message \ --encoded-message "votre_message_base64_ici"

Le résultat JSON vous dira exactement quelle policy (SCP ou IAM) a causé le blocage.

7. Resource-Based Policies : S3, KMS & Cross-Account
Qui porte la permission ?

Jusqu'à présent, nous avons vu les permissions attachées à l'utilisateur (Identity-based). Certains services permettent d'attacher la permission directement sur l'objet (Resource-based).

Comparatif
Identity-Based PolicyResource-Based Policy (RBP)
Attachée à un User/Role.Attachée à une Ressource (S3, KMS, SQS).
Dit : "Je peux accéder à X".Dit : "Le Principal Y peut m'accéder".
Champ Principal : Interdit.Champ Principal : Obligatoire.
Services supportant les RBP
  • S3 (Bucket Policy)
  • KMS (Key Policy)
  • SNS (Topic Policy) & SQS (Queue Policy)
  • Lambda (Function Policy - pour API Gateway)
  • Secrets Manager & ECR
  • Note : EC2 ne supporte PAS les RBP.
Le Casse-tĂȘte : Comment AWS dĂ©cide ?

La logique change radicalement selon que l'accĂšs se fait dans le mĂȘme compte ou entre comptes diffĂ©rents.

1. MĂȘme Compte (Union)

Alice et le Bucket sont dans le Compte A.

  • Si IAM Policy dit ALLOW...
  • OU si Bucket Policy dit ALLOW...
  • ... Alors l'accĂšs est ACCORDÉ.

Il suffit d'une seule permission (sauf s'il y a un Deny explicite).

2. Cross-Account (Intersection)

Alice (Compte A) accĂšde au Bucket (Compte B).

  • L'IAM du Compte A doit dire ALLOW (droit de sortir).
  • ET la Bucket Policy du Compte B doit dire ALLOW (droit d'entrer).
  • ... Sinon l'accĂšs est REFUSÉ.

Les deux cĂŽtĂ©s doivent ĂȘtre d'accord.

Exemples S3 (JSON)
1. AccĂšs Cross-Account (Le classique)

Autoriser le compte de "Prod" (111...) Ă  lire le bucket de "Backup" (222...).

                    {
                    "Version": "2012-10-17",
                    "Statement": [
                    {
                    "Sid": "AllowProdAccount",
                    "Effect": "Allow",
                    "Principal": {
                    "AWS": "arn:aws:iam::111111111111:root" 
                    },
                    "Action": "s3:GetObject",
                    "Resource": "arn:aws:s3:::mon-bucket-backup/*"
                    }
                    ]
                    }

Note : Mettre ":root" délÚgue la gestion à l'admin IAM du compte 111. Il devra ensuite créer une IAM Policy pour ses users.

2. Force HTTPS (Sécurité)

Refuser toute connexion non chiffrée.

"Effect": "Deny", "Principal": "*", "Action": "s3:*", "Resource": "arn:aws:s3:::mon-bucket/*", "Condition": { "Bool": { "aws:SecureTransport": "false" } }
KMS : L'Exception qui confirme la rĂšgle
Danger : Contrairement Ă  S3, pour KMS, les permissions IAM NE FONCTIONNENT PAS si la Key Policy ne les autorise pas explicitement.
Le "Default Statement" vital

Quand vous crĂ©ez une clĂ© via la console, AWS ajoute ceci. Si vous l'enlevez, plus aucun utilisateur IAM du compte (mĂȘme Admin) ne peut gĂ©rer la clĂ©.

                            {
                            "Sid": "Enable IAM User Permissions",
                            "Effect": "Allow",
                            "Principal": {
                            "AWS": "arn:aws:iam::111122223333:root"
                            },
                            "Action": "kms:*",
                            "Resource": "*"
                            }

Pourquoi ? Cela permet de déléguer la gestion de la clé à IAM. Sans cette ligne, la Key Policy devient la seule source de vérité, et si vous vous en excluez, la clé est perdue (appel au support requis).

The Confused Deputy Problem

Un problÚme de sécurité critique quand un service AWS agit en votre nom.

Le Scénario d'Attaque
  • Vous autorisez le service "CloudTrail" Ă  Ă©crire dans votre Bucket S3.
  • Le Hacker configure SON CloudTrail pour Ă©crire dans VOTRE Bucket (puisque votre bucket autorise "le service CloudTrail" en gĂ©nĂ©ral).
  • RĂ©sultat : Vous payez pour le stockage des logs du hacker, ou il peut Ă©craser vos logs.
La Protection : aws:SourceArn

Dans la Bucket Policy, ajoutez toujours une condition pour vérifier que la ressource source vous appartient.

"Condition": { "StringEquals": { "aws:SourceAccount": "123456789012" }, "ArnLike": { "aws:SourceArn": "arn:aws:cloudtrail:us-east-1:123456789012:trail/*" } }
8. ABAC : Autorisation par Tags & Scalabilité
Pourquoi changer de modĂšle ?

Le modĂšle classique (RBAC - Role Based) montre ses limites quand l'entreprise grandit.

RBAC (Classique)

"Le rĂŽle DevTeamA a accĂšs aux ressources bucket-a et instance-a."

  • ProblĂšme : À chaque nouveau projet, il faut modifier la Policy IAM pour ajouter le nouvel ARN.
  • Limite : Explosion du nombre de rĂŽles (1 par Ă©quipe/projet).
ABAC (Moderne)

"L'utilisateur peut accĂ©der Ă  TOUTE ressource qui possĂšde le mĂȘme Tag 'Project' que lui."

  • Avantage : ZĂ©ro modif de Policy quand on crĂ©e un projet.
  • Scale : 1 seule Policy gĂ©nĂ©rique pour 1000 Ă©quipes.
Les 3 Variables Clés

Pour écrire du ABAC, il faut comprendre ces trois concepts :

VariableSignificationUsage
aws:PrincipalTag/ByKeyLe tag attaché à l'identité (User ou RÎle) qui fait la demande."Qui suis-je ?" (ex: Je suis du Département=Finance).
aws:ResourceTag/ByKeyLe tag attaché à la ressource existante ciblée."Qu'est-ce que je touche ?" (ex: Une EC2 taggée Département=HR).
aws:RequestTag/ByKeyLe tag que je demande d'appliquer lors de la création."Quel tag j'essaie de coller ?" (ex: Je crée une EC2 et je veux mettre Département=Finance).
La Policy "Magique"

Voici une policy qui permet Ă  un dĂ©veloppeur de dĂ©marrer/arrĂȘter/modifier n'importe quelle ressource... SI et seulement SI elle lui appartient.

                    {
                    "Version": "2012-10-17",
                    "Statement": [
                    {
                    "Sid": "AccessSameProject",
                    "Effect": "Allow",
                    "Action": [ "ec2:StartInstances", "ec2:StopInstances" ],
                    "Resource": "*",
                    "Condition": {
                    "StringEquals": {
                    "aws:ResourceTag/Project": "${aws:PrincipalTag/Project}",
                    "aws:ResourceTag/CostCenter": "${aws:PrincipalTag/CostCenter}"
                    }
                    }
                    }
                    ]
                    }
Explication : Si mon RĂŽle a le tag Project=Blue, cette policy m'autorise automatiquement Ă  toucher toutes les EC2 Project=Blue. Si je change de rĂŽle pour Project=Red, mes accĂšs changent dynamiquement.
La Faille de Sécurité (et sa solution)

Le Risque : Si un utilisateur peut créer une ressource sans tag (ou avec le tag d'une autre équipe), il peut ensuite "s'approprier" des ressources ou contourner le systÚme.

La Solution : Enforce Tag on Create

On oblige l'utilisateur à mettre SES propres tags lors de la création. Sinon, création refusée.

                            {
                            "Sid": "DenyCreateWithoutMyTags",
                            "Effect": "Deny",
                            "Action": "ec2:RunInstances",
                            "Resource": "arn:aws:ec2:*:*:instance/*",
                            "Condition": {
                            "StringNotEquals": {
                            "aws:RequestTag/Project": "${aws:PrincipalTag/Project}"
                            }
                            }
                            }

"Je t'interdis de crĂ©er une instance SI le tag 'Project' de la requĂȘte n'est pas Ă©gal Ă  TON tag 'Project'."

SSO & Session Tags : L'Industrialisation

Comment gérer les tags des utilisateurs s'ils viennent de l'Active Directory (AD) ou d'Okta ?

  • Principe : Votre IdP (Identity Provider) envoie les attributs (Department, CostCenter) lors de l'authentification SAML/OIDC.
  • TransitivitĂ© : AWS STS transforme ces attributs en Session Tags.
  • RĂ©sultat : L'utilisateur arrive dans AWS avec ses tags dĂ©jĂ  collĂ©s sur son front.
Trust Policy requise pour accepter les tags
"Action": [ "sts:AssumeRole", "sts:TagSession" ]

L'action sts:TagSession est obligatoire pour laisser passer les tags.

9. Monitoring, Audit & Forensics
CloudTrail : La "BoĂźte Noire" d'AWS

Chaque action IAM (création d'user, attachement de policy, login) est un événement API enregistré dans CloudTrail.

Anatomie d'un Log IAM
                            {
                            "eventName": "CreateUser",
                            "eventTime": "2023-10-27T10:00:00Z",
                            "userIdentity": {
                            "type": "IAMUser",
                            "userName": "AdminBob",
                            "arn": "arn:aws:iam::123456789012:user/AdminBob"
                            },
                            "sourceIPAddress": "203.0.113.55",
                            "requestParameters": {
                            "userName": "HackerJoe"
                            },
                            "responseElements": {
                            "user": { "arn": "arn:aws:iam::...:user/HackerJoe" }
                            }
                            }
Questions auxquelles CloudTrail répond :
  • QUI : userIdentity (Qui a fait l'action ?).
  • QUOI : eventName (Quelle action ?).
  • QUAND : eventTime.
  • D'OÙ : sourceIPAddress (IP de l'attaquant ?).
Astuce : Utilisez Athena pour requĂȘter vos logs CloudTrail stockĂ©s dans S3 avec du SQL standard.
IAM Access Analyzer : La Preuve Mathématique

Ce n'est pas un simple scanner. Il utilise le "Raisonnement Automatisé" (méthodes formelles) pour prouver mathématiquement qui peut accéder à vos ressources.

Détection d'Exposition

Il scanne en continu vos Policies (Resource-based) pour détecter :

  • Les Buckets S3 publics.
  • Les RĂŽles IAM assumables par n'importe qui (Principal: *).
  • Les ClĂ©s KMS partagĂ©es avec des comptes externes inconnus.
Zone de Confiance (Zone of Trust)

Vous définissez votre Organisation AWS comme zone de confiance.
Tout accÚs venant de l'extérieur de cette zone génÚre une Finding (Alerte).

Atteindre le "Moindre PrivilĂšge"

Comment savoir si un utilisateur a vraiment besoin des droits "Admin" qu'il vous réclame ?

OutilFonctionAction Ops
Last Accessed InfoAffiche la date de derniÚre utilisation de chaque service pour un User/Role.Si un User a S3:FullAccess mais n'a pas touché à S3 depuis 90 jours -> Révoquer le droit.
Credential ReportCSV listant tous les users, status MFA, ùge du mot de passe, ùge des Access Keys.Repérer les Access Keys > 180 jours et forcer la rotation.
Policy Sentry
(Open Source)
Outil communautaire pour gĂ©nĂ©rer des policies restrictives basĂ©es sur les Access Levels.Éviter d'Ă©crire des JSON Ă  la main.
IAM Policy Simulator : Debugger l'invisible

"Pourquoi j'ai une erreur 403 Access Denied alors que j'ai mis AdministratorAccess ?"
C'est la question la plus fréquente. Le simulateur permet de tester sans risque.

Ce qu'il teste :
  • Identity-based Policies.
  • Resource-based Policies.
  • Permissions Boundaries.
  • SCP (Organizations).
Scénario de Test

Principal : User "Alice"
Action : s3:PutObject
Resource : arn:aws:s3:::prod-bucket/config
Context : IP=1.2.3.4

Résultat : DENIED
Cause : SCP "DenyProdWrite" (Ligne 12).

SecOps : Alertes Temps Réel (EventBridge)

N'attendez pas l'audit trimestriel. Soyez notifié sur Slack/Email 2 secondes aprÚs une action suspecte.

Pattern EventBridge : "Alerte Création Admin"
{ "source": ["aws.iam"], "detail-type": ["AWS API Call via CloudTrail"], "detail": { "eventSource": ["iam.amazonaws.com"], "eventName": [ "CreateUser", "AttachUserPolicy", "CreateLoginProfile" // Console Access ], "requestParameters": { "policyArn": ["arn:aws:iam::aws:policy/AdministratorAccess"] } } }

Architecture : CloudTrail -> EventBridge Rule -> SNS Topic -> Lambda (Slack) ou Email.

10. Best Practices : La Checklist de Sécurité IAM
Verrouiller la Porte d'Entrée

La gestion des identités est la premiÚre ligne de défense.

đŸš« À Bannir (Don't)
  • Utiliser le compte Root pour les tĂąches quotidiennes.
  • CrĂ©er des IAM Users pour les humains (sauf exception).
  • Partager des Access Keys par email ou Slack.
  • Avoir des clĂ©s d'accĂšs vieilles de > 90 jours.
✅ À Faire (Do)
  • Activer le SSO (Identity Center) reliĂ© Ă  votre IdP (Okta/AD).
  • Forcer le MFA pour TOUS les utilisateurs humains (via Policy).
  • Utiliser des RĂŽles pour les applications (EC2, Lambda).
  • Configurer une alerte CloudWatch sur l'usage du Root.
Le Principe du Moindre PrivilĂšge (Least Privilege)

C'est facile à dire, difficile à faire. Voici la méthode pragmatique.

NiveauActionOutil
1. DébutantUtiliser les AWS Managed Policies (ex: ReadOnlyAccess).Console IAM.
2. IntermĂ©diaireÉcrire des Customer Managed Policies. Restreindre les Resource (pas de "Resource": "*").Visual Editor / Terraform.
3. ExpertGénérer la policy basée sur l'activité réelle. AWS analyse les logs CloudTrail et propose une policy stricte.IAM Access Analyzer (Policy Generation).
Conseil : Commencez large en Dev, puis utilisez Access Analyzer pour "tailler" les permissions avant la Prod.
IAM is Code (GitOps)

Ne cliquez jamais dans la console pour changer des droits en Prod. Traitez IAM comme du code applicatif.

Pourquoi ?
  • Audit : Git Log = Qui a changĂ© les droits ?
  • Rollback : git revert annule une erreur de sĂ©cu.
  • Review : Pull Request obligatoire pour Ă©lever des privilĂšges.
Pipeline CI/CD Sécurisé
  1. Développeur commit un fichier Terraform/CloudFormation.
  2. Linter (Checkov / cfn-nag) : Bloque si "Action": "*" ou "Principal": "*" est détecté.
  3. Deploy : Appliqué automatiquement.
Ceinture et Bretelles : SCPs Indispensables

Si vous utilisez AWS Organizations, appliquez ces SCPs sur vos comptes membres pour empĂȘcher le pire.

1. Interdire de quitter la région (Region Lock)
{ "Effect": "Deny", "NotAction": ["cloudfront:*", "iam:*", "route53:*"], "Resource": "*", "Condition": { "StringNotEquals": { "aws:RequestedRegion": ["eu-west-1", "eu-west-3"] } } }
2. EmpĂȘcher le Root User d'agir (Root Lock)
{ "Effect": "Deny", "Action": "*", "Resource": "*", "Condition": { "StringLike": { "aws:PrincipalArn": "arn:aws:iam::*:root" } } }

Cela oblige Ă  utiliser des rĂŽles IAM, mĂȘme si on a le mot de passe root !

Faire le ménage (HygiÚne)

Un environnement IAM sain est un environnement propre.

Nettoyage Mensuel
  • Supprimer les Users inactifs > 90 jours.
  • Supprimer les RĂŽles inactifs (regarder "Last Accessed").
  • Supprimer les ClĂ©s d'accĂšs non utilisĂ©es.
Outils d'automatisation
  • AWS Config : RĂšgle iam-user-unused-credentials-check.
  • Security Hub : Score de conformitĂ© IAM CIS Benchmark.
  • ElectricEye / Prowler : Outils open-source d'audit de sĂ©curitĂ©.