Protege un bucket con una política de recurso

AWSBeginner
Practicar Ahora

Introducción

El propietario de un bucket quiere conceder acceso a un rol de informes y proteger los datos privados. Adjuntarás una política de bucket, la compararás con la política del propio rol y probarás cómo un Deny coincidente afecta al acceso.

Completa primero Utiliza credenciales temporales con un rol IAM y Concede el mínimo privilegio a un lector de informes. Esta VM nueva proporciona default, report-role y other-role; los perfiles de rol ya obtienen sesiones temporales. Utiliza /home/labex/project y AWS View. Mantén privadas las credenciales y las cachés.

Relación con las certificaciones

Certificación Tarea del examen Práctica
Cloud Practitioner (CLF-C02) Tarea 2.3 Políticas de recursos y precedencia de la denegación explícita.
Solutions Architect – Associate (SAA-C03) Tarea 1.1 Políticas de recursos y precedencia de la denegación explícita.
Developer – Associate (DVA-C02) Tarea 2.1 Políticas de recursos y precedencia de la denegación explícita.
CloudOps Engineer – Associate (SOA-C03) Tarea 4.1 Políticas de recursos y precedencia de la denegación explícita.
Security – Specialty (SCS-C03) Tarea 4.2 Práctica de fundamentos: Políticas de recursos y precedencia de la denegación explícita.
Data Engineer – Associate (DEA-C01) Tarea 4.2 Práctica de fundamentos: Políticas de recursos y precedencia de la denegación explícita.
DevOps Engineer – Professional (DOP-C02) Tarea 6.1 Práctica de fundamentos: Políticas de recursos y precedencia de la denegación explícita.
Solutions Architect – Professional (SAP-C02) Tarea 2.3 Práctica de fundamentos: Políticas de recursos y precedencia de la denegación explícita.

Descripción general del laboratorio

Diagrama conceptual: Compara la política de identidad de un rol con la política de un bucket S3 para solicitudes de informes en la misma cuenta; un Deny explícito coincidente prevalece sobre un Allow.

Concede acceso a un rol desde el bucket

En este paso, adjuntarás una política de recurso que concede acceso a ReportReader al prefijo de informes. A diferencia de una política de identidad, la política de bucket debe especificar Principal. Utiliza el ARN del rol IAM, que identifica el rol; el ARN de sesión assumed-role identifica un uso de él.

Ya concediste acceso desde una identidad; ahora el propietario del bucket lo concederá desde el recurso. Los dos perfiles de rol están preparados: conserva su confianza y céntrate en cómo la política del bucket y la del rol afectan a las mismas solicitudes.

Una política de recurso se almacena en el recurso. Una política de bucket de S3 es un ejemplo: su Principal identifica a quién pertenecen las solicitudes cubiertas por la declaración. Compárala con una política de identidad almacenada en un usuario o rol.

Confirma las dos identidades de sesión activas y la lista de políticas de permisos del rol de informes, inicialmente vacía.

cd /home/labex/project
aws sts get-caller-identity --profile report-role --query Arn --output text
aws sts get-caller-identity --profile other-role --query Arn --output text
aws iam list-role-policies --role-name ReportReader

Espera assumed-role/ReportReader/report-run y assumed-role/OtherReader/other-run, y una lista PolicyNames vacía. Autenticarse como rol no autoriza por sí mismo el acceso a S3. Prueba la lectura actual:

aws s3api get-object --profile report-role --bucket labex-iam04-reports --key reports/today.txt before.txt || true

Espera AccessDenied. || true evita que un fallo esperado detenga una secuencia pegada. Los fallos de conexión no demuestran una denegación.

Escribe la política de bucket. GetObject concede lecturas de objetos; Resource las limita a reports/ en este único bucket. El Principal del rol excluye a OtherReader y no concede acceso público.

cat > bucket-policy.json <<'JSON'
{
  "Version":"2012-10-17",
  "Statement":[
    {"Effect":"Allow","Principal":{"AWS":"arn:aws:iam::123456789012:role/ReportReader"},"Action":"s3:GetObject","Resource":"arn:aws:s3:::labex-iam04-reports/reports/*"}
  ]
}
JSON
aws s3api put-bucket-policy \
  --bucket labex-iam04-reports \
  --policy file://bucket-policy.json
aws s3api get-bucket-policy --bucket labex-iam04-reports --query Policy --output text

La política de bucket ahora está almacenada en el bucket, no adjunta al rol. En la misma cuenta, este Allow de recurso aplicable puede conceder acceso al rol sin un Allow independiente de identidad del rol, siempre que ningún Deny pertinente lo bloquee.

