IAM policies vs resource policies en AWS: cuándo usar cada una (con ejemplos reales)
La diferencia entre identity-based y resource-based policies en AWS, cómo interactúan en el examen SAA-C03 y los 4 patrones que tienes que saber resolver.
Si en el SAA-C03 fallas preguntas de IAM, casi siempre es porque no tienes claro cuándo AWS evalúa una identity-based policy y cuándo una resource-based policy — y sobre todo, qué pasa cuando hay las dos.
Vamos al grano.
Las dos familias
1. Identity-based policies
Se adjuntan a un principal: user, group, role. Responden a "¿qué puede hacer este principal?".
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-bucket/*"
}]
}
2. Resource-based policies
Se adjuntan a un recurso: S3 bucket, SQS queue, SNS topic, KMS key, Lambda function, SecretsManager secret. Responden a "¿quién puede hacer qué sobre este recurso?".
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": { "AWS": "arn:aws:iam::111111111111:root" },
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-bucket/*"
}]
}
Fíjate en "Principal": esa clave solo existe en resource-based policies. Si ves Principal en una pregunta del examen, es resource-based.
Qué recursos soportan resource-based policies
No todos. Memoriza estos porque caen:
- S3 (bucket policies + ACLs legacy)
- SQS, SNS
- Lambda
- KMS (key policies — obligatorias, no opcionales)
- SecretsManager, SSM Parameter Store (Advanced)
- API Gateway (resource policies)
- ECR
- Glacier vault
EC2, RDS, DynamoDB (en general), EBS, EFS — no tienen resource-based policies tradicionales. Controlas el acceso vía IAM + security groups + VPC endpoints.
La regla que decide todo
Cuando un principal accede a un recurso en la misma cuenta:
Si identity-based o resource-based permite la acción, se permite (salvo Deny explícito o SCP).
Cuando es cross-account:
Deben ambas políticas permitirlo. Identity del usuario en cuenta A + resource policy del recurso en cuenta B.
Esta es la trampa del examen. Una pregunta te dice "Bob en cuenta A tiene s3:GetObject sobre bucket en cuenta B, pero el bucket no menciona cuenta A" — la respuesta es que no puede acceder, porque cross-account exige las dos.
Los 4 patrones del SAA-C03
Patrón 1: Cross-account S3 access
- Bucket en cuenta B.
- Role en cuenta A que necesita leer.
- Solución: bucket policy en B que permite a
arn:aws:iam::A:role/ReaderRole+ identity policy en A cons3:GetObject.
Patrón 2: Lambda invocado por S3 (mismo account)
- S3 event → Lambda.
- Solución: resource-based policy en la Lambda permite a
s3.amazonaws.comconSourceArndel bucket. No se usa identity-based para esto — S3 no asume un role, invoca directamente vía servicio.
Patrón 3: Cross-account KMS
- Datos cifrados con KMS key en cuenta B, leídos desde cuenta A.
- Solución: key policy de B permite
kms:Decryptal role de A Y role de A tienekms:Decrypten su identity policy. - Si key policy no lo permite, ni siquiera el root de A puede descifrar. Las key policies mandan sobre IAM.
Patrón 4: Permission boundaries
No es resource-based, pero cae en la misma familia de preguntas. Un permission boundary en una identity-based policy limita lo que un role puede hacer, aunque su policy diga Allow *. Intersección, no unión.
Debugging rápido en el examen
- ¿La pregunta habla de dos cuentas? → Cross-account: las dos policies deben permitirlo.
- ¿Hay un
Denyexplícito en cualquier sitio (SCP, boundary, policy)? → Deniega, fin. - ¿El recurso es S3/SQS/SNS/Lambda/KMS? → Revisa resource policy además de IAM.
- ¿El acceso es desde un servicio (S3 → Lambda, API Gateway → Lambda)? → Casi siempre resource policy con
Principal: service.amazonaws.com.
Lectura adicional
Si quieres practicar estos 4 patrones con preguntas generadas sobre tus errores reales (no un banco estático), prueba Maestring gratis.