đ 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.
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 IdentityIdentités IAM : Users, Groups, Roles
Gestion fine des comptes humains, techniques et des rĂŽles pour les services.
Users RolesPolicies JSON : Allow / Deny
Structures JSON qui décrivent les autorisations accordées ou refusées.
Policy JSON Allow/DenyManaged vs Inline Policies
Différence entre policies réutilisables et policies rattachées à une seule identité.
Managed InlineAuthentification : Console & API
AccĂšs via console, clĂ©s dâAPI, profils de rĂŽles, Identity Center / SSO.
Access Keys SSOMFA & Sécurisation du compte root
Protéger le compte root, activer MFA partout, supprimer les clés root.
MFA Root AccountRĂŽles IAM pour services AWS
EC2, Lambda, ECS, Glue : déléguer des autorisations aux services via des rÎles.
Service Role EC2/LambdaAssumeRole & STS
Assumer un rĂŽle temporaire pour les accĂšs cross-account ou temporaires.
STS Temporary CredsService Control Policies (SCP)
Gouvernance globale avec AWS Organizations pour restreindre tous les comptes.
SCP OrganizationsResource-Based Policies
Policies directement sur les ressources (S3, KMS, SNS, SQSâŠ).
S3 Policy KMSTags & ABAC (Attribute-Based Access)
ContrÎler les accÚs sur la base de tags sur les ressources et les identités.
Tags ABACTop 10 bonnes pratiques IAM
MFA, rotations, moindre privilÚge, séparation des comptes, audits réguliers.
Best Practices SecurityLe 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)
| Terme | Définition | Exemple |
|---|---|---|
| Principal | L'entitĂ© qui fait l'action. Peut ĂȘtre un Humain (User) ou une Machine (Service, Role). | User Alice, Service lambda.amazonaws.com. |
| IAM User | Identité 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 Role | Identité 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 Group | Collection d'utilisateurs. Un groupe ne peut PAS contenir d'autres groupes. | Groupe Developers, Groupe Admins. |
| Policy | Document JSON définissant les droits. | AdministratorAccess, S3ReadOnly. |
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 : 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 ?
| Service | Public Cible | Relation 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 Cognito | Vos 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 Organizations | Vos 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). |
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 Type | Permissions (Exemple) | Membres |
|---|---|---|
| Admins | AdministratorAccess | Tech Leads, CTO. (MFA Obligatoire). |
| Developers | PowerUserAccess (Tout sauf IAM). | Ăquipe Dev. |
| Audit / Finance | ReadOnlyAccess + Billing. | ContrĂŽleurs de gestion, Auditeurs externes. |
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)
- L'entité appelle
sts:AssumeRole. - STS vérifie la "Trust Policy".
- STS renvoie des clés temporaires (AKIA..., Secret, SessionToken).
- Durée de vie : 15 min à 12h (configurable).
Le Compte Root : "Break Glass Only"
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)
| Type | Format | Durée | Usage |
|---|---|---|---|
| Console Password | Login + Pwd + MFA | Permanent (avec rotation) | AccĂšs humain via navigateur. |
| Access Keys (Long Term) | AKIA... + Secret | Permanent (Danger !) | Scripts CLI locaux, vieux serveurs on-premise. à éviter si possible. |
| Session Tokens (Short Term) | ASIA... + Secret + Token | Temporaire (1h par défaut) | RÎles IAM, EC2 Instance Profile, Lambda, SSO. |
| X.509 Certs | Clé privée / Certificat | Date d'expiration | Rare. Utilisé pour certains appels API SOAP (Legacy) ou IoT. |
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 :
AllowouDeny. Le Deny gagne toujours. - Action : Le verbe API (ex:
s3:List*). Attention ĂNotActionqui 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é.
| Type | Description | Best 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. DENY Explicite ? Si une seule policy dit "Deny", c'est fini. REFUSĂ.
- 2. SCP (Organizations) Allow ? Si une SCP ne donne pas l'autorisation, c'est un Deny implicite.
- 3. ALLOW Explicite ? Y a-t-il au moins une policy qui dit "Allow" ? Sinon REFUSĂ (Implicite).
- 4. Boundary / Session ? Si une Boundary existe, l'Allow doit ĂȘtre prĂ©sent DANS la Boundary ET dans l'Identity Policy (Intersection).
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.
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).
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"
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é.
| Ătape | Action Ops |
|---|---|
| 1. Création | Générer la clé 2 (Key2). L'application a maintenant Key1 (Active) et Key2 (Inactive). |
| 2. Propagation | Déployer Key2 dans l'application/script. |
| 3. Désactivation | Passer Key1 en statut Inactive (ne pas supprimer tout de suite !). |
| 4. Validation | Attendre quelques jours pour voir si quelque chose casse. |
| 5. Suppression | Supprimer définitivement Key1. |
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-devAvantages
- 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
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).
- 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.
| Service | Mécanisme | Sécurité (iam:PassRole) |
|---|---|---|
| EC2 | Instance 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). |
| Lambda | Execution 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 / EKS | Task 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)
- Créer un RÎle
CrossAccountS3Access. - Trust Policy : Autoriser le Compte A (Principal: AWS: "123456789012").
- External ID : Ajouter une condition
sts:ExternalIdpour Ă©viter le problĂšme du "Confused Deputy" (si vous ĂȘtes un SaaS).
Compte A (Source/Dev)
- L'utilisateur Dev doit avoir le droit
sts:AssumeRolesur l'ARN du rĂŽle du compte B. - 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é
- GitHub contacte AWS : "Je suis le repo
mon-org/mon-repo, donne-moi un accÚs". - AWS vérifie la signature JWT de GitHub.
- AWS vérifie que le repo matche la Trust Policy.
- 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.
~/.aws/config avec des profils source_profile et role_arn pour que la CLI fasse l'assume-role automatiquement.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 S3 | Allow S3 | ACCORDĂ |
| Allow S3 | Deny S3 (ou pas d'Allow) | REFUSĂ (IAM bloque) |
| Deny S3 | Allow FullAdmin | REFUSĂ (SCP bloque) |
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.
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é.
Le résultat JSON vous dira exactement quelle policy (SCP ou IAM) a causé le blocage.
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 Policy | Resource-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.
KMS : L'Exception qui confirme la rĂšgle
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.
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 :
| Variable | Signification | Usage |
|---|---|---|
aws:PrincipalTag/ByKey | Le tag attaché à l'identité (User ou RÎle) qui fait la demande. | "Qui suis-je ?" (ex: Je suis du Département=Finance). |
aws:ResourceTag/ByKey | Le tag attaché à la ressource existante ciblée. | "Qu'est-ce que je touche ?" (ex: Une EC2 taggée Département=HR). |
aws:RequestTag/ByKey | Le 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}"
}
}
}
]
}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
L'action sts:TagSession est obligatoire pour laisser passer les tags.
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 ?).
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 ?
| Outil | Fonction | Action Ops |
|---|---|---|
| Last Accessed Info | Affiche 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 Report | CSV 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"
Architecture : CloudTrail -> EventBridge Rule -> SNS Topic -> Lambda (Slack) ou Email.
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.
| Niveau | Action | Outil |
|---|---|---|
| 1. Débutant | Utiliser 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. Expert | Gé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). |
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 revertannule une erreur de sécu. - Review : Pull Request obligatoire pour élever des privilÚges.
Pipeline CI/CD Sécurisé
- Développeur commit un fichier Terraform/CloudFormation.
- Linter (Checkov / cfn-nag) : Bloque si
"Action": "*"ou"Principal": "*"est détecté. - 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)
2. EmpĂȘcher le Root User d'agir (Root Lock)
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é.
