Chiffrer et déchiffrer un export privé avec KMS

AWSBeginner
Pratiquer maintenant

Introduction

Un export privé doit être chiffré avant son stockage. Vous chiffrerez un petit fichier fictif, permettrez à un lecteur de récupérer ses octets d'origine, diagnostiquerez les échecs de déchiffrement et planifierez le nettoyage de votre clé.

Terminez d'abord Premiers pas avec AWS sur LabEx, Accordez le moindre privilège à un lecteur de rapports et Utilisez des identifiants temporaires avec un rôle IAM. Cette VM neuve fournit son propre fichier, une session du rôle de lecture et une clé de référence.

Lien avec les certifications

Ce laboratoire propose une pratique des sujets d’examen suivants.

Chiffrer l'export privé

Dans cette étape, vous créerez une clé AWS Key Management Service (KMS) et transformerez l'export fourni en texte chiffré. Utilisez le fichier fictif fourni private-export.json au lieu de données personnelles. Le profil export-reader utilise une session temporaire du rôle de lecture préparé, initialement sans permission KMS. Conservez alias/labex-sec01-reference.

Ouvrez AWS View à côté de Terminal pour comparer l'état des clés, les autorisations du lecteur et les résultats des requêtes cryptographiques. Ses empreintes des octets permettent de comparer les résultats sans afficher de données privées.

Une clé symétrique utilise le même matériau de clé protégé pour le chiffrement et le déchiffrement ; KMS conserve ce matériau dans le service. Un alias donne à une clé un nom lisible sans remplacer son ARN unique.

Commencez dans le répertoire de projet fourni. cd change votre répertoire courant ; la requête sur l'appelant confirme l'identité d'opérateur préparée sans afficher d'identifiants d'accès.

cd /home/labex/project
aws sts get-caller-identity --query Arn --output text

Vous devez obtenir l'ARN de l'utilisateur labex-sec01-operator. Créez votre propre clé. --query sélectionne un champ de la réponse, --output text retire les guillemets JSON et $(...) stocke ce résultat dans une variable du shell pour les commandes suivantes.

KEY_ARN=$(aws kms create-key --description labex-sec01-owned-export --query KeyMetadata.Arn --output text)
aws kms create-alias --alias-name alias/labex-sec01-private-export --target-key-id "$KEY_ARN"
aws kms describe-key --key-id "$KEY_ARN" --query 'KeyMetadata.[KeyState,KeySpec]' --output text

Vous devez obtenir Enabled et SYMMETRIC_DEFAULT. N'utilisez pas et ne modifiez pas la clé de référence.

Configuration d'une clé dans la console officielle AWS KMS

Référence de la console officielle : l'alias, le statut Enabled et l'ARN correspondent à l'identité et à l'état de la clé que vous venez d'interroger. Ce sont des valeurs d'exemple AWS ; continuez à utiliser votre propre KEY_ARN dans Terminal.

Source : AWS KMS.

Un contexte de chiffrement est un ensemble d'étiquettes non secrètes liées au texte chiffré. Le déchiffrement doit fournir les mêmes étiquettes. Ici, Purpose=private-export identifie l'utilisation prévue de cet export. Les valeurs du contexte ne doivent pas contenir de mots de passe ni de données personnelles.

KMS Encrypt traite les petits textes en clair ; cet export préparé est bien inférieur à la limite de 4 Kio. fileb:// lit l'entrée sous forme d'octets binaires. La CLI représente le texte chiffré renvoyé en base64 ; base64 --decode le reconvertit en fichier binaire. Le tube envoie la sortie à la commande suivante et > écrit le résultat dans le fichier nommé.

aws kms encrypt --key-id "$KEY_ARN" --plaintext fileb://private-export.json --encryption-context Purpose=private-export --query CiphertextBlob --output text | base64 --decode > private-export.kms

Comparez les empreintes des octets avec sha256sum. Des empreintes différentes montrent que le texte chiffré diffère des données d'origine ; cela seul ne constitue pas une preuve de permission.

sha256sum private-export.json private-export.kms

Ouvrez AWS View. Customer key inventory doit afficher votre clé activée, tandis que Cryptographic requests affiche une requête Encrypt autorisée de l'opérateur dont l'entrée correspond à l'export.

