Introducción
Un lector de informes devuelve AccessDenied después de una migración de políticas. Inspeccionarás el llamante, la acción solicitada, el recurso y la declaración de denegación, reparando una discrepancia cada vez y conservando el alcance limitado del lector.
Completa primero Concede el mínimo privilegio a un lector de informes para conocer los campos de políticas y Deny explícito. Esta VM nueva prepara default para la administración y reader para el trabajo. Trabaja en /home/labex/project y compara la política almacenada con las lecturas reales en AWS View.
Relación con las certificaciones
| Certificación | Tarea del examen | Práctica |
|---|---|---|
| Solutions Architect – Associate (SAA-C03) | Tarea 1.1 | Diagnóstico de autorización y verificación de límites de acceso. |
| Developer – Associate (DVA-C02) | Tarea 2.1 | Diagnóstico de autorización y verificación de límites de acceso. |
| CloudOps Engineer – Associate (SOA-C03) | Tarea 4.1 | Diagnóstico de autorización y verificación de límites de acceso. |
| Security – Specialty (SCS-C03) | Tarea 4.2 | Práctica de fundamentos: Diagnóstico de autorización y verificación de límites de acceso. |
| Data Engineer – Associate (DEA-C01) | Tarea 4.2 | Práctica de fundamentos: Diagnóstico de autorización y verificación de límites de acceso. |
Descripción general del laboratorio

Confirma el llamante y corrige la acción solicitada
En este paso, distinguirás un error de identidad de una discrepancia de política y después corregirás la acción Allow. El mismo comando con credenciales diferentes puede producir un resultado de autorización distinto.
La política migrada tiene varias discrepancias. Corregir un campo puede dejar la solicitud denegada por otro campo o por el Deny explícito. Tras cada cambio, inspecciona el documento almacenado y repite la misma solicitud del lector; que AccessDenied no cambie no demuestra por sí solo si esa corrección era correcta.

