AccessDenied sur un bucket S3 malgré une politique IAM correcte
```text An error occurred (AccessDenied) when calling the PutObject operation: Access Denied ```
Détecter
Un traitement exécuté sur EC2 échoue à lire ou écrire dans un bucket ; la politique IAM du rôle semble autoriser l'action.
Symptômes
Un traitement exécuté sur EC2 échoue à lire ou écrire dans un bucket ; la politique IAM du rôle semble autoriser l'action.
Environnement
Instance EC2 avec rôle IAM, bucket chiffré SSE-KMS, politique de bucket, point de terminaison VPC.
Cause racine
L'accès S3 est l'intersection de plusieurs couches : politique IAM, politique de bucket (Deny explicite, condition aws:SourceVpce), clé KMS (le rôle doit avoir kms:GenerateDataKey/kms:Decrypt et être autorisé dans la key policy), SCP d'organisation, Block Public Access, propriété des objets.
Diagnostic
- Identité réelle :
aws sts get-caller-identity. - Simulation :
aws iam simulate-principal-policy …. - Lire la politique de bucket et la key policy KMS.
- CloudTrail : l'événement indique souvent la politique en cause (
errorMessage).
Solution
Ajouter la permission manquante à la bonne couche — typiquement kms:GenerateDataKey sur la clé pour l'écriture, ou élargir la condition du bucket au bon VPC endpoint — sans ouvrir plus que nécessaire.
Commandes
aws sts get-caller-identity
aws s3api get-bucket-policy --bucket rapports-prod
aws kms get-key-policy --key-id <id> --policy-name default
Prévention
Politiques en IaC testées, IAM Access Analyzer, modèles de rôle incluant les droits KMS associés, documentation des conditions de bucket.