Introducción
Un lector de informes necesita el informe de hoy, manteniendo privados los demás informes y las nóminas. Concederás esa lectura, limitarás su alcance, probarás el límite del permiso y lo revocarás antes de la limpieza.
Utiliza lo aprendido sobre la identidad que realiza la llamada y los ARN en AWS Foundations y sobre descargas de objetos en S3. Esta VM nueva prepara la CLI y dos identidades: default administra el ejercicio; reader representa el trabajo. Trabaja en /home/labex/project y compara las solicitudes con AWS View en la parte superior.
Relación con las certificaciones
| Certificación | Tarea del examen | Práctica |
|---|---|---|
| Cloud Practitioner (CLF-C02) | Tarea 2.3 | Políticas IAM, alcance de acciones y recursos, y mínimo privilegio. |
| Solutions Architect – Associate (SAA-C03) | Tarea 1.1 | Políticas IAM, alcance de acciones y recursos, y mínimo privilegio. |
| Developer – Associate (DVA-C02) | Tarea 2.1 | Políticas IAM, alcance de acciones y recursos, y mínimo privilegio. |
| CloudOps Engineer – Associate (SOA-C03) | Tarea 4.1 | Políticas IAM, alcance de acciones y recursos, y mínimo privilegio. |
| Security – Specialty (SCS-C03) | Tarea 4.2 | Práctica de fundamentos: Políticas IAM, alcance de acciones y recursos, y mínimo privilegio. |
| Data Engineer – Associate (DEA-C01) | Tarea 4.2 | Práctica de fundamentos: Políticas IAM, alcance de acciones y recursos, y mínimo privilegio. |
| DevOps Engineer – Professional (DOP-C02) | Tarea 6.1 | Práctica de fundamentos: Políticas IAM, alcance de acciones y recursos, y mínimo privilegio. |
| Solutions Architect – Professional (SAP-C02) | Tarea 2.3 | Práctica de fundamentos: Políticas IAM, alcance de acciones y recursos, y mínimo privilegio. |
Descripción general del laboratorio

