Concede acceso de alcance limitado a una identidad de lectura de informes

AWSBeginner
Practicar Ahora

Introducción

Quien consume un informe necesita un informe privado, no todo el acceso al almacenamiento del operador. Concederás acceso de alcance limitado a su identidad IAM independiente, probarás solicitudes reales y revocarás después el permiso conservando los datos del informe.

Parte de tus conocimientos sobre referencias a recursos y lecturas de objetos de S3. Debes comprender Action y Resource de IAM; no necesitas confianza de roles, perfiles de instancia ni claves de acceso personales. Ambas identidades de la CLI están preparadas en este entorno nuevo.

Relación con las certificaciones

Certificación Tarea del examen Práctica
Cloud Practitioner (CLF-C02) Tareas 2.3 y 3.1 Gestionar una política de identidad de privilegios mínimos mediante una configuración de infraestructura repetible.
Developer – Associate (DVA-C02) Tarea 3.3, habilidad 3.3.4 Práctica básica de despliegue de una definición de infraestructura.
DevOps Engineer – Professional (DOP-C02) Tarea 2.1 Práctica básica de gestión de recursos mediante una definición de IaC.
Solutions Architect – Associate (SAA-C03) Tarea 1.1 Práctica básica de delimitación de una política IAM de lectura y evaluación del acceso permitido y denegado.

Vista conceptual de los recursos de este laboratorio y de los límites de lo que debe conservarse.

Prepara el informe y observa la identidad de lectura

En este paso, crearás el almacén de informes y observarás la falta inicial de acceso de una identidad de lectura válida e independiente.

La identidad predeterminada de la CLI gestiona la infraestructura. El perfil reader suministrado pertenece al usuario IAM independiente report-reader; su acceso no se toma prestado del operador. Crear almacenamiento no autoriza automáticamente a ese usuario. La selección del perfil cambia la identidad que firma una solicitud de AWS, no el recurso en sí.

Crea un almacén de informes en la configuración raíz preparada:

cd /home/labex/project/reader-access
cat > main.tf <<'EOF'
resource "aws_s3_bucket" "reports" {
  bucket = "terraform-reader-reports"
}
resource "aws_s3_object" "report" {
  bucket       = aws_s3_bucket.reports.id
  key          = "reports/current.csv"
  content      = "orders,12\n"
  content_type = "text/csv"
}
EOF
terraform init
terraform plan

Deben añadirse dos recursos. Aplica los cambios e introduce yes:

terraform apply

Intenta leer el informe con la identidad de lectura independiente. || true permite que este bloque de comandos continúe tras el fallo intencionado; no convierte la solicitud en una lectura correcta.

aws s3api \
  get-object \
  --profile reader \
  --bucket terraform-reader-reports \
  --key reports/current.csv \
  reader-report.csv || true

Debes ver AccessDenied. La identidad es válida, pero no tiene ningún permiso coincidente. Mantén privado el objeto independiente team-reference-reports/keep.txt durante todo el laboratorio. AWS View usa la identidad del operador para inspeccionar el almacenamiento; una vista previa de un objeto allí no demuestra que la identidad de lectura pueda acceder a él. AWS View después del despliegue: el almacenamiento gestionado aparece junto al informe de referencia que se conserva.

Concede únicamente la lectura del informe previsto

En este paso, usarás referencias a recursos para crear una política de identidad IAM y verificar tanto las lecturas permitidas como las prohibidas.

Una política de identidad en línea se adjunta directamente a un usuario y le concede acciones. s3:GetObject se aplica a un ARN de objeto, no a un ARN de bucket. jsonencode convierte un valor de Terraform en JSON válido, por lo que puedes usar referencias normales a recursos de HCL en lugar de construir manualmente una cadena JSON con caracteres escapados.

Crea policy.tf. El nombre de la identidad de lectura forma parte del entorno suministrado; el ARN de destino de la política combina el ARN del bucket creado y la clave del objeto real.

