Introduction
Une application doit lire un export privé stocké dans S3. Vous chiffrerez les nouveaux chargements avec une clé gérée par le client, autoriserez le lecteur et testerez l'effet des permissions sur l'objet et sur la clé lors de téléchargements réels.
Terminez d'abord Stockez et récupérez des fichiers dans S3, Chiffrer et déchiffrer un export privé avec KMS et leurs prérequis IAM. Cette VM neuve fournit un export fictif, une session du rôle de lecture et des ressources de référence indépendantes.
Lien avec les certifications
Ce laboratoire propose une pratique des sujets d’examen suivants.
- Cloud Practitioner (CLF-C02) · Tâche 2.2: Chiffrement au repos S3 et autorisations distinctes sur les objets et les clés.
- Solutions Architect – Associate (SAA-C03) · Tâche 1.3: Chiffrement au repos S3 et autorisations distinctes sur les objets et les clés.
- Developer – Associate (DVA-C02) · Tâche 2.2: Chiffrement au repos S3 et autorisations distinctes sur les objets et les clés.
- CloudOps Engineer – Associate (SOA-C03) · Tâche 4.2: Chiffrement au repos S3 et autorisations distinctes sur les objets et les clés.
- Security – Specialty (SCS-C03) · Tâche 5.2: Pratique des fondamentaux : Chiffrement au repos S3 et autorisations distinctes sur les objets et les clés.
- Data Engineer – Associate (DEA-C01) · Tâche 4.3: Pratique des fondamentaux : Chiffrement au repos S3 et autorisations distinctes sur les objets et les clés.
- DevOps Engineer – Professional (DOP-C02) · Tâche 6.2: Pratique des fondamentaux : Chiffrement au repos S3 et autorisations distinctes sur les objets et les clés.
- Solutions Architect – Professional (SAP-C02) · Tâche 2.3: Pratique des fondamentaux : Chiffrement au repos S3 et autorisations distinctes sur les objets et les clés.
Préparer le stockage d'objets chiffrés
Dans cette étape, vous créerez une clé KMS gérée par le client et configurerez un nouveau compartiment pour l'utiliser par défaut. Un compartiment contient des objets ; chaque objet possède une clé telle que exports/private-export.json. Le chiffrement côté serveur avec KMS (SSE-KMS) permet à S3 de chiffrer les objets stockés avec la clé de votre choix. Le chiffrement par défaut s'applique aux nouveaux chargements sans que chaque client doive répéter les options de chiffrement.
Utilisez le fichier fictif fourni private-export.json ; la session du rôle export-reader commence sans accès à l'objet ni à la clé. Conservez le compartiment, l'objet et la clé de référence. Ouvrez AWS View à côté de Terminal pour comparer l'état de la clé et du compartiment, les autorisations du lecteur et les comparaisons d'octets sans divulguer de données.
Commencez dans le répertoire du projet et confirmez l'identité d'opérateur fournie. cd change de répertoire ; la requête sur l'appelant renvoie un ARN d'identité sans exposer les identifiants d'accès.
cd /home/labex/project
aws sts get-caller-identity --query Arn --output text
Vous devez obtenir l'utilisateur labex-sec02-operator. Créez une clé symétrique gérée par le client et un alias lisible. --query sélectionne l'ARN, --output text retire les guillemets JSON et $(...) enregistre le résultat dans une variable du shell.
KEY_ARN=$(aws kms create-key \
--description labex-sec02-owned-export \
--query KeyMetadata.Arn \
--output text)
aws kms create-alias \
--alias-name alias/labex-sec02-private-export \
--target-key-id "$KEY_ARN"
Utilisez un nom de compartiment jetable avec un suffixe horodaté pour éviter les collisions de noms. Le préfixe labex-sec02-owned- distingue votre compartiment de la référence fournie. Cette unité utilise us-east-1 : la création du compartiment n'exige donc pas de contrainte de localisation.
BUCKET="labex-sec02-owned-$(date +%s)"
aws s3api create-bucket \
--bucket "$BUCKET" \
--region us-east-1 \
--query Location \
--output text
Configurez SSE-KMS avec l'ARN exact de la clé. Une clé de compartiment S3, ou S3 Bucket Key, peut réduire les requêtes KMS répétées ; elle reste désactivée ici pour que chaque objet utilise son propre contexte de chiffrement KMS. Écrivez la règle par défaut dans un fichier JSON ordinaire. Le document intégré développe $KEY_ARN ; file:// charge la configuration enregistrée.
cat > bucket-encryption.json <<EOF
{
"Rules": [
{
"ApplyServerSideEncryptionByDefault": {
"SSEAlgorithm": "aws:kms",
"KMSMasterKeyID": "$KEY_ARN"
},
"BucketKeyEnabled": false
}
]
}
EOF
aws s3api put-bucket-encryption --bucket "$BUCKET" \
--server-side-encryption-configuration file://bucket-encryption.json
aws s3api get-bucket-encryption \
--bucket "$BUCKET" \
--query ServerSideEncryptionConfiguration
Vous devez obtenir aws:kms, l'ARN de votre clé et BucketKeyEnabled: false. Conservez KEY_ARN et BUCKET dans ce Terminal pour les commandes suivantes. Dans AWS View, votre clé est activée et le compartiment ne contient encore aucun objet.
Accorder au lecteur les deux permissions requises
Dans cette étape, vous chargerez l'export et permettrez à un rôle de récupérer ses octets d'origine. Le chargement exige kms:GenerateDataKey sur la clé choisie. SSE-KMS utilise une clé de données pour chiffrer les octets de l'objet. KMS protège cette clé de données ; S3 stocke l'objet chiffré et la clé de données chiffrée, puis demande le déchiffrement lorsqu'un lecteur autorisé télécharge l'objet. Le matériau de clé n'a pas besoin d'apparaître dans la sortie de la CLI.

