Saltar al contenido

AWS IAM explicado: políticas, roles y los errores que abren un bucket al mundo

    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.

    PasoQué se evalúaEfecto si coincide
    1¿Hay un Deny explícito en cualquier política aplicable?Denegado, fin de la evaluación
    2SCP (Service Control Policy) de AWS OrganizationsSi la acción no está permitida por la SCP, denegado
    3Resource-based policyUn Allow aquí puede bastar por sí solo (según el servicio)
    4Permissions boundary de la identidadLimita el máximo: si no lo permite, denegado
    5Session policy (si se asumió un rol con política de sesión)Acota aún más la sesión
    6Identity-based policyNecesita un Allow explícito aquí (salvo que ya lo diera el paso 3)
    7Ningún Allow en ninguna parteDenegado 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.

    ErrorPor qué es peligrosoMitigación
    Políticas con `»Action»: «*»` / `»Resource»: «*»`Cualquier compromiso de esa identidad es un compromiso total de la cuentaGenerar 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 entornoQuedan en el historial de git, en logs, en imágenes de contenedor; no caducanRoles con credenciales temporales; detección de secretos en CI; rotación y desactivación
    Buckets S3 públicos por ACL o por policyExposición de datos sin autenticación, indexable y rastreableActivar Block Public Access a nivel de cuenta; revisar con Access Analyzer for S3
    Rol con `sts:AssumeRole` y `Principal: «*»` en la trust policyCualquier cuenta de AWS del mundo puede asumir el rolFijar Principal a ARNs concretos; añadir Condition con `sts:ExternalId` para terceros
    Usuario root con uso diario y sin MFAEl root ignora casi todas las restricciones y no se puede limitar con políticasMFA hardware en root, guardar credenciales bajo llave, no usarlo salvo tareas que lo exijan
    Permisos concedidos «temporalmente» que nadie retiraEl privilegio se acumula; nadie sabe ya por qué una identidad puede hacer algoRevisar 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.

    HerramientaQué haceCoste
    IAM Access AnalyzerDetecta recursos accesibles desde fuera de tu zona de confianza y genera políticas de mínimo privilegio a partir de CloudTrailGratuito
    IAM last accessed / Credential ReportMuestra qué permisos y credenciales se usan de verdad y cuáles llevan meses inertesGratuito
    ProwlerCientos de comprobaciones contra CIS Benchmark, PCI, RGPD; informe por severidadOpen source
    ScoutSuiteAuditoría multi-nube de solo lectura con informe HTML navegableOpen source
    pmapper / CloudsplainingAnalizan rutas de escalada de privilegios entre identidades IAMOpen 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)

    Resumen de privacidad

    Esta web utiliza cookies para que podamos ofrecerte la mejor experiencia de usuario posible. La información de las cookies se almacena en tu navegador y realiza funciones tales como reconocerte cuando vuelves a nuestra web o ayudar a nuestro equipo a comprender qué secciones de la web encuentras más interesantes y útiles.