Concede el mínimo privilegio a un lector de informes

AWSBeginner
Practicar Ahora

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

Diagrama conceptual: Una política de identidad IAM permite al lector leer solo el informe de hoy en S3 y protege los otros informes y las nóminas.

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.

Después de limitar la política, el lector puede descargar el informe de hoy, pero no leer los demás objetos ni subir cambios.

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.

Lector limitado a un informe. Ejemplo: solo hoy es legible; los otros objetos existentes se deniegan. El documento de la izquierda es la política IAM almacenada.

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.