aws s3api get-object \
  --profile report-role \
  --bucket labex-iam04-reports \
  --key reports/today.txt today.txt
cat today.txt
aws s3api get-object --profile other-role --bucket labex-iam04-reports --key reports/today.txt other-denied.txt || true
aws s3api get-object --profile report-role --bucket labex-iam04-reports --key private/payroll.txt private-denied.txt || true
aws s3api get-object --profile report-role --bucket labex-iam04-reference --key reference.txt reference-denied.txt || true

ReportReader recibe Daily orders: 145; las otras tres solicitudes reciben AccessDenied. La concesión del bucket no cubre otro rol, otro prefijo ni otro bucket. AWS View realiza las mismas lecturas reales de los roles.

Protege los datos privados frente a un Allow adicional de identidad

En este paso, observarás cómo una concesión de identidad del rol se combina con una concesión del bucket y después utilizarás un Deny del bucket para proteger datos privados. Para estas solicitudes de la misma cuenta, los Allow aplicables se combinan; las dos fuentes de políticas no se intersectan automáticamente. Un Deny explícito en cualquiera de las fuentes de políticas aplicables anula un Allow.

Las dos fuentes de políticas utilizadas para las solicitudes de la misma cuenta de este laboratorio: un Deny explícito coincidente anula un Allow.

Amplía temporalmente el alcance de lectura de identidad de ReportReader a los objetos de este bucket propio. Esta comparación controlada utiliza datos sintéticos y no concede acceso a otros buckets.

