AWS IAM explicado:
políticas, roles y los errores que abren un bucket al mundo
Seguridad en la nube | unfantasmaenelsistema.com
Casi todas las brechas graves en la nube que llegan a la prensa tienen la misma raíz: no un fallo de AWS, sino una configuración de permisos hecha con prisa. Un rol de confianza demasiado abierto, una política con un comodín de más, una clave de acceso olvidada dentro de un repositorio. IAM (Identity and Access Management) es el servicio que decide quién puede hacer qué sobre cada recurso de una cuenta, y entenderlo bien es la diferencia entre una infraestructura razonablemente sólida y un incidente esperando a ocurrir.
Este artículo explica el modelo de IAM desde los cimientos: las cuatro piezas básicas, cómo se escribe una política, cómo se evalúa una petición cuando hay reglas que se contradicen, y el catálogo de errores clásicos que aparecen una y otra vez en las auditorías. El enfoque es defensivo: cómo revisar tu propia cuenta y cerrar los huecos antes de que lo haga otro.
Qué aprenderás en este artículo
La diferencia entre usuarios, grupos, roles y políticas, y cuándo usar cada uno · Cómo se escribe una política IAM y qué significan Effect, Action, Resource y Condition · El orden real en que AWS evalúa una petición: deny explícito, SCP, boundary, allow · Por qué un rol de instancia convierte un SSRF en un robo de credenciales · Los errores de configuración más habituales y las herramientas para detectarlos en tu cuenta
1. Las cuatro piezas: usuarios, grupos, roles y políticas
IAM se construye sobre cuatro objetos. Confundir sus papeles es el primer error, así que conviene fijarlos antes de seguir.
1.1 Identidades: usuarios, grupos y roles
- Usuario IAM: una identidad permanente con credenciales de larga vida (contraseña para la consola, claves de acceso para la API). Pensado para personas o sistemas fuera de AWS que necesitan un acceso estable
- Grupo: un contenedor de usuarios al que se asignan políticas. No es una identidad — nada «asume» un grupo — solo una forma cómoda de dar los mismos permisos a varias personas
- Rol: una identidad sin credenciales fijas que cualquier principal autorizado puede asumir temporalmente. Al asumirlo, AWS entrega credenciales que caducan (de 15 minutos a 12 horas). Es el mecanismo recomendado para servicios, para acceso entre cuentas y, con IAM Identity Center, también para personas
1.2 Políticas: el documento que concede o niega permisos
Una política es un documento JSON con una lista de permisos. Por sí sola no hace nada: hay que adjuntarla a una identidad o a un recurso. Distinguimos dos grandes familias:
- Basadas en identidad (identity-based): se adjuntan a un usuario, grupo o rol y dicen qué puede hacer esa identidad. Pueden ser gestionadas por AWS, gestionadas por el cliente, o inline (incrustadas en una sola identidad)
- Basadas en recurso (resource-based): se adjuntan directamente al recurso (un bucket S3, una cola SQS, una función Lambda) y dicen quién puede actuar sobre él. Incluyen un elemento Principal que las de identidad no tienen
2. Anatomía de una política IAM
Toda política sigue la misma estructura: una o más sentencias (Statement), y cada sentencia combina un efecto, unas acciones, unos recursos y, opcionalmente, unas condiciones.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "LecturaSoloDeUnBucket",
"Effect": "Allow",
"Action": ["s3:GetObject", "s3:ListBucket"],
"Resource": [
"arn:aws:s3:::mi-bucket-informes",
"arn:aws:s3:::mi-bucket-informes/*"
],
"Condition": {
"IpAddress": { "aws:SourceIp": "203.0.113.0/24" }
}
}
]
}- Effect: `Allow` o `Deny`. No hay término medio
- Action: operaciones del API, con el formato `servicio:Operación`. Admite comodines (`s3:Get*`), pero cada comodín de más amplía la superficie
- Resource: el ARN o ARNs sobre los que aplica. `»*»` significa «cualquier recurso» y es la fuente número uno de sobre-permisos
- Condition: restricciones adicionales (IP de origen, MFA presente, etiqueta del recurso, hora del día). Es la herramienta más infrautilizada de IAM y la que más ayuda al mínimo privilegio
El comodín doble es una alarma
Una sentencia con `»Action»: «*»` y `»Resource»: «*»` en Effect Allow concede control total de la cuenta · La política gestionada `AdministratorAccess` es exactamente eso: úsala solo en identidades que de verdad lo necesiten y protégelas con MFA · Busca también `iam:*`, `sts:AssumeRole` sin restricción de recurso y `s3:*` sobre `*`: son rutas de escalada de privilegios
3. Cómo evalúa AWS una petición
Cuando una identidad hace una llamada al API, AWS reúne todas las políticas que aplican y las resuelve en un orden fijo. La regla mental corta es: un deny explícito siempre gana, y sin un allow explícito la respuesta es no.
| Paso | Qué se evalúa | Efecto si coincide |
|---|---|---|
| 1 | ¿Hay un Deny explícito en cualquier política aplicable? | Denegado, fin de la evaluación |
| 2 | SCP (Service Control Policy) de AWS Organizations | Si la acción no está permitida por la SCP, denegado |
| 3 | Resource-based policy | Un Allow aquí puede bastar por sí solo (según el servicio) |
| 4 | Permissions boundary de la identidad | Limita el máximo: si no lo permite, denegado |
| 5 | Session policy (si se asumió un rol con política de sesión) | Acota aún más la sesión |
| 6 | Identity-based policy | Necesita un Allow explícito aquí (salvo que ya lo diera el paso 3) |
| 7 | Ningún Allow en ninguna parte | Denegado por defecto (deny implícito) |
Las SCP y las permissions boundaries no conceden permisos: solo ponen un techo. Una SCP que permite `s3:*` no le da acceso a S3 a nadie; simplemente no se lo quita. El acceso real sigue viniendo de una política de identidad o de recurso.
4. El rol de instancia y por qué el SSRF lo pone en peligro
Cuando una máquina EC2, un contenedor ECS o una función Lambda necesita hablar con otros servicios de AWS, no se le ponen claves de acceso: se le asigna un rol. El entorno de ejecución obtiene credenciales temporales de ese rol a través del servicio de metadatos de la instancia (IMDS), accesible desde dentro en la dirección `169.254.169.254`.
El problema aparece cuando una aplicación en esa máquina tiene una vulnerabilidad de tipo SSRF (Server-Side Request Forgery): el atacante consigue que el servidor haga una petición a la URL que él elige. Si esa URL es la del endpoint de metadatos, la respuesta contiene las credenciales temporales del rol de instancia, y a partir de ahí el atacante actúa con los permisos de ese rol desde fuera. Es exactamente la mecánica de la brecha de Capital One en 2019. Lo cubrimos a fondo en nuestro artículo SSRF: cómo una petición del servidor acaba leyendo las credenciales de tu nube.
- Exige IMDSv2 (orientado a sesión con token) en todas las instancias: obliga a un PUT previo con cabecera propia, lo que rompe la mayoría de SSRF ingenuos
- Reduce el hop limit de IMDS a 1 para que un contenedor no alcance el endpoint del nodo
- Da al rol de instancia solo los permisos que la aplicación usa de verdad, para que robar sus credenciales sirva de poco
5. Los errores que abren un bucket al mundo
Estos patrones se repiten en auditoría tras auditoría. Ninguno es exótico; todos se detectan con las herramientas de la sección siguiente.
| Error | Por qué es peligroso | Mitigación |
|---|---|---|
| Políticas con `»Action»: «*»` / `»Resource»: «*»` | Cualquier compromiso de esa identidad es un compromiso total de la cuenta | Generar políticas a partir del uso real (Access Analyzer policy generation); revisar comodines |
| Claves de acceso de larga vida en código o variables de entorno | Quedan en el historial de git, en logs, en imágenes de contenedor; no caducan | Roles con credenciales temporales; detección de secretos en CI; rotación y desactivación |
| Buckets S3 públicos por ACL o por policy | Exposición de datos sin autenticación, indexable y rastreable | Activar Block Public Access a nivel de cuenta; revisar con Access Analyzer for S3 |
| Rol con `sts:AssumeRole` y `Principal: «*»` en la trust policy | Cualquier cuenta de AWS del mundo puede asumir el rol | Fijar Principal a ARNs concretos; añadir Condition con `sts:ExternalId` para terceros |
| Usuario root con uso diario y sin MFA | El root ignora casi todas las restricciones y no se puede limitar con políticas | MFA hardware en root, guardar credenciales bajo llave, no usarlo salvo tareas que lo exijan |
| Permisos concedidos «temporalmente» que nadie retira | El privilegio se acumula; nadie sabe ya por qué una identidad puede hacer algo | Revisar el último acceso (IAM last accessed), caducar accesos, revisión periódica |
6. Auditar tu propia cuenta
AWS y el ecosistema open source ofrecen herramientas que revisan una cuenta completa en minutos. Todas se ejecutan con credenciales de solo lectura sobre tu propia infraestructura.
| Herramienta | Qué hace | Coste |
|---|---|---|
| IAM Access Analyzer | Detecta recursos accesibles desde fuera de tu zona de confianza y genera políticas de mínimo privilegio a partir de CloudTrail | Gratuito |
| IAM last accessed / Credential Report | Muestra qué permisos y credenciales se usan de verdad y cuáles llevan meses inertes | Gratuito |
| Prowler | Cientos de comprobaciones contra CIS Benchmark, PCI, RGPD; informe por severidad | Open source |
| ScoutSuite | Auditoría multi-nube de solo lectura con informe HTML navegable | Open source |
| pmapper / Cloudsplaining | Analizan rutas de escalada de privilegios entre identidades IAM | Open source |
# Informe de credenciales de toda la cuenta (usuarios, claves, MFA, ultimo uso) aws iam generate-credential-report aws iam get-credential-report --query Content --output text | base64 -d > report.csv # Cuando se uso por ultima vez cada servicio para un rol concreto aws iam generate-service-last-accessed-details --arn arn:aws:iam::111122223333:role/mi-rol # Auditoria completa de solo lectura con Prowler prowler aws --profile auditoria --output-formats html csv
Uso solo sobre infraestructura propia y con autorización
Ejecutar herramientas de auditoría o enumeración de IAM contra cuentas de AWS que no son tuyas y sin autorización escrita del titular es un acceso ilícito a un sistema informático · En España es aplicable el Código Penal: art. 197 bis (acceso no autorizado), art. 197 ter (facilitación de medios) y art. 264 y siguientes (daños informáticos) · Practica con tu propia cuenta, con una cuenta de laboratorio creada para ello, o con entornos formativos diseñados a tal fin (por ejemplo flaws.cloud, CloudGoat en tu propia cuenta)
7. Mínimo privilegio en la práctica
«Mínimo privilegio» suena bien y se aplica mal. En la práctica es un proceso, no un estado:
- Empieza permisivo solo en desarrollo, registra el uso real con CloudTrail, y usa Access Analyzer para generar la política ajustada antes de pasar a producción
- Prefiere roles a usuarios, y credenciales temporales a claves de larga vida, siempre que se pueda
- Usa Condition para acotar: `aws:MultiFactorAuthPresent`, `aws:SourceIp`, `aws:PrincipalTag`, `s3:prefix`. Una política con condiciones vale por diez sin ellas
- Separa entornos en cuentas distintas bajo AWS Organizations y pon las barreras duras (regiones permitidas, prohibir desactivar CloudTrail) como SCP
- Revisa trimestralmente: informe de credenciales, accesos sin usar, políticas con comodines, trust policies abiertas
Referencias
docs.aws.amazon.com/IAM — Guía oficial de IAM y referencia de políticas · AWS IAM Access Analyzer — Documentación de análisis de acceso externo y generación de políticas · github.com/prowler-cloud/prowler y github.com/nccgroup/ScoutSuite — Auditoría open source · flaws.cloud y flaws2.cloud — Retos formativos gratuitos sobre errores de configuración en AWS · Nuestro artículo sobre SSRF y metadatos de la nube, para el vínculo con los roles de instancia
Conclusión
IAM no es complicado por su tecnología, sino por su acumulación: cada permiso que se concede y no se retira, cada comodín que se añade «por si acaso», cada clave que se copia a un sitio nuevo. El modelo en sí es sencillo — identidades, políticas, un orden de evaluación fijo donde el deny gana — y cabe en una tarde de lectura.
La disciplina que marca la diferencia es aburrida y constante: roles en vez de claves, condiciones en las políticas, Block Public Access activado de serie, y una revisión periódica que caduque lo que ya nadie usa. Las herramientas de auditoría son gratuitas o open source y tardan minutos. El bucket abierto al mundo casi nunca es un ataque sofisticado: es una casilla que nadie volvió a mirar.
unfantasmaenelsistema.com | Seguridad, sistemas y todo lo que no debería funcionar (pero funciona)