Autoriser un seul rôle de lecture

Dans cette étape, vous permettrez au lecteur de l'application de déchiffrer uniquement avec votre clé d'export. Une permission de rôle IAM précise une action et la ressource à laquelle elle s'applique. kms:Decrypt permet de récupérer les octets ; elle n'autorise ni le chiffrement ni l'administration de la clé.

Frontière de déchiffrement KMS

Le lecteur a besoin du contexte correct, d'une autorisation Decrypt et d'une clé activée pour récupérer l'export.

Essayez d'abord le profil de lecture avant d'ajouter une autorisation. --profile export-reader sélectionne la session temporaire du rôle préparé au lieu de l'opérateur. La commande doit échouer avec une réponse de refus d'accès et ne doit pas renvoyer de texte en clair.

aws kms decrypt --profile export-reader --key-id "$KEY_ARN" --ciphertext-blob fileb://private-export.kms --encryption-context Purpose=private-export --query KeyId --output text

Créez un document de politique. Le document intégré écrit les lignes entre <<EOF et EOF dans read-export.json ; le shell développe $KEY_ARN en ARN exact de la clé. Cette autorisation n'utilise ni action ni ressource avec un caractère générique.

cat > read-export.json <<EOF
{
  "Version": "2012-10-17",
  "Statement": [{"Effect": "Allow", "Action": "kms:Decrypt", "Resource": "$KEY_ARN"}]
}
EOF

Attachez cette politique intégrée au rôle de lecture. Une politique intégrée appartient à ce rôle et peut être supprimée indépendamment pendant le nettoyage. La clé fournie utilise sa politique de clé standard pour le même compte, qui permet aux permissions IAM d'autoriser ce rôle.

aws iam put-role-policy --role-name labex-sec01-export-reader --policy-name ReadPrivateExport --policy-document file://read-export.json

Récupérez maintenant les octets chiffrés avec la session du lecteur. La commande sélectionne le champ de texte en clair en base64, le décode et écrit l'export restauré sans afficher son contenu.

aws kms decrypt --profile export-reader --key-id "$KEY_ARN" --ciphertext-blob fileb://private-export.kms --encryption-context Purpose=private-export --query Plaintext --output text | base64 --decode > restored-export.json

cmp compare les octets réels des fichiers. Avec &&, le message s'affiche uniquement si cette comparaison réussit.

cmp private-export.json restored-export.json && echo "Original export bytes recovered"

Vous devez obtenir Original export bytes recovered. AWS View doit afficher la politique du lecteur limitée à la clé exacte et une requête Decrypt autorisée du rôle de lecture dont les octets récupérés correspondent à l'export. Gardez ce rôle limité à Decrypt sur votre clé.

Exemple AWS View montrant une autorisation du lecteur sur la clé exacte et la récupération réelle des octets

Diagnostiquer trois échecs de déchiffrement

Dans cette étape, vous distinguerez les échecs liés au contexte, aux permissions et à l'état de la clé. Gardez le même texte chiffré tout au long des tests pour que chaque résultat ait une cause claire. Les commandes échouées ci-dessous sélectionnent volontairement uniquement un identifiant de clé, jamais du texte en clair.

Modifiez d'abord uniquement la valeur du contexte. Même un lecteur autorisé ne peut pas déchiffrer le texte chiffré avec un contexte incorrect.

aws kms decrypt --profile export-reader --key-id "$KEY_ARN" --ciphertext-blob fileb://private-export.kms --encryption-context Purpose=wrong-context --query KeyId --output text

Vous devez obtenir InvalidCiphertextException. La clé et l'autorisation du rôle existent toujours, mais le contexte ne correspond pas à celui utilisé pour Encrypt.

Supprimez ensuite l'autorisation du rôle et répétez la requête avec le contexte correct. Supprimer une politique intégrée modifie l'autorisation sans modifier la clé ni le texte chiffré.

aws iam delete-role-policy --role-name labex-sec01-export-reader --policy-name ReadPrivateExport
aws kms decrypt --profile export-reader --key-id "$KEY_ARN" --ciphertext-blob fileb://private-export.kms --encryption-context Purpose=private-export --query KeyId --output text

