Exercice 08 : Politiques IAM avancées et audit des permissions
🎯 Objectifs
À la fin de cet exercice, vous serez capable de :
- ✅ Écrire des politiques IAM précises avec conditions et variables
- ✅ Appliquer le principe du moindre privilège pour les rôles de service
- ✅ Simuler et tester des politiques avant de les appliquer
- ✅ Identifier les accès excessifs avec IAM Access Analyzer
Durée estimée : 45 minutes
Difficulté : ⭐⭐⭐⭐☆ (Avancé)
Prérequis : Exercice 01 (IAM basique) complété, VPC et S3 créés
📖 Contexte
La cause numéro un des incidents de sécurité cloud est une mauvaise configuration IAM : permissions trop larges, accès publics non intentionnels, clés d'accès non rotées. Le principe du moindre privilège stipule qu'une entité (utilisateur, service, application) ne doit avoir accès qu'aux ressources dont elle a strictement besoin pour sa fonction.
📋 Énoncé
Créez des politiques IAM précises pour différents cas d'usage, testez-les et auditez votre configuration.
🧭 Déroulement de l'exercice
Tâche 1 : Politique en lecture seule sur un bucket S3 spécifique
Au lieu d'accorder s3:* sur * (toutes les actions sur tous les buckets), créez une politique qui donne accès uniquement à UN bucket en lecture seule.
// politique-s3-readonly.json
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ListerLesBuckets",
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*"
},
{
"Sid": "AccesLectureSeuleSurMonBucket",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:GetObjectVersion",
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": [
"arn:aws:s3:::devops-exercice-<votre-prenom>-2024",
"arn:aws:s3:::devops-exercice-<votre-prenom>-2024/*"
]
}
]
}# Créer la politique
aws iam create-policy \
--policy-name "S3ReadOnly-MonBucket" \
--policy-document file://politique-s3-readonly.json
# Attacher à un utilisateur test
aws iam attach-user-policy \
--user-name utilisateur-test \
--policy-arn "arn:aws:iam::$(aws sts get-caller-identity --query Account --output text):policy/S3ReadOnly-MonBucket"Tâche 2 : Politique avec conditions
Les conditions permettent de restreindre les permissions selon des critères : IP source, MFA activé, tag de ressource, etc.
// politique-s3-conditions.json
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AccesUniqueDepuisVPC",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::devops-exercice-<votre-prenom>-2024/*",
"Condition": {
"StringEquals": {
"aws:SourceVpc": "vpc-xxxxxxxxx"
}
}
},
{
"Sid": "InterditSansMFA",
"Effect": "Deny",
"Action": [
"s3:DeleteObject",
"s3:DeleteBucket"
],
"Resource": "*",
"Condition": {
"BoolIfExists": {
"aws:MultiFactorAuthPresent": "false"
}
}
}
]
}Indice : La condition
DenyavecMultiFactorAuthPresent: falsebloque la suppression pour les utilisateurs qui ne se sont pas authentifiés avec MFA. C'est une défense en profondeur : même si des credentials sont compromis, le pirate ne peut pas supprimer des données sans le MFA.
Tâche 3 : Rôle IAM pour EC2 (Instance Profile)
Au lieu de stocker des clés AWS sur une instance EC2, donnez-lui un rôle IAM. L'application peut alors appeler AWS sans credentials.
# Politique pour l'instance EC2 (accès S3 + logs CloudWatch)
cat > role-ec2-policy.json << 'EOF'
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::devops-exercice-*",
"arn:aws:s3:::devops-exercice-*/*"
]
},
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents",
"logs:DescribeLogStreams"
],
"Resource": "arn:aws:logs:*:*:log-group:/app/*"
}
]
}
EOF
# Trust policy : qui peut assumer ce rôle ?
cat > trust-policy-ec2.json << 'EOF'
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
EOF
# Créer le rôle
aws iam create-role \
--role-name role-ec2-app \
--assume-role-policy-document file://trust-policy-ec2.json
# Attacher la politique au rôle
aws iam put-role-policy \
--role-name role-ec2-app \
--policy-name ec2-app-permissions \
--policy-document file://role-ec2-policy.json
# Créer l'Instance Profile et y associer le rôle
aws iam create-instance-profile --instance-profile-name profil-ec2-app
aws iam add-role-to-instance-profile \
--instance-profile-name profil-ec2-app \
--role-name role-ec2-app
# Associer à une instance EC2 existante
INSTANCE_ID="i-xxxxxxxxxxxxxxxxx"
aws ec2 associate-iam-instance-profile \
--instance-id $INSTANCE_ID \
--iam-instance-profile Name=profil-ec2-appTâche 4 : Simuler et auditer avec IAM Policy Simulator
Simuler une politique :
- Console AWS → IAM → Policy Simulator (
https://policysim.aws.amazon.com/) - Sélectionner un utilisateur ou un rôle
- Sélectionner un service (ex: S3) et des actions (ex:
s3:DeleteObject) - Indiquer une ressource ARN
- Cliquer Exécuter la simulation
IAM Access Analyzer :
# Activer IAM Access Analyzer
aws accessanalyzer create-analyzer \
--analyzer-name mon-analyzer \
--type ACCOUNT
# Lister les findings (accès excessifs détectés)
aws accessanalyzer list-findings \
--analyzer-name mon-analyzer \
--query 'findings[*].[id,resourceType,status,condition]' \
--output table✅ Vérification du résultat
- La politique
S3ReadOnly-MonBucketest créée et attachée à l'utilisateur test - Le rôle
role-ec2-appest associé à une instance EC2 - Sur l'instance EC2 :
aws s3 ls s3://$BUCKET/fonctionne sans configurer de credentials - IAM Policy Simulator confirme que
s3:DeleteObjectest refusé sans MFA
💡 À retenir
Les 5 règles d'or IAM :
- Ne jamais utiliser le compte root pour les tâches quotidiennes
- Principe du moindre privilège : commencer par aucun accès, ajouter au besoin
- Rôles IAM plutôt que clés d'accès pour les services AWS
- MFA obligatoire sur tous les comptes humains
- Auditer régulièrement avec Access Analyzer et le rapport d'informations d'identification
Structure d'une politique IAM :
{
"Effect": "Allow" ou "Deny",
"Action": ["service:Action"], // Quoi
"Resource": ["arn:aws:..."], // Sur quoi
"Condition": { ... } // Quand (optionnel)
}✨ Solution Complète
# Vérifier les permissions effectives d'un rôle
aws iam simulate-principal-policy \
--policy-source-arn "arn:aws:iam::ACCOUNT_ID:role/mon-role" \
--action-names "s3:PutObject" "s3:DeleteObject" \
--resource-arns "arn:aws:s3:::mon-bucket/*"