Chaque compte AWS qui survit à sa première année converge vers à peu près la même douzaine de politiques IAM : un rôle applicatif limité à un compartiment, un auditeur en lecture seule, un verrouillage de régions, une politique EC2 par étiquettes pour les développeurs, une barrière MFA, et une poignée d’autres. Voici les douze qu’on finit par écrire dans presque chaque environnement, avec du JSON fonctionnel pour celles que les gens ratent le plus souvent. Copiez-les comme points de départ, puis resserrez les ressources vers vos ARN.
Ce qui se passe
Les politiques IAM échouent dans deux directions. Trop lâches, et le compte accumule des Action: "*" qui ne passent aucun audit et transforment n’importe quel identifiant fuité en compromission complète. Trop serrées, et chaque déploiement génère un billet Access Denied jusqu’à ce que quelqu’un « règle ça » avec un joker — pour arriver à trop lâche par un chemin plus long. La sortie, c’est une petite bibliothèque de formes éprouvées : des politiques où les actions, ressources et conditions sont déjà équilibrées, pour que chaque nouveau besoin soit une substitution de variables plutôt qu’un éditeur JSON vide. Les règles d’évaluation d’AWS récompensent ça — le deny explicite gagne toujours, les blocs Condition rendent les accès situationnels, et les ARN de ressources font le vrai travail de délimitation. La référence des politiques dans la documentation IAM couvre la grammaire; les formes ci-dessous couvrent la pratique.
Quoi vérifier en premier
Avant d’écrire quoi que ce soit de neuf, inventoriez l’existant — la plupart des comptes contiennent déjà trois demi-versions de chaque politique ci-dessous :
- Comptez les politiques gérées par le client vs en ligne. Les politiques en ligne échappent à la réutilisation et à la revue; tout ce qui sert deux fois devrait être géré par le client.
- Trouvez les jokers. Toute politique avec
"Action": "*"sur"Resource": "*"hors du rôle admin est la première chose à remplacer. - Repérez les politiques gérées par AWS qui font un travail trop large pour elles.
AmazonS3FullAccesssur un rôle applicatif est le classique. - Regardez ce qui est réellement utilisé. Les données de dernier accès vous disent quels accès sont du poids mort avant de tout redessiner.
Comment vérifier
# Inventorier les politiques gérées par le client et leurs attachements
aws iam list-policies --scope Local \
--query 'Policies[].[PolicyName,AttachmentCount]' --output table
# Extraire la version par défaut courante d'une politique
aws iam get-policy-version \
--policy-arn arn:aws:iam::111122223333:policy/app-s3-scoped \
--version-id v1
# Trouver les politiques en ligne sur un rôle
aws iam list-role-policies --role-name app-role
Chemin console pour la revue des attachements : IAM > Policies > (policy) > Entities attached. Validez le nouveau JSON avec les vérifications intégrées à l’éditeur de la console — elles signalent les actions invalides et les ressources trop larges avant la sauvegarde.
Le runbook
- Rôle applicatif limité à un préfixe de compartiment — la politique la plus écrite d’AWS. Notez la séparation :
ListBucketsur le compartiment, actions d’objets sur le préfixe.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::prod-assets",
"Condition": {"StringLike": {"s3:prefix": ["uploads/*"]}}
},
{
"Effect": "Allow",
"Action": ["s3:GetObject", "s3:PutObject", "s3:DeleteObject"],
"Resource": "arn:aws:s3:::prod-assets/uploads/*"
}
]
}
- Deny de verrouillage de régions — empêche des ressources d’apparaître dans des régions que personne ne surveille. Exemptez les services globaux qui s’authentifient via us-east-1.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"NotAction": ["iam:*", "sts:*", "organizations:*", "route53:*",
"cloudfront:*", "support:*", "budgets:*"],
"Resource": "*",
"Condition": {"StringNotEquals": {"aws:RequestedRegion": ["ca-central-1", "us-east-1"]}}
}
]
}
- Démarrage/arrêt EC2 par étiquettes pour les développeurs — n’opérer que les instances étiquetées pour votre équipe, sans toucher à la production.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["ec2:StartInstances", "ec2:StopInstances", "ec2:RebootInstances"],
"Resource": "arn:aws:ec2:*:111122223333:instance/*",
"Condition": {"StringEquals": {"aws:ResourceTag/team": "platform"}}
},
{
"Effect": "Allow",
"Action": "ec2:DescribeInstances",
"Resource": "*"
}
]
}
- Auditeur en lecture seule — partez de la politique gérée AWS
ReadOnlyAccessou de la plus serréeSecurityAudit, puis ajoutez un deny sur les lectures du plan de données (s3:GetObject,dynamodb:GetItem) si l’auditeur doit voir la configuration mais pas les données des clients. - Deny-sauf-MFA — le deny
BoolIfExistsqui rend le MFA réel plutôt que suggéré; la forme complète et ses pièges sont dans notre guide d’application du MFA. - Identifiants en libre-service — permettre à chaque utilisateur IAM de gérer seulement son propre mot de passe, ses clés d’accès et son appareil MFA avec
arn:aws:iam::*:user/${aws:username}comme ressource. - Politique humaine assume-role-seulement — les humains reçoivent
sts:AssumeRolesur des ARN de rôles nommés et rien d’autre; toutes les vraies permissions vivent sur les rôles. - Lecture finances et facturation —
ce:Get*,ce:Describe*,budgets:View*,cur:Describe*pour les gens qui posent des questions sur la facture, pour qu’ils arrêtent de les poser aux ingénieurs. - Rôle de déploiement CI/CD — limité à un service : le service ECS ou les fonctions Lambda précises, le dépôt ECR précis,
iam:PassRolerestreint à l’ARN du seul rôle de tâche.PassRolesur*dans un pipeline, c’est une escalade de privilèges en attente. - Politique de compartiment TLS-seulement — une politique de ressource avec
"Effect": "Deny"quand"aws:SecureTransport": "false", exigée par la plupart des cadres de conformité. - Usage KMS à clé unique —
kms:Decrypt,kms:GenerateDataKeysur un seul ARN de clé, jumelé à une politique de clé qui accorde à la couche IAM du compte. - Admin bris de glace —
AdministratorAccesssur un rôle dédié avec une politique de confiance exigeant le MFA, dont chaque utilisation alerte quelqu’un via une alarme alimentée par CloudTrail.
Quand ce n’est pas la bonne approche
Écrire les douze à la main est une erreur si l’organisation s’apprête à adopter des garde-fous à l’échelle d’Organizations — le verrouillage de régions et plusieurs deny appartiennent aux SCP, une seule fois, plutôt qu’à chaque compte. Et si les humains s’authentifient encore comme utilisateurs IAM, les politiques 5 à 7 sont des rustines sur un modèle qui mérite d’être remplacé par Identity Center plutôt que perfectionné.
Erreurs fréquentes
- Mettre
s3:ListBucketsurbucket/*ouGetObjectsur l’ARN nu du compartiment — chaque action se lie à une forme d’ARN précise. - Oublier les exemptions
NotActiondans le deny de régions, ce qui barre tout le monde hors d’IAM et de la facturation. - Accorder
iam:PassRolesur*aux rôles de CI — l’escalade de privilèges silencieuse de la plupart des pipelines. - Utiliser des politiques en ligne pour tout ce qui est réutilisé; elles ne peuvent être ni versionnées, ni partagées, ni revues à un seul endroit.
Garder le contrôle
- Gardez les douze comme politiques gérées par le client dans l’infrastructure-en-code, pour que la dérive soit un diff, pas de l’archéologie.
- Nommez les politiques par portée, pas par folklore d’équipe :
app-prod-assets-rw, paspolitique-steve-2. - Passez en revue
AttachmentCountchaque trimestre et supprimez tout ce qui est à zéro. - Laissez les constats d’accès inutilisés guider l’élagage plutôt que l’intuition — les accès que personne n’a exercés en 90 jours méritent rarement de rester.
Douze formes couvrent l’essentiel des besoins d’un compte; tout ce qui dépasse devrait être une exception délibérée avec un responsable et une raison. Si personne dans votre équipe ne possède vraiment l’environnement AWS de bout en bout, c’est la racine de la plupart de ces problèmes — Stack Harbor opère des comptes AWS au quotidien sous Opérations AWS, et vous pouvez réserver une revue AWS.