cat > policy.tf <<'EOF'
resource "aws_iam_user_policy" "reader" {
  name = "ReadReport"
  user = "report-reader"
  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [{
      Effect   = "Allow"
      Action   = "s3:GetObject"
      Resource = "${aws_s3_bucket.reports.arn}/${aws_s3_object.report.key}"
    }]
  })
}
EOF
terraform plan

El plan añade una política y conserva el bucket y el informe. Aplícala e introduce yes:

terraform apply

Lee el destino con el mismo perfil de lectura:

aws s3api \
  get-object \
  --profile reader \
  --bucket terraform-reader-reports \
  --key reports/current.csv \
  reader-report.csv
cat reader-report.csv

Debes ver orders,12. Ahora usa esa misma identidad para un objeto privado ajeno:

aws s3api \
  get-object \
  --profile reader \
  --bucket team-reference-reports \
  --key keep.txt \
  unrelated-report.txt || true

Debes ver AccessDenied, sin descargar los datos de referencia. Esta política concede únicamente lecturas del informe; no debe autorizar escrituras ni eliminaciones del informe. Los comodines amplios en acciones o recursos pueden crear acceso no previsto aunque la lectura del destino funcione. La comprobación interpreta la semántica nativa de la política y realiza lecturas reales permitidas y prohibidas; no exige una estructura JSON concreta. Las expresiones equivalentes de cadena o lista y un prefijo limitado a informes pueden satisfacer esta tarea sin conceder acciones nuevas.

Revoca el permiso sin eliminar los datos

En este paso, eliminarás la política mediante Terraform y demostrarás que cambia el acceso mientras el informe se conserva.

Eliminar un bloque de recurso propone eliminar ese recurso gestionado. Elimina únicamente policy.tf, dejando sin cambios la configuración del almacenamiento:

rm policy.tf
terraform plan -out=revoke.tfplan
terraform show revoke.tfplan

Debe destruirse una política sin eliminar el bucket ni el objeto. Aplica ese artefacto guardado:

terraform apply revoke.tfplan

Vuelve a intentar leer el destino con la misma identidad de lectura:

aws s3api \
  get-object \
  --profile reader \
  --bucket terraform-reader-reports \
  --key reports/current.csv \
  after-revoke.csv || true

Debes ver AccessDenied. Revocar un permiso no elimina un archivo local que ya se haya descargado, y la presencia de reader-report.csv no demuestra que una solicitud nueva esté autorizada. Consulta el informe almacenado con la identidad predeterminada del operador:

aws s3api \
  get-object \
  --bucket terraform-reader-reports \
  --key reports/current.csv \
  retained-report.csv
cat retained-report.csv

El informe sigue conteniendo orders,12. Has cambiado el límite de autorización sin modificar los datos. Consulta los elementos de las políticas IAM para conocer la diferencia entre Action y Resource.

Elimina el almacén de informes gestionado

En este paso, limpiarás el almacenamiento después de completar las comprobaciones de acceso y revocación.

Destruye los recursos restantes de esta configuración raíz e introduce yes:

terraform destroy

Se eliminan el bucket y el objeto de informe; la identidad de lectura suministrada y la referencia del equipo pertenecen al entorno preparado y no están en el estado de esta configuración raíz. Inspecciona la correspondencia final y la referencia conservada:

terraform state list
aws s3api \
  list-buckets \
  --query 'Buckets[].Name'
aws s3api \
  head-object \
  --bucket team-reference-reports \
  --key keep.txt \
  --query ContentLength

La lista del estado está vacía y la referencia se conserva. Mantén configuradas ambas identidades preparadas de la CLI hasta que termine la comprobación final.

Resumen

Has usado jsonencode y referencias a recursos para definir una política de identidad IAM, probado solicitudes permitidas y prohibidas con una identidad de lectura independiente, revocado el permiso sin eliminar los datos del informe y eliminado únicamente el almacén gestionado.