Lire cet objet SSE-KMS exige à la fois l'accès à l'objet et la permission de déchiffrement avec la clé.
Chargez le fichier fourni avec s3api put-object. Le paramètre par défaut du compartiment fournit les réglages de chiffrement ; --body private-export.json lit le fichier local nommé comme octets de l'objet. Utilisez cette API de chargement en une seule partie pour le petit export.
aws s3api put-object \
--bucket "$BUCKET" \
--key exports/private-export.json \
--body private-export.json \
--query '{Encryption:ServerSideEncryption,Key:SSEKMSKeyId,BucketKey:BucketKeyEnabled}'
aws s3api head-object \
--bucket "$BUCKET" \
--key exports/private-export.json \
--query '{Encryption:ServerSideEncryption,Key:SSEKMSKeyId,Bytes:ContentLength}'
Vous devez obtenir aws:kms, l'ARN de votre clé et la taille du fichier d'origine. Les métadonnées seules ne montrent pas si un lecteur peut déchiffrer. Accordez d'abord uniquement l'accès à l'objet. Un ARN d'objet inclut le compartiment et la clé d'objet ; il diffère d'un ARN de compartiment. Le document intégré suivant écrit un fichier de politique et y développe $BUCKET.
cat > read-object.json <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::$BUCKET/exports/private-export.json"
}
]
}
EOF
aws iam put-role-policy \
--role-name labex-sec02-export-reader \
--policy-name ReadExportObject \
--policy-document file://read-object.json
Sélectionnez la session du lecteur préparée avec --profile export-reader. Cette tentative doit échouer avec AccessDenied : le rôle peut lire cet objet, mais ne dispose pas encore d'une autorisation de déchiffrement KMS.
aws \
--profile export-reader s3api get-object \
--bucket "$BUCKET" \
--key exports/private-export.json reader-export.json
Accordez à ce rôle uniquement kms:Decrypt sur la clé exacte. Il n'a pas besoin de gérer la clé ni d'effectuer kms:GenerateDataKey pour télécharger.
cat > decrypt-key.json <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "kms:Decrypt",
"Resource": "$KEY_ARN"
}
]
}
EOF
aws iam put-role-policy \
--role-name labex-sec02-export-reader \
--policy-name DecryptExportKey \
--policy-document file://decrypt-key.json
aws \
--profile export-reader s3api get-object \
--bucket "$BUCKET" \
--key exports/private-export.json reader-export.json \
--query '{Encryption:ServerSideEncryption,Key:SSEKMSKeyId}'
chmod 600 reader-export.json
cmp private-export.json reader-export.json
cmp n'affiche rien et renvoie un succès lorsque les octets correspondent. AWS View doit maintenant afficher le texte chiffré stocké et une requête GetObject du lecteur dont les octets renvoyés correspondent à l'export fourni. Ce sont deux observations distinctes : le stockage chiffré protège les octets au repos, tandis que les permissions limitées gouvernent leur récupération.