Concede al lector acceso a los informes
En este paso, escribirás y adjuntarás una política de identidad que permite leer informes. Una política de identidad se adjunta a un usuario, grupo o rol. Describe acciones permitidas o denegadas; no contiene claves de acceso.
En S3 ya descargaste el contenido de objetos. Aquí el trabajo de informes necesita la misma descarga con su propia identidad restringida: el operador cambia los permisos y el lector prueba el resultado. Los datos ya están preparados para que te centres en la autorización.
AWS Identity and Access Management (IAM) controla qué identidad puede realizar una acción sobre un recurso. El mínimo privilegio concede únicamente lo que necesita un trabajo.
Un perfil de AWS CLI selecciona credenciales y ajustes; no concede permisos. Aquí default es el operador del ejercicio, mientras que reader selecciona report-reader. Primero confirma ambas identidades. --profile reader selecciona el trabajo para un comando. get-caller-identity informa de la identidad que realiza la llamada sin mostrar credenciales.
cd /home/labex/project
aws sts get-caller-identity --query Arn --output text
El ARN predeterminado termina en user/iam01-operator. Utiliza este perfil de operador para administrar políticas; utiliza el perfil de lector al probar el trabajo. Este operador del laboratorio está preparado para la administración. Una aplicación de informes de producción utilizaría un rol restringido, que practicarás más adelante.
aws sts get-caller-identity --profile reader --query Arn --output text
El ARN del lector termina en user/report-reader. Un ARN, o Amazon Resource Name, identifica un recurso. Para un objeto de S3 incluye el bucket y la clave completa del objeto; un ARN de bucket por sí solo no identifica un objeto dentro de él.
El lector inicialmente no tiene ninguna política. Prueba una lectura antes de conceder nada:
aws s3api get-object --profile reader --bucket labex-iam01-reports --key reports/today.txt before.txt || true
Espera AccessDenied, no una descarga del informe. || true permite que este comando que falla intencionadamente termine sin detener una secuencia de comandos pegada. Lee el error: un error de conexión no demuestra una denegación de IAM.
Una política JSON utiliza tres campos esenciales: Effect es Allow o Deny; Action indica una operación de servicio; Resource limita qué ARN puede afectar esa operación. s3:GetObject permite leer bytes de objetos. El * siguiente coincide con claves de objetos del prefijo reports/, incluidas hoy y ayer. No coincide con private/ ni con otro bucket. Version selecciona el lenguaje de la política, no la versión del informe.
El siguiente bloque here-document escribe las líneas entre los marcadores JSON en report-policy.json. > reemplaza ese archivo local y el marcador entre comillas evita que el shell expanda su contenido.
cat > report-policy.json <<'JSON'
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::labex-iam01-reports/reports/*"
}
]
}
JSON
Escribir un archivo por sí solo no autoriza al lector. put-user-policy adjunta una política insertada, o inline policy, almacenada directamente en este usuario. --policy-name identifica esa política; utilizar el mismo nombre más adelante la actualiza. file:// indica a la CLI que lea el documento de tu archivo local.
aws iam put-user-policy \
--user-name report-reader \
--policy-name ReportRead \
--policy-document file://report-policy.json
Una actualización correcta normalmente no muestra salida. Ahora solicita los informes utilizando las credenciales del lector. El último argumento es el archivo local de destino.
aws s3api get-object \
--profile reader \
--bucket labex-iam01-reports \
--key reports/today.txt today.txt
cat today.txt
Espera Daily orders: 145. Los campos de respuesta de S3, como ETag, identifican el objeto descargado; el propio archivo contiene los bytes del informe.
aws s3api get-object \
--profile reader \
--bucket labex-iam01-reports \
--key reports/yesterday.txt yesterday.txt
Ayer también se descarga correctamente porque la política cubre todo el prefijo de informes. La empresa solo necesita el informe de hoy, así que ahora reducirás ese alcance.
Limita el recurso al informe de hoy
En este paso, reemplazarás una concesión para un prefijo por el ARN de un objeto y demostrarás que los demás recursos siguen inaccesibles. Una denegación implícita significa que ninguna política aplicable permite la solicitud. No necesitas un Deny independiente para cada objeto ajeno a la tarea.

Reemplaza la política local. El único cambio es Resource: la clave exacta reports/today.txt reemplaza 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
Actualiza la misma política insertada en el mismo lector. Editar el archivo no actualiza IAM hasta que envías este comando.
aws iam put-user-policy \
--user-name report-reader \
--policy-name ReportRead \
--policy-document file://report-policy.json
Lee la política almacenada. --query PolicyDocument selecciona el documento de la respuesta; no cambia los permisos.
aws iam get-user-policy \
--user-name report-reader \
--policy-name ReportRead \
--query PolicyDocument
Comprueba que Resource termina en reports/today.txt. Después prueba de nuevo el lector.
aws s3api get-object \
--profile reader \
--bucket labex-iam01-reports \
--key reports/today.txt today.txt
El informe requerido sigue descargándose. Cada solicitud siguiente debería fallar con AccessDenied porque el ARN de su objeto no coincide con la concesión.
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
Estos objetos existen; el operador puede leerlos. Una respuesta NoSuchKey diagnosticaría un objeto ausente, mientras que estos errores de permisos demuestran el límite de recursos del lector. En AWS View, hoy aparece como Readable y los otros tres objetos como Denied. Esta vista realiza solicitudes de lectura reales como el mismo lector.

Distingue una denegación explícita de la falta de un Allow
En este paso, protegerás explícitamente el prefijo privado y probarás el límite de acciones. Una denegación explícita es una declaración Deny coincidente. Tiene prioridad sobre un Allow de otra política de identidad aplicable. El orden de las declaraciones no hace que un Allow la anule.
Añade una segunda declaración manteniendo la concesión exacta de lectura. s3:* coincide con todas las acciones de S3, pero este Deny está limitado a los objetos bajo el prefijo private/ de este bucket. No deniega el acceso al informe de hoy.
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
El Deny refuerza el límite privado. Para observar su prioridad, adjunta temporalmente una segunda concesión de lectura para este bucket. Esta es una prueba controlada; elimínala inmediatamente despué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
Espera AccessDenied aunque TemporaryRead permita esta clave. La denegación explícita coincidente prevalece. Elimina la concesión temporal para restaurar el mínimo privilegio.
aws iam delete-user-policy --user-name report-reader --policy-name TemporaryRead
Una concesión de lectura no permite escrituras. upload.txt es un reemplazo no aprobado proporcionado. put-object intenta almacenar sus bytes en la clave de hoy y el lector debe ser rechazado.
aws s3api put-object --profile reader --bucket labex-iam01-reports --key reports/today.txt --body upload.txt || true
Espera AccessDenied para PutObject; no consideres archivos ausentes ni fallos del servicio como este resultado. Lee hoy de nuevo para confirmar que la escritura fallida no lo cambió.
aws s3api get-object \
--profile reader \
--bucket labex-iam01-reports \
--key reports/today.txt today.txt
cat today.txt
Debe seguir conteniendo Daily orders: 145. Lee la política final almacenada y confirma el Allow limitado y el Deny privado.
aws iam get-user-policy \
--user-name report-reader \
--policy-name ReportRead \
--query PolicyDocument
Revoca el acceso y limpia los recursos propios
En este paso, retirarás la política del lector y eliminarás únicamente el bucket de informes de este ejercicio. La limpieza de políticas IAM y la limpieza de datos son independientes: eliminar una política no elimina objetos y eliminar objetos no revoca credenciales.
Utiliza el operador predeterminado para eliminar ReportRead. delete-user-policy elimina una política insertada por nombre.
aws iam delete-user-policy --user-name report-reader --policy-name ReportRead
aws iam list-user-policies --user-name report-reader
Espera que PolicyNames esté vacío. Mientras el informe todavía existe, prueba que el lector ha perdido el acceso.
aws s3api get-object --profile reader --bucket labex-iam01-reports --key reports/today.txt revoked.txt || true
Espera AccessDenied. Ahora elimina las tres claves propias exactas como operador. El bucket de referencia pertenece al recurso preparado de la plataforma y debe permanecer intacto.
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
Comprueba que KeyCount es 0 y no aparecen objetos en Contents. Esta respuesta autenticada correcta muestra que el bucket propio está vacío antes de eliminarlo.
aws s3api delete-bucket --bucket labex-iam01-reports
aws s3api list-buckets --query 'Buckets[].Name'
Solo queda labex-iam01-reference. Confirma sus bytes originales:
aws s3api get-object --bucket labex-iam01-reference --key reference.txt reference.txt
cat reference.txt
Espera Platform reference: keep. AWS View ahora muestra No inline policy y Reports bucket removed. Una interrupción del servicio se mostraría como no disponible, no como una limpieza correcta. Las identidades desechables preparadas se retiran cuando termina tu entorno de laboratorio; has eliminado los permisos creados por el estudiante y los datos del ejercicio conservando el recurso preparado ajeno a la tarea.
Resumen
Adjuntaste y revisaste una política de identidad IAM, utilizaste Action y Resource para restringir un trabajo de informes, comparaste denegaciones implícitas y explícitas y demostraste que el permiso de lectura no autoriza una escritura. Revocaste la política y eliminaste únicamente los datos propios. Prueba tanto el éxito previsto como las operaciones prohibidas siempre que revises el acceso; una política almacenada por sí sola no demuestra que una aplicación esté correctamente autorizada.
Para ampliar este tema, consulta la referencia de AWS: Tipos de políticas y declaraciones de permisos IAM.



