Concede acceso a S3 a un rol de instancia

AWSBeginner
Practicar Ahora

Introducción

Tu aplicación EC2 necesita leer un informe de S3. Le asignarás un rol IAM mediante un perfil de instancia, verificarás que lea realmente el informe y observarás qué ocurre al revocar su permiso.

Debes conocer el lanzamiento de EC2, User Data y las políticas IAM básicas. Este entorno nuevo proporciona una imagen de aplicación, una red, un par de claves y un bucket S3 con datos sintéticos. Crearás la instancia de la aplicación y sus recursos de autorización.

Relación con la certificación

Este laboratorio practica el mínimo privilegio y los roles de cargas de trabajo, apoyando la tarea 2.3 de los objetivos de seguridad de AWS Certified Cloud Practitioner y la tarea 3.3 de sus objetivos de computación.

Lanza una aplicación sin rol

En este paso, lanzarás el servidor de informes y observarás que su aplicación todavía no puede leer S3.

Empieza en tu espacio de trabajo y carga los identificadores de imagen, red y bucket de informes proporcionados:

cd /home/labex/project
source launch.env

Inspecciona el script de inicio proporcionado. Configura el bucket S3 y la clave del objeto para la aplicación, pero no proporciona credenciales:

cat role-user-data.sh

Lanza un servidor llamado role-server con esta configuración:

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}]'

Guarda su identificador:

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"

Abre AWS View, pulsa Refresh resources, selecciona role-server y pulsa Check application. Confirma HTTP 200 y Role report server. Ahora pulsa Read S3 report. Espera HTTP 503 y Application storage unavailable: la aplicación en ejecución todavía no tiene credenciales de rol.

Una aplicación en EC2 puede obtener credenciales temporales para un rol asignado mediante los metadatos de instancia. Su SDK de AWS utiliza esas credenciales para firmar solicitudes a la API. La guía oficial de roles EC2 explica este flujo. Configurarás el rol en lugar de copiar las credenciales de tu terminal a la aplicación.

Concede acceso mediante un perfil de instancia

En este paso, crearás las políticas de confianza y permisos del rol, lo añadirás a un perfil de instancia y asociarás el perfil con tu servidor.

Una política de confianza define quién puede asumir un rol. Crea una política JSON que confíe en el servicio EC2. El documento incrustado con delimitador entre comillas conserva el JSON literalmente:

cat > ec2-trust.json <<'JSON'
{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Principal": {"Service": "ec2.amazonaws.com"},
    "Action": "sts:AssumeRole"
  }]
}
JSON

Crea el rol report-reader con esa política de confianza:

aws iam \
  create-role \
  --role-name report-reader \
  --assume-role-policy-document file://ec2-trust.json

Una política de permisos define qué puede hacer el rol asumido. Esta aplicación solo necesita s3:GetObject para report.csv. El ARN de un objeto incluye el bucket y la clave. A diferencia del documento incrustado anterior entre comillas, el marcador JSON sin comillas de abajo expande $REPORT_BUCKET al nombre de bucket proporcionado:

cat > read-report.json <<JSON
{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Action": "s3:GetObject",
    "Resource": "arn:aws:s3:::$REPORT_BUCKET/report.csv"
  }]
}
JSON

Inspecciona el ARN del recurso resuelto:

cat read-report.json

Adjunta esta política integrada a tu rol:

aws iam \
  put-role-policy \
  --role-name report-reader \
  --policy-name ReadReport \
  --policy-document file://read-report.json

Un perfil de instancia lleva un rol IAM a EC2. Al utilizar la CLI, creas el rol y el perfil por separado. Crea un perfil con el mismo nombre para mayor claridad:

aws iam \
  create-instance-profile \
  --instance-profile-name report-reader

Añade el rol al perfil:

aws iam \
  add-role-to-instance-profile \
  --instance-profile-name report-reader \
  --role-name report-reader

Asocia el perfil con la instancia existente y guarda el identificador de asociación para la limpieza:

