Accordez le moindre privilège à un lecteur de rapports

AWSBeginner
Pratiquer maintenant

Introduction

Un lecteur de rapports a besoin du rapport d'aujourd'hui, tandis que les autres rapports et les données de paie doivent rester privés. Vous accorderez cette lecture, limiterez son périmètre, testerez la limite des autorisations et révoquerez l'accès avant le nettoyage.

Utilisez vos connaissances sur l'identité de l'appelant et les ARN acquises dans AWS Foundations, ainsi que sur les téléchargements d'objets dans S3. Cette nouvelle VM prépare la CLI et deux identités : default gère l'exercice ; reader représente le traitement. Travaillez dans /home/labex/project et comparez les requêtes avec AWS View en haut.

Lien avec les certifications

Certification Tâche de l’examen Pratique
Cloud Practitioner (CLF-C02) Tâche 2.3 Politiques IAM, portée des actions et ressources, et moindre privilège.
Solutions Architect – Associate (SAA-C03) Tâche 1.1 Politiques IAM, portée des actions et ressources, et moindre privilège.
Developer – Associate (DVA-C02) Tâche 2.1 Politiques IAM, portée des actions et ressources, et moindre privilège.
CloudOps Engineer – Associate (SOA-C03) Tâche 4.1 Politiques IAM, portée des actions et ressources, et moindre privilège.
Security – Specialty (SCS-C03) Tâche 4.2 Pratique des fondamentaux : Politiques IAM, portée des actions et ressources, et moindre privilège.
Data Engineer – Associate (DEA-C01) Tâche 4.2 Pratique des fondamentaux : Politiques IAM, portée des actions et ressources, et moindre privilège.
DevOps Engineer – Professional (DOP-C02) Tâche 6.1 Pratique des fondamentaux : Politiques IAM, portée des actions et ressources, et moindre privilège.
Solutions Architect – Professional (SAP-C02) Tâche 2.3 Pratique des fondamentaux : Politiques IAM, portée des actions et ressources, et moindre privilège.

Vue d’ensemble du lab

Schéma conceptuel : Une politique d’identité IAM permet au lecteur de lire uniquement le rapport du jour dans S3, tout en protégeant les autres rapports et les données de paie.

Donnez au lecteur l'accès aux rapports

Dans cette étape, vous rédigerez et attacherez une politique d'identité permettant de lire les rapports. Une politique d'identité est attachée à un utilisateur, un groupe ou un rôle. Elle décrit les actions autorisées ou refusées ; elle ne contient pas de clés d'accès.

Dans S3, vous avez déjà téléchargé le contenu d’objets. Ici, le traitement de rapports doit effectuer ce téléchargement avec sa propre identité restreinte : l’opérateur modifie les permissions et le lecteur teste le résultat. Les données sont fournies pour vous permettre de vous concentrer sur l’autorisation.

AWS Identity and Access Management (IAM) contrôle quelle identité peut effectuer une action sur une ressource. Le moindre privilège accorde uniquement ce dont un traitement a besoin.

Un profil AWS CLI sélectionne des identifiants et des paramètres ; il n'accorde pas d'autorisations. Ici, default est l'opérateur de l'exercice, tandis que reader sélectionne report-reader. Confirmez d'abord les deux identités. --profile reader sélectionne le traitement pour une commande. get-caller-identity indique l'identité de l'appelant sans afficher d'identifiants d'accès.

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

L'ARN par défaut se termine par user/iam01-operator. Utilisez ce profil d'opérateur pour administrer les politiques ; utilisez le profil du lecteur pour tester le traitement. Cet opérateur de laboratoire est préparé pour l'administration. Une application de rapports en production utiliserait un rôle restreint, que vous pratiquerez plus tard.

aws sts get-caller-identity --profile reader --query Arn --output text

L'ARN du lecteur se termine par user/report-reader. Un ARN, ou Amazon Resource Name, identifie une ressource. Pour un objet S3, il comprend le compartiment et la clé d'objet complète ; un ARN de compartiment seul n'identifie pas un objet à l'intérieur.

Le lecteur ne possède initialement aucune politique. Testez une lecture avant d'accorder quoi que ce soit :

aws s3api get-object --profile reader --bucket labex-iam01-reports --key reports/today.txt before.txt || true

Attendez-vous à AccessDenied, pas à un téléchargement de rapport. || true permet à cette commande volontairement en échec de se terminer sans interrompre une séquence de commandes collée. Lisez l'erreur : une erreur de connexion ne prouve pas un refus IAM.

Une politique JSON utilise trois champs essentiels : Effect vaut Allow ou Deny ; Action nomme une opération de service ; Resource limite l'ARN sur lequel cette opération peut agir. s3:GetObject permet de lire les octets d'un objet. Le * ci-dessous correspond aux clés d'objet du préfixe reports/, y compris aujourd'hui et hier. Il ne correspond pas à private/ ni à un autre compartiment. Version sélectionne le langage de politique, pas la version du rapport.

