Introduction
Votre application EC2 doit lire un rapport depuis S3. Vous lui attribuerez un rôle IAM par un profil d'instance, vérifierez la lecture réelle du rapport et observerez ce qui se passe lorsque vous révoquez son autorisation.
Vous devez connaître le lancement d'EC2, User Data et les politiques IAM de base. Cet environnement neuf fournit une image d'application, un réseau, une paire de clés et un bucket S3 contenant des données fictives. Vous créerez l'instance d'application et ses ressources d'autorisation.
Lien avec la certification
Ce laboratoire exerce le moindre privilège et les rôles des charges de travail, en soutien de la tâche 2.3 des objectifs de sécurité AWS Certified Cloud Practitioner et de la tâche 3.3 de ses objectifs de calcul.
Lancez une application sans rôle
Dans cette étape, vous lancerez le serveur de rapports et observerez que son application ne peut pas encore lire S3.
Commencez dans votre espace de travail et chargez les identifiants d'image, de réseau et de bucket de rapports fournis :
cd /home/labex/project
source launch.env
Inspectez le script de démarrage fourni. Il configure le bucket S3 et la clé d'objet de l'application, mais ne fournit aucun identifiant d'accès :
cat role-user-data.sh
Lancez un serveur nommé role-server avec cette configuration :
aws ec2 \
run-instances \
--image-id "$AMI_ID" \
--instance-type t3.micro \
--subnet-id "$SUBNET_ID" \
--security-group-ids "$SECURITY_GROUP_ID" \
--key-name report-key \
--count 1 \
--user-data file://role-user-data.sh \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=role-server}]'
Conservez son identifiant :
INSTANCE_ID=$(aws ec2 \
describe-instances \
--filters Name=tag:Name,Values=role-server \
--query 'Reservations[0].Instances[0].InstanceId' \
--output text)
aws ec2 \
wait instance-running \
--instance-ids "$INSTANCE_ID"
Ouvrez AWS View, cliquez sur Refresh resources, sélectionnez role-server et cliquez sur Check application. Confirmez HTTP 200 et Role report server. Cliquez ensuite sur Read S3 report. Le résultat attendu est HTTP 503 et Application storage unavailable : l'application en cours d'exécution n'a pas encore d'identifiants de rôle.
Une application sur EC2 peut obtenir des identifiants temporaires pour un rôle attribué via les métadonnées d'instance. Son SDK AWS les utilise pour signer les requêtes API. Le guide officiel des rôles EC2 explique ce processus. Vous configurerez le rôle au lieu de copier les identifiants de votre terminal dans l'application.
Accordez l'accès par un profil d'instance
Dans cette étape, vous créerez les politiques de confiance et d'autorisations du rôle, ajouterez le rôle à un profil d'instance et associerez ce profil au serveur.
Une politique de confiance définit qui peut endosser un rôle. Créez une politique JSON qui fait confiance au service EC2. Le here-document dont le délimiteur est entre guillemets préserve le JSON littéralement :
cat > ec2-trust.json <<'JSON'
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": {"Service": "ec2.amazonaws.com"},
"Action": "sts:AssumeRole"
}]
}
JSON
Créez le rôle report-reader avec cette politique de confiance :
aws iam \
create-role \
--role-name report-reader \
--assume-role-policy-document file://ec2-trust.json
Une politique d'autorisations définit ce que le rôle endossé peut faire. Cette application a seulement besoin de s3:GetObject pour report.csv. L'ARN d'un objet inclut le bucket et la clé. Contrairement au here-document précédent, le marqueur JSON sans guillemets ci-dessous développe $REPORT_BUCKET en nom du bucket fourni :
cat > read-report.json <<JSON
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::$REPORT_BUCKET/report.csv"
}]
}
JSON
Inspectez l'ARN de ressource obtenu :
cat read-report.json
Ajoutez cette politique en ligne à votre rôle :
aws iam \
put-role-policy \
--role-name report-reader \
--policy-name ReadReport \
--policy-document file://read-report.json
Un profil d'instance transmet un rôle IAM à EC2. Avec la CLI, vous créez le rôle et le profil séparément. Pour plus de clarté, créez un profil portant le même nom :
aws iam \
create-instance-profile \
--instance-profile-name report-reader
Ajoutez le rôle au profil :
aws iam \
add-role-to-instance-profile \
--instance-profile-name report-reader \
--role-name report-reader
Associez le profil à l'instance existante et conservez l'identifiant d'association pour le nettoyage :
ASSOCIATION_ID=$(aws ec2 \
associate-iam-instance-profile \
--instance-id "$INSTANCE_ID" \
--iam-instance-profile Name=report-reader \
--query 'IamInstanceProfileAssociation.AssociationId' \
--output text)
Inspectez l'association :
aws ec2 \
describe-iam-instance-profile-associations \
--association-ids "$ASSOCIATION_ID" \
--query 'IamInstanceProfileAssociations[].{Instance:InstanceId,State:State,Profile:IamInstanceProfile.Arn}'
Confirmez associated et le profil report-reader. Actualisez AWS View et cliquez sur Read S3 report. Le résultat attendu est HTTP 200 avec period,total et Q1,320. L'application utilise les identifiants de rôle de son SDK pour récupérer l'objet S3 réel. Si l'association est encore en cours de propagation, attendez brièvement puis réessayez.
Le rôle autorise la lecture d'un seul objet, plutôt qu'un accès à tout le bucket ou des droits administrateur. Le guide des profils d'instance explique comment les profils transmettent les rôles et pourquoi les changements d'association peuvent mettre du temps à se propager.
Observez la révocation de l'autorisation
Dans cette étape, vous retirerez l'autorisation du rôle pour le rapport et distinguerez un échec d'autorisation d'une panne de l'application.
Supprimez uniquement la politique en ligne que vous avez créée :
aws iam \
delete-role-policy \
--role-name report-reader \
--policy-name ReadReport
Listez les politiques en ligne restantes du rôle :
aws iam \
list-role-policies \
--role-name report-reader
La liste PolicyNames doit être vide. Le profil d'instance reste associé, mais son rôle n'autorise plus la lecture du rapport.
Dans AWS View, cliquez sur Check application et confirmez HTTP 200 : le serveur fonctionne toujours. Cliquez ensuite sur Read S3 report. Le résultat attendu est HTTP 403 et Access denied. Si les changements d'autorisations ne sont pas encore propagés, attendez brièvement et répétez la requête. Une réponse de santé correcte avec un refus S3 indique un problème d'autorisation, pas une instance arrêtée ni une application absente.
Un SDK peut mettre les identifiants temporaires en cache. Retirer une autorisation du rôle change ce que ces identifiants peuvent faire ; retirer un profil d'instance ne révoque pas immédiatement les identifiants déjà émis.
Nettoyez l'instance et le rôle
Dans cette étape, vous supprimerez votre association, le serveur, le profil et le rôle.
Dissociez le profil avec l'identifiant d'association enregistré :
aws ec2 \
disassociate-iam-instance-profile \
--association-id "$ASSOCIATION_ID"
Terminez l'instance d'application :
aws ec2 \
terminate-instances \
--instance-ids "$INSTANCE_ID"
aws ec2 \
wait instance-terminated \
--instance-ids "$INSTANCE_ID"
Retirez le rôle de son profil d'instance désormais inutilisé :
aws iam \
remove-role-from-instance-profile \
--instance-profile-name report-reader \
--role-name report-reader
Supprimez le profil vide :
aws iam \
delete-instance-profile \
--instance-profile-name report-reader
La politique en ligne a déjà été supprimée lors de la révocation. Supprimez votre rôle :
aws iam \
delete-role \
--role-name report-reader
Confirmez que l'instance est terminée :
aws ec2 \
describe-instances \
--instance-ids "$INSTANCE_ID" \
--query 'Reservations[].Instances[].{Instance:InstanceId,State:State.Name}'
Vérifiez que le rôle et le profil portant ces noms sont absents :
aws iam \
list-roles \
--query "Roles[?RoleName=='report-reader'].RoleName"
aws iam \
list-instance-profiles \
--query "InstanceProfiles[?InstanceProfileName=='report-reader'].InstanceProfileName"
Les deux listes doivent être []. Actualisez AWS View et confirmez que le serveur n'est plus une cible en cours d'exécution. Conservez les données S3, le réseau et la paire de clés préparés.
Résumé
Vous avez créé une relation de confiance EC2 et une autorisation de lecture d'un objet S3 pour un rôle IAM, transmis ce rôle par un profil d'instance et vérifié la lecture réelle du rapport par l'application. Vous avez ensuite révoqué l'autorisation et distingué un refus S3 d'une application en bonne santé. Enfin, vous avez supprimé l'instance, le profil et le rôle.