Diagnostiquer les échecs de permission et d'état de la clé
Dans cette étape, vous distinguerez une autorisation de déchiffrement manquante d'une clé désactivée. Gardez la permission sur l'objet en place afin de ne modifier qu'une condition à la fois.
Retirez l'autorisation du lecteur sur la clé, puis retentez le même téléchargement d'objet. Le rôle possède toujours s3:GetObject, mais la requête doit échouer avec AccessDenied.
aws iam delete-role-policy \
--role-name labex-sec02-export-reader \
--policy-name DecryptExportKey
aws \
--profile export-reader s3api get-object \
--bucket "$BUCKET" \
--key exports/private-export.json reader-export.json
Inspectez la politique restante sur l'objet. Elle doit toujours nommer uniquement cet objet d'export.
aws iam get-role-policy \
--role-name labex-sec02-export-reader \
--policy-name ReadExportObject \
--query PolicyDocument
Rétablissez l'autorisation sur la clé exacte et désactivez votre clé. Une clé désactivée existe toujours, mais ne peut pas effectuer d'opérations cryptographiques. Ne modifiez pas la clé de référence indépendante.
aws iam put-role-policy \
--role-name labex-sec02-export-reader \
--policy-name DecryptExportKey \
--policy-document file://decrypt-key.json
aws kms disable-key --key-id "$KEY_ARN"
aws \
--profile export-reader s3api get-object \
--bucket "$BUCKET" \
--key exports/private-export.json reader-export.json
Vous devez obtenir un échec lié à la clé désactivée. Disposer d'une permission IAM ne peut pas rendre utilisable une clé désactivée. Confirmez son état natif, puis activez-la et récupérez de nouveau l'objet.
aws kms describe-key --key-id "$KEY_ARN" --query KeyMetadata.KeyState --output text
aws kms enable-key --key-id "$KEY_ARN"
aws \
--profile export-reader s3api get-object \
--bucket "$BUCKET" \
--key exports/private-export.json reader-export.json \
--query ServerSideEncryption \
--output text
chmod 600 reader-export.json
cmp private-export.json reader-export.json
Vous devez obtenir aws:kms et une comparaison réussie. AWS View conserve ensemble les requêtes échouées et la récupération réussie, tandis que le compartiment et la clé de référence restent utilisables. 
Un téléchargement échoué peut laisser un ancien fichier local : sa seule présence ne prouve donc pas la réussite de la requête ; la lecture signée et la comparaison établissent la récupération.
Supprimer vos ressources et planifier la suppression de la clé
Dans cette étape, vous nettoierez les ressources précises de l'export. Terminez d'abord les contrôles fonctionnels précédents. Un compartiment S3 doit être vide avant sa suppression ; une clé KMS gérée par le client utilise un délai d'attente avant suppression au lieu de disparaître immédiatement.
Supprimez uniquement votre export nommé, puis son compartiment. Listez l'inventaire avec succès et confirmez que votre $BUCKET est absent tandis que labex-sec02-reference reste présent.
aws s3api delete-object --bucket "$BUCKET" --key exports/private-export.json
aws s3api delete-bucket --bucket "$BUCKET"
aws s3api list-buckets --query 'Buckets[].Name'
Supprimez les deux permissions ajoutées et votre alias. Le rôle de lecture fourni sert à la session de démonstration ; ne le supprimez pas, ni les ressources de référence indépendantes.
aws iam delete-role-policy \
--role-name labex-sec02-export-reader \
--policy-name ReadExportObject
aws iam delete-role-policy \
--role-name labex-sec02-export-reader \
--policy-name DecryptExportKey
aws iam list-role-policies --role-name labex-sec02-export-reader --query PolicyNames
aws kms delete-alias --alias-name alias/labex-sec02-private-export
Planifiez la suppression de votre clé avec le délai minimal de sept jours, puis lisez son état natif. La planification la rend immédiatement inutilisable, mais ne prouve pas qu'elle a déjà été supprimée.
aws kms schedule-key-deletion \
--key-id "$KEY_ARN" \
--pending-window-in-days 7 \
--query DeletionDate \
--output text
aws kms describe-key --key-id "$KEY_ARN" --query KeyMetadata.KeyState --output text
aws kms describe-key \
--key-id alias/labex-sec02-reference \
--query KeyMetadata.KeyState \
--output text
Vous devez obtenir PendingDeletion pour votre clé et Enabled pour la référence. Supprimez les fichiers locaux nommés ; ces commandes laissent les autres fichiers du projet intacts.
rm -f private-export.json reader-export.json read-object.json decrypt-key.json bucket-encryption.json
Exécutez la vérification de cette étape avant de retirer les profils CLI jetables. Des requêtes natives d'inventaire réussies, et non des erreurs d'authentification, établissent le nettoyage.
rm -f /home/labex/.aws/credentials /home/labex/.aws/config
unset KEY_ARN BUCKET
Résumé
Vous avez configuré SSE-KMS par défaut sur un compartiment, chargé un export chiffré et récupéré les octets d'origine avec un rôle limité à un objet et une clé. Retirer kms:Decrypt et désactiver la clé ont chacun empêché la lecture sans modifier l'autorisation sur l'objet. Vous avez rétabli l'accès, supprimé uniquement vos ressources S3 et planifié la suppression de votre clé KMS en conservant le compartiment et la clé de référence.