cd /home/labex/project
aws sts get-caller-identity --query Arn --output text
aws sts get-caller-identity --profile reader --query Arn --output text
Espera user/iam05-operator y user/report-reader. El trabajo de informes utiliza el lector, no el operador. Confirma que el objeto existe utilizando el operador y después reproduce el fallo del trabajo como lector.
aws s3api get-object \
--bucket labex-iam05-reports \
--key reports/today.txt operator-report.txt
cat operator-report.txt
aws s3api get-object --profile reader --bucket labex-iam05-reports --key reports/today.txt reader-before.txt || true
El operador recibe Daily orders: 145; el lector recibe AccessDenied. Una clave ausente o un error de conexión requerirían otra investigación. || true permite que esta solicitud fallida esperada termine en una secuencia pegada.
Enumera las políticas del lector y lee el documento almacenado. Estas son consultas del operador sobre la identidad del trabajo, no intentos de prestar el acceso del operador al trabajo.
aws iam list-user-policies --user-name report-reader
aws iam get-user-policy \
--user-name report-reader \
--policy-name LabReport \
--query PolicyDocument
El Allow indica s3:ListBucket, mientras el error indica GetObject. ListBucket enumera nombres de objetos y utiliza un ARN de bucket; no descarga bytes de objetos. Cambia únicamente Action del Allow a GetObject, manteniendo Resource y Deny actuales para diagnosticar la siguiente discrepancia por separado.
cat > repair-policy.json <<'JSON'
{"Version":"2012-10-17","Statement":[
{"Effect":"Allow","Action":"s3:GetObject","Resource":"arn:aws:s3:::labex-iam05-reports"},
{"Effect":"Deny","Action":"s3:GetObject","Resource":"arn:aws:s3:::labex-iam05-reports/reports/*"}
]}
JSON
aws iam put-user-policy \
--user-name report-reader \
--policy-name LabReport \
--policy-document file://repair-policy.json
aws iam get-user-policy \
--user-name report-reader \
--policy-name LabReport \
--query PolicyDocument
aws s3api get-object --profile reader --bucket labex-iam05-reports --key reports/today.txt reader-action-fix.txt || true
Todavía devuelve AccessDenied. Action ahora es correcto, pero corregir un campo no garantiza que se superen todas las comprobaciones aplicables.
Haz coincidir el ARN completo del objeto
En este paso, repararás Resource conservando la declaración de denegación. GetObject se aplica a un ARN de objeto, que incluye su clave. El ARN de bucket arn:aws:s3:::labex-iam05-reports no coincide con arn:aws:s3:::labex-iam05-reports/reports/today.txt.
Reemplaza Resource del Allow por el ARN exacto del objeto de hoy. No utilices * para abarcar buckets o claves; el trabajo tiene una entrada requerida.
cat > repair-policy.json <<'JSON'
{"Version":"2012-10-17","Statement":[
{"Effect":"Allow","Action":"s3:GetObject","Resource":"arn:aws:s3:::labex-iam05-reports/reports/today.txt"},
{"Effect":"Deny","Action":"s3:GetObject","Resource":"arn:aws:s3:::labex-iam05-reports/reports/*"}
]}
JSON
aws iam put-user-policy \
--user-name report-reader \
--policy-name LabReport \
--policy-document file://repair-policy.json
aws iam get-user-policy \
--user-name report-reader \
--policy-name LabReport \
--query PolicyDocument
aws s3api get-object --profile reader --bucket labex-iam05-reports --key reports/today.txt reader-resource-fix.txt || true
Espera AccessDenied de nuevo. Ahora el Allow coincide tanto con Action como con Resource, así que inspecciona la declaración restante. Su Deny también coincide con GetObject en reports/*, incluido hoy. Un Deny explícito coincidente tiene prioridad sobre el Allow; mover el Allow más adelante en el documento no puede anularlo.
Repara el Deny sin ampliar el acceso
En este paso, corregirás el alcance del Deny migrado y confirmarás la reparación mínima. La protección prevista protege datos privados; no debería denegar la entrada de informes. Conserva el Allow exacto de lectura y limita el Deny a private/* en lugar de eliminar la protección o añadir concesiones más amplias.
cat > repair-policy.json <<'JSON'
{"Version":"2012-10-17","Statement":[
{"Effect":"Allow","Action":"s3:GetObject","Resource":"arn:aws:s3:::labex-iam05-reports/reports/today.txt"},
{"Effect":"Deny","Action":"s3:GetObject","Resource":"arn:aws:s3:::labex-iam05-reports/private/*"}
]}
JSON
aws iam put-user-policy \
--user-name report-reader \
--policy-name LabReport \
--policy-document file://repair-policy.json
aws s3api get-object \
--profile reader \
--bucket labex-iam05-reports \
--key reports/today.txt today.txt
cat today.txt
Espera Daily orders: 145. Prueba los recursos cercanos como el mismo lector; la reparación completa no debe ampliar su alcance.
aws s3api get-object --profile reader --bucket labex-iam05-reports --key reports/yesterday.txt yesterday-denied.txt || true
aws s3api get-object --profile reader --bucket labex-iam05-reports --key private/payroll.txt payroll-denied.txt || true
aws s3api get-object --profile reader --bucket labex-iam05-reference --key reference.txt reference-denied.txt || true
Las tres deben devolver AccessDenied. Una concesión de lectura requerida tampoco debe autorizar escrituras. Intenta el reemplazo proporcionado y después verifica que los bytes del informe original permanecen sin cambios.
aws s3api put-object --profile reader --bucket labex-iam05-reports --key reports/today.txt --body upload.txt || true
aws s3api get-object \
--profile reader \
--bucket labex-iam05-reports \
--key reports/today.txt today.txt
cat today.txt
aws iam get-user-policy \
--user-name report-reader \
--policy-name LabReport \
--query PolicyDocument
Espera AccessDenied de PutObject y Daily orders: 145 sin cambios. AWS View ahora muestra hoy como Readable y los demás recursos como Denied. La inspección de la política explica la reparación; las solicitudes reales demuestran su efecto.

Revoca la reparación y limpia los datos propios
En este paso, eliminarás LabReport y demostrarás que el acceso se retira mientras el informe todavía existe. Después elimina únicamente el bucket de informes propio y sus tres claves.
aws iam delete-user-policy --user-name report-reader --policy-name LabReport
aws iam list-user-policies --user-name report-reader
aws s3api get-object --profile reader --bucket labex-iam05-reports --key reports/today.txt revoked.txt || true
Espera una lista de políticas vacía y AccessDenied. La revocación de políticas y la eliminación de datos son comprobaciones independientes. Conserva el bucket de referencia sin cambios.
aws s3api delete-object --bucket labex-iam05-reports --key reports/today.txt
aws s3api delete-object --bucket labex-iam05-reports --key reports/yesterday.txt
aws s3api delete-object --bucket labex-iam05-reports --key private/payroll.txt
aws s3api list-objects-v2 --bucket labex-iam05-reports
Comprueba KeyCount: 0 en una respuesta autenticada correcta, sin entradas restantes de objetos en Contents.
aws s3api delete-bucket --bucket labex-iam05-reports
aws s3api list-buckets --query 'Buckets[].Name'
aws s3api get-object --bucket labex-iam05-reference --key reference.txt reference.txt
cat reference.txt
Solo queda el bucket de referencia con Platform reference: keep. Los fallos del servicio no demuestran la eliminación. Las identidades preparadas se retiran cuando termina el entorno; la política del trabajo y los datos propios del ejercicio se han eliminado.
Resumen
Confirmaste el llamante, comparaste la operación fallida con Action del Allow, hiciste coincidir el ARN completo del objeto y corregiste un Deny explícito que se superponía. Los fallos intermedios ayudaron a identificar los obstáculos restantes. El lector final solo podía leer su informe requerido y no podía escribirlo ni leer datos ajenos a la tarea. Revocaste la concesión reparada y completaste la limpieza delimitada. Utiliza la misma identidad y prueba tanto solicitudes correctas como prohibidas al diagnosticar el acceso.
Para ampliar este tema, consulta la referencia de AWS: Diagnóstico de errores de acceso denegado IAM.