ASSOCIATION_ID=$(aws ec2 \
  associate-iam-instance-profile \
  --instance-id "$INSTANCE_ID" \
  --iam-instance-profile Name=report-reader \
  --query 'IamInstanceProfileAssociation.AssociationId' \
  --output text)

Inspecciona la asociación:

aws ec2 \
  describe-iam-instance-profile-associations \
  --association-ids "$ASSOCIATION_ID" \
  --query 'IamInstanceProfileAssociations[].{Instance:InstanceId,State:State,Profile:IamInstanceProfile.Arn}'

Confirma associated y el perfil report-reader. Actualiza AWS View y pulsa Read S3 report. Espera HTTP 200 con period,total y Q1,320. La aplicación utiliza las credenciales de rol de su SDK para recuperar el objeto S3 real. Si la asociación todavía se está propagando, espera brevemente y repite la solicitud.

El rol permite leer un solo objeto, en lugar de conceder acceso a todo el bucket o permisos de administrador. La guía de perfiles de instancia explica cómo los perfiles llevan roles y por qué los cambios de asociación pueden tardar en propagarse.

Observa la revocación del permiso

En este paso, quitarás el permiso del rol para el informe y distinguirás un fallo de autorización de un fallo de la aplicación.

Elimina únicamente la política integrada que creaste:

aws iam \
  delete-role-policy \
  --role-name report-reader \
  --policy-name ReadReport

Enumera las políticas integradas restantes del rol:

aws iam \
  list-role-policies \
  --role-name report-reader

Espera una lista PolicyNames vacía. El perfil de instancia sigue asociado, pero su rol ya no permite leer el informe.

En AWS View, pulsa Check application y confirma HTTP 200: el servidor sigue en ejecución. Después pulsa Read S3 report. Espera HTTP 403 y Access denied. Si los cambios de permisos todavía no se han propagado, espera brevemente y repite la solicitud. Una respuesta de salud correcta junto con una denegación de S3 apunta a la autorización, no a una instancia detenida ni a una aplicación ausente.

Un SDK puede almacenar credenciales temporales en caché. Quitar un permiso del rol cambia lo que esas credenciales pueden hacer; quitar un perfil de instancia no revoca inmediatamente las credenciales ya emitidas.

Limpia la instancia y el rol

En este paso, eliminarás tu asociación, servidor, perfil y rol.

Desasocia el perfil mediante el identificador de asociación guardado:

aws ec2 \
  disassociate-iam-instance-profile \
  --association-id "$ASSOCIATION_ID"

Termina la instancia de la aplicación:

aws ec2 \
  terminate-instances \
  --instance-ids "$INSTANCE_ID"
aws ec2 \
  wait instance-terminated \
  --instance-ids "$INSTANCE_ID"

Quita el rol de su perfil de instancia, que ya no se utiliza:

aws iam \
  remove-role-from-instance-profile \
  --instance-profile-name report-reader \
  --role-name report-reader

Elimina el perfil vacío:

aws iam \
  delete-instance-profile \
  --instance-profile-name report-reader

La política integrada ya se eliminó durante la revocación. Elimina tu rol:

aws iam \
  delete-role \
  --role-name report-reader

Confirma que la instancia haya terminado:

aws ec2 \
  describe-instances \
  --instance-ids "$INSTANCE_ID" \
  --query 'Reservations[].Instances[].{Instance:InstanceId,State:State.Name}'

Comprueba que el rol y el perfil con esos nombres estén ausentes:

aws iam \
  list-roles \
  --query "Roles[?RoleName=='report-reader'].RoleName"
aws iam \
  list-instance-profiles \
  --query "InstanceProfiles[?InstanceProfileName=='report-reader'].InstanceProfileName"

Ambas listas deben ser []. Actualiza AWS View y confirma que el servidor ya no sea un destino en ejecución. Conserva los datos S3, la red y el par de claves preparados.

Resumen

Creaste confianza EC2 y permiso de lectura de un único objeto S3 para un rol IAM, lo llevaste mediante un perfil de instancia y verificaste que la aplicación leyera realmente el informe. Después revocaste el permiso y distinguiste la denegación de S3 de una aplicación saludable. Por último, eliminaste la instancia, el perfil y el rol.