cat > role-read.json <<'JSON'
{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":"s3:GetObject","Resource":"arn:aws:s3:::labex-iam04-reports/*"}]}
JSON
aws iam put-role-policy \
  --role-name ReportReader \
  --policy-name ReadAllOwned \
  --policy-document file://role-read.json
aws s3api get-object \
  --profile report-role \
  --bucket labex-iam04-reports \
  --key private/payroll.txt private-before-deny.txt
cat private-before-deny.txt

Espera Synthetic payroll: restricted. El Allow de identidad se aplica aunque el Allow del bucket solo cubra reports/. Añade un Deny del bucket limitado a este rol y al prefijo privado, manteniendo el Allow de informes.

cat > bucket-policy.json <<'JSON'
{
  "Version":"2012-10-17",
  "Statement":[
    {"Effect":"Allow","Principal":{"AWS":"arn:aws:iam::123456789012:role/ReportReader"},"Action":"s3:GetObject","Resource":"arn:aws:s3:::labex-iam04-reports/reports/*"},
    {"Effect":"Deny","Principal":{"AWS":"arn:aws:iam::123456789012:role/ReportReader"},"Action":"s3:GetObject","Resource":"arn:aws:s3:::labex-iam04-reports/private/*"}
  ]
}
JSON
aws s3api put-bucket-policy \
  --bucket labex-iam04-reports \
  --policy file://bucket-policy.json
aws s3api get-object --profile report-role --bucket labex-iam04-reports --key private/payroll.txt private-denied.txt || true
aws s3api get-object \
  --profile report-role \
  --bucket labex-iam04-reports \
  --key reports/today.txt today.txt
cat today.txt

El objeto privado ahora devuelve AccessDenied pese al Allow de identidad; el informe sigue devolviendo 145. El Deny identifica a ReportReader, así que el operador todavía puede inspeccionar y conservar el recurso preparado. El orden de las declaraciones no hace que un Allow anule un Deny coincidente.

Confirma que un Deny de identidad anula un Allow del bucket

En este paso, probarás la dirección opuesta: un Deny de identidad del rol anula un Allow del bucket. Conserva la concesión actual de lectura y añade un Deny para las escrituras en el prefijo de informes.

cat > role-read.json <<'JSON'
{"Version":"2012-10-17","Statement":[
  {"Effect":"Allow","Action":"s3:GetObject","Resource":"arn:aws:s3:::labex-iam04-reports/*"},
  {"Effect":"Deny","Action":"s3:PutObject","Resource":"arn:aws:s3:::labex-iam04-reports/reports/*"}
]}
JSON
aws iam put-role-policy \
  --role-name ReportReader \
  --policy-name ReadAllOwned \
  --policy-document file://role-read.json

Para una prueba controlada de prioridad, añade temporalmente un Allow del bucket para el mismo rol y prefijo de escritura. Aplica primero el Deny de identidad para que el informe permanezca protegido.

cat > bucket-write-test.json <<'JSON'
{
  "Version":"2012-10-17",
  "Statement":[
    {"Effect":"Allow","Principal":{"AWS":"arn:aws:iam::123456789012:role/ReportReader"},"Action":"s3:GetObject","Resource":"arn:aws:s3:::labex-iam04-reports/reports/*"},
    {"Effect":"Deny","Principal":{"AWS":"arn:aws:iam::123456789012:role/ReportReader"},"Action":"s3:GetObject","Resource":"arn:aws:s3:::labex-iam04-reports/private/*"},
    {"Effect":"Allow","Principal":{"AWS":"arn:aws:iam::123456789012:role/ReportReader"},"Action":"s3:PutObject","Resource":"arn:aws:s3:::labex-iam04-reports/reports/*"}
  ]
}
JSON
aws s3api put-bucket-policy \
  --bucket labex-iam04-reports \
  --policy file://bucket-write-test.json
aws s3api put-object --profile report-role --bucket labex-iam04-reports --key reports/today.txt --body upload.txt || true

Espera AccessDenied de PutObject aunque el bucket lo permita. El Deny de identidad prevalece. Elimina inmediatamente el Allow temporal de escritura restaurando la política de dos declaraciones guardada en el paso anterior.

aws s3api put-bucket-policy \
  --bucket labex-iam04-reports \
  --policy file://bucket-policy.json
aws s3api get-object \
  --profile report-role \
  --bucket labex-iam04-reports \
  --key reports/today.txt today.txt
cat today.txt
aws s3api get-object --profile other-role --bucket labex-iam04-reports --key reports/today.txt other-denied.txt || true

El informe debe seguir siendo Daily orders: 145 y OtherReader sigue siendo rechazado. La concesión temporal de escritura ya no existe. AWS View muestra la política de bucket y la política de identidad del rol junto a los resultados reales de lectura.

Las políticas de bucket e identidad protegen el informe. Ejemplo: ReportReader puede leer el informe, mientras ambos roles son rechazados en los objetos privados y de referencia. Las políticas almacenadas muestran las fuentes separadas de concesiones y las denegaciones explícitas; el informe desplegado contiene los bytes reales devueltos.

Elimina ambas fuentes de concesión y limpia los recursos

En este paso, retirarás ambas fuentes de políticas antes de eliminar los datos propios. Eliminar un Allow no basta cuando otra política todavía concede la misma acción.

Elimina la política de bucket y después repite la lectura del informe. ReadAllOwned todavía concede esa lectura desde la política de identidad del rol.

aws s3api delete-bucket-policy --bucket labex-iam04-reports
aws s3api get-object \
  --profile report-role \
  --bucket labex-iam04-reports \
  --key reports/today.txt remaining-grant.txt
cat remaining-grant.txt

Espera Daily orders: 145. Ahora elimina ReadAllOwned y prueba de nuevo mientras el informe todavía existe.

aws iam delete-role-policy --role-name ReportReader --policy-name ReadAllOwned
aws s3api get-object --profile report-role --bucket labex-iam04-reports --key reports/today.txt revoked.txt || true
aws iam list-role-policies --role-name ReportReader

Espera AccessDenied y una lista de políticas vacía. Los roles preparados y su confianza en los llamantes permanecen intactos; estás eliminando las concesiones de S3 creadas durante este ejercicio.

aws s3api delete-object --bucket labex-iam04-reports --key reports/today.txt
aws s3api delete-object --bucket labex-iam04-reports --key private/payroll.txt
aws s3api list-objects-v2 --bucket labex-iam04-reports

Comprueba KeyCount: 0 en esta respuesta correcta y después elimina el bucket de informes vacío y confirma los bytes de referencia.

aws s3api delete-bucket --bucket labex-iam04-reports
aws s3api list-buckets --query 'Buckets[].Name'
aws s3api get-object --bucket labex-iam04-reference --key reference.txt reference.txt
cat reference.txt

Solo queda el bucket de referencia con Platform reference: keep. Los errores de red no demuestran la eliminación. AWS View ahora muestra que no hay política de bucket ni política de permisos de rol y Reports bucket removed. Las identidades, los recursos preparados y las cachés temporales locales se retiran cuando termina el entorno desechable.

Resumen

Utilizaste Principal para conceder acceso a un rol mediante una política de bucket, observaste cómo se combinan los Allow de identidad y recurso y probaste la prioridad de Deny explícito en ambas direcciones. La escritura prohibida no cambió los bytes del informe. Retiraste ambas fuentes de concesión antes de la limpieza delimitada y conservaste las identidades preparadas y los datos ajenos a la tarea. Inspecciona todas las fuentes de políticas aplicables cuando una solicitud siga autorizada o sea denegada inesperadamente.

Para ampliar este tema, consulta la referencia de AWS: Evaluación de políticas de identidad y de recursos.