Le here-document suivant écrit les lignes entre les marqueurs JSON dans report-policy.json. > remplace ce fichier local, et le marqueur entre guillemets empêche le shell de développer son contenu.

cat > report-policy.json <<'JSON'
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::labex-iam01-reports/reports/*"
    }
  ]
}
JSON

Écrire un fichier seul n'autorise pas le lecteur. put-user-policy attache une politique intégrée, une politique stockée directement sur cet utilisateur. --policy-name identifie cette politique ; réutiliser le même nom plus tard la met à jour. file:// indique à la CLI de lire le document depuis votre fichier local.

aws iam put-user-policy \
  --user-name report-reader \
  --policy-name ReportRead \
  --policy-document file://report-policy.json

Une mise à jour réussie n'affiche normalement aucune sortie. Demandez maintenant les rapports avec les identifiants du lecteur. Le dernier argument est le fichier local de destination.

aws s3api get-object \
  --profile reader \
  --bucket labex-iam01-reports \
  --key reports/today.txt today.txt
cat today.txt

Attendez-vous à Daily orders: 145. Les champs de réponse S3 comme ETag identifient l'objet téléchargé ; le fichier lui-même contient les octets du rapport.

aws s3api get-object \
  --profile reader \
  --bucket labex-iam01-reports \
  --key reports/yesterday.txt yesterday.txt

Le téléchargement d'hier réussit aussi, car la politique couvre tout le préfixe des rapports. Le besoin métier se limite au rapport d'aujourd'hui ; vous allez donc maintenant réduire ce périmètre.

Limitez la ressource au rapport d'aujourd'hui

Dans cette étape, vous remplacerez une autorisation de préfixe par un ARN d'objet unique et prouverez que les autres ressources restent inaccessibles. Un refus implicite signifie qu'aucune politique applicable n'autorise la requête. Vous n'avez pas besoin d'un Deny distinct pour chaque objet sans rapport avec la tâche.

Après limitation de la politique, le lecteur peut télécharger le rapport d'aujourd'hui, mais ne peut pas lire les autres objets ni charger des changements.

Remplacez la politique locale. Le seul changement est Resource : la clé exacte reports/today.txt remplace reports/*.

cat > report-policy.json <<'JSON'
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::labex-iam01-reports/reports/today.txt"
    }
  ]
}
JSON

Mettez à jour la même politique intégrée sur le même lecteur. Modifier le fichier ne met pas IAM à jour tant que vous n'envoyez pas cette commande.

aws iam put-user-policy \
  --user-name report-reader \
  --policy-name ReportRead \
  --policy-document file://report-policy.json

Relisez la politique stockée. --query PolicyDocument sélectionne le document dans la réponse ; il ne modifie pas les autorisations.

aws iam get-user-policy \
  --user-name report-reader \
  --policy-name ReportRead \
  --query PolicyDocument

Vérifiez que Resource se termine par reports/today.txt. Testez ensuite à nouveau le lecteur.

aws s3api get-object \
  --profile reader \
  --bucket labex-iam01-reports \
  --key reports/today.txt today.txt

Le rapport requis se télécharge toujours. Chacune des requêtes suivantes devrait échouer avec AccessDenied, car son ARN d'objet ne correspond pas à l'autorisation.

aws s3api get-object --profile reader --bucket labex-iam01-reports --key reports/yesterday.txt yesterday-denied.txt || true
aws s3api get-object --profile reader --bucket labex-iam01-reports --key private/payroll.txt payroll-denied.txt || true
aws s3api get-object --profile reader --bucket labex-iam01-reference --key reference.txt reference-denied.txt || true

Ces objets existent ; l'opérateur peut les lire. Une réponse NoSuchKey indiquerait un objet manquant, tandis que ces erreurs d'autorisation démontrent la limite des ressources accessibles au lecteur. Dans AWS View, aujourd'hui est Readable et les trois autres objets sont Denied. Cette vue émet de véritables requêtes de lecture comme ce même lecteur.

Lecteur limité à un rapport. Exemple : seul aujourd'hui est lisible ; les autres objets existants sont refusés. Le document à gauche est la politique IAM stockée.

Distinguez un refus explicite d'une absence d'autorisation

Dans cette étape, vous protégerez explicitement le préfixe privé et testerez la limite des actions. Un refus explicite est une instruction Deny correspondante. Il prévaut sur un Allow d'une autre politique d'identité applicable. L'ordre des instructions ne permet pas à un Allow de le remplacer.

Ajoutez une deuxième instruction en gardant l'autorisation de lecture exacte. s3:* correspond à toutes les actions S3, mais ce Deny est limité aux objets sous le préfixe private/ de ce compartiment. Il ne refuse pas l'accès au rapport d'aujourd'hui.

cat > report-policy.json <<'JSON'
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::labex-iam01-reports/reports/today.txt"
    },
    {
      "Effect": "Deny",
      "Action": "s3:*",
      "Resource": "arn:aws:s3:::labex-iam01-reports/private/*"
    }
  ]
}
JSON
aws iam put-user-policy \
  --user-name report-reader \
  --policy-name ReportRead \
  --policy-document file://report-policy.json

Le Deny renforce la limite privée. Pour observer sa priorité, attachez temporairement une deuxième autorisation de lecture pour ce compartiment. C'est un test contrôlé ; retirez-la immédiatement après.

cat > temporary-read.json <<'JSON'
{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":"s3:GetObject","Resource":"arn:aws:s3:::labex-iam01-reports/*"}]}
JSON
aws iam put-user-policy \
  --user-name report-reader \
  --policy-name TemporaryRead \
  --policy-document file://temporary-read.json
aws s3api get-object --profile reader --bucket labex-iam01-reports --key private/payroll.txt payroll-denied.txt || true

Attendez-vous à AccessDenied même si TemporaryRead autorise cette clé. Le Deny explicite correspondant l'emporte. Retirez l'autorisation temporaire pour rétablir le moindre privilège.

aws iam delete-user-policy --user-name report-reader --policy-name TemporaryRead

Une autorisation de lecture ne permet pas les écritures. upload.txt est un remplacement non approuvé fourni. put-object tente de stocker ses octets à la clé d'aujourd'hui, et le lecteur doit être refusé.

aws s3api put-object --profile reader --bucket labex-iam01-reports --key reports/today.txt --body upload.txt || true

Attendez-vous à AccessDenied pour PutObject ; ne considérez pas des fichiers manquants ou des erreurs de service comme ce résultat. Relisez aujourd'hui pour confirmer que l'écriture échouée ne l'a pas modifié.

aws s3api get-object \
  --profile reader \
  --bucket labex-iam01-reports \
  --key reports/today.txt today.txt
cat today.txt

Il doit toujours contenir Daily orders: 145. Relisez la politique finale et confirmez le Allow limité et le Deny privé.

aws iam get-user-policy \
  --user-name report-reader \
  --policy-name ReportRead \
  --query PolicyDocument

Révoquez l'accès et nettoyez les ressources de l'exercice

Dans cette étape, vous retirerez la politique du lecteur et supprimerez uniquement le compartiment de rapports de cet exercice. Le nettoyage des politiques IAM et celui des données sont distincts : supprimer une politique ne supprime pas les objets, et supprimer les objets ne révoque pas les identifiants.

Utilisez l'opérateur par défaut pour retirer ReportRead. delete-user-policy supprime une politique intégrée par son nom.

aws iam delete-user-policy --user-name report-reader --policy-name ReportRead
aws iam list-user-policies --user-name report-reader

Attendez-vous à ce que PolicyNames soit vide. Pendant que le rapport existe encore, testez que le lecteur a perdu l'accès.

aws s3api get-object --profile reader --bucket labex-iam01-reports --key reports/today.txt revoked.txt || true

Attendez-vous à AccessDenied. Supprimez maintenant les trois clés exactes de l'exercice comme opérateur. Le compartiment de référence appartient aux ressources de plateforme préparées et doit rester intact.

aws s3api delete-object --bucket labex-iam01-reports --key reports/today.txt
aws s3api delete-object --bucket labex-iam01-reports --key reports/yesterday.txt
aws s3api delete-object --bucket labex-iam01-reports --key private/payroll.txt
aws s3api list-objects-v2 --bucket labex-iam01-reports

Vérifiez que KeyCount vaut 0 et qu'aucun objet n'apparaît dans Contents. Cette réponse authentifiée réussie montre que le compartiment de l'exercice est vide avant sa suppression.

aws s3api delete-bucket --bucket labex-iam01-reports
aws s3api list-buckets --query 'Buckets[].Name'

Seul labex-iam01-reference reste. Confirmez ses octets d'origine :

aws s3api get-object --bucket labex-iam01-reference --key reference.txt reference.txt
cat reference.txt

Attendez-vous à Platform reference: keep. AWS View affiche maintenant No inline policy et Reports bucket removed. Une panne de service serait affichée comme une indisponibilité, pas comme un nettoyage réussi. Les identités jetables préparées sont récupérées à la fin de votre environnement de laboratoire ; vous avez retiré les autorisations créées par l'apprenant et les données de l'exercice tout en conservant les ressources fournies sans rapport avec la tâche.

Résumé

Vous avez attaché et révisé une politique d'identité IAM, utilisé Action et Resource pour restreindre un traitement de rapports, comparé les refus implicites et explicites et prouvé qu'une autorisation de lecture n'autorise pas une écriture. Vous avez révoqué la politique et supprimé uniquement les données de l'exercice. Testez la réussite prévue et les opérations interdites chaque fois que vous examinez l'accès ; une politique stockée seule ne prouve pas qu'une application est correctement autorisée.

Pour approfondir ce sujet, consultez la documentation AWS : Types de politiques et instructions d’autorisation IAM.