Vous devez obtenir une réponse de refus d'accès. Rétablissez l'autorisation limitée avant le test suivant.

aws iam put-role-policy --role-name labex-sec01-export-reader --policy-name ReadPrivateExport --policy-document file://read-export.json

Enfin, désactivez la clé. Une clé désactivée reste dans l'inventaire, mais ne peut pas effectuer d'opérations cryptographiques. Utilisez le profil de l'opérateur, qui dispose de la permission, pour isoler l'échec lié à l'état de la clé.

aws kms disable-key --key-id "$KEY_ARN"
aws kms decrypt --key-id "$KEY_ARN" --ciphertext-blob fileb://private-export.kms --encryption-context Purpose=private-export --query KeyId --output text

Vous devez obtenir DisabledException. Activez la clé et répétez la récupération réussie par le lecteur pour confirmer le retour au fonctionnement normal.

aws kms enable-key --key-id "$KEY_ARN"
aws kms decrypt --profile export-reader --key-id "$KEY_ARN" --ciphertext-blob fileb://private-export.kms --encryption-context Purpose=private-export --query Plaintext --output text | base64 --decode > restored-export.json
cmp private-export.json restored-export.json && echo "Reader access restored"

Inspectez la table Cryptographic requests d'AWS View. Comparez l'appelant, le contexte et le résultat des requêtes refusées. Une autorisation de rôle ne peut pas corriger un contexte différent ni une clé désactivée.

Exemple AWS View montrant les requêtes refusées puis le rétablissement de l'accès du lecteur

Retirer votre clé en toute sécurité

Dans cette étape, vous supprimerez l'autorisation du lecteur et l'alias, puis planifierez la suppression de votre seule clé d'export. La suppression d'une clé KMS comporte un délai d'attente : PendingDeletion est l'état immédiat attendu, pas la preuve qu'une clé a déjà disparu. Pendant ce délai, la clé ne peut pas déchiffrer.

Confirmez que l'ARN appartient toujours à votre clé d'export avant de planifier sa suppression.

aws kms describe-key --key-id "$KEY_ARN" --query 'KeyMetadata.[Description,KeyState]' --output text

Vous devez obtenir labex-sec01-owned-export et Enabled. Supprimez uniquement l'autorisation de rôle que vous avez ajoutée et l'alias que vous avez créé.

aws iam delete-role-policy --role-name labex-sec01-export-reader --policy-name ReadPrivateExport
aws kms delete-alias --alias-name alias/labex-sec01-private-export

Planifiez la suppression de la clé avec le délai d'attente minimal de sept jours.

aws kms schedule-key-deletion --key-id "$KEY_ARN" --pending-window-in-days 7 --query DeletionDate --output text

La commande renvoie la date de suppression planifiée. Confirmez l'état réel de la clé par une lecture distincte et conservez la clé de référence indépendante.

aws kms describe-key --key-id "$KEY_ARN" --query KeyMetadata.KeyState --output text
aws kms describe-key --key-id alias/labex-sec01-reference --query KeyMetadata.KeyState --output text

Vous devez obtenir PendingDeletion pour votre clé et Enabled pour la référence. AWS View doit afficher l'absence d'autorisation du lecteur et Reference preserved. Utilisez rm -f pour supprimer uniquement les fichiers locaux nommés de l'export ; cette commande tolère l'absence d'un fichier sans supprimer d'autres fichiers du projet.

rm -f private-export.json private-export.kms restored-export.json read-export.json

Exécutez la vérification de cette étape pendant que le profil de l'opérateur reste disponible. Après sa réussite, supprimez les profils CLI jetables de cette VM et retirez la variable de clé. Cela supprime les identifiants locaux de session ; cela n'annule pas la suppression planifiée de la clé cloud.

rm -f /home/labex/.aws/credentials /home/labex/.aws/config
unset KEY_ARN

Résumé

Vous avez chiffré les octets réels d'un export avec une clé KMS gérée par le client et un contexte non secret, autorisé un rôle de lecture à effectuer Decrypt sur la clé exacte et récupéré les octets d'origine. Un contexte incorrect, une autorisation retirée et une clé désactivée ont provoqué des échecs distincts. Vous avez ensuite retiré votre clé en respectant son délai d'attente avant suppression, tout en conservant la référence indépendante.