Entra ID (Azure AD):
el directorio de la nube y sus rutas de escalada
Seguridad en la nube / Identidad | unfantasmaenelsistema.com
En el artículo sobre el modelo de seguridad de Active Directory vimos que un dominio no cae por un exploit, sino por una cadena de permisos que nadie había mapeado. Entra ID —el servicio que Microsoft llamaba Azure AD hasta 2023— es el equivalente en la nube, y hereda ese mismo problema con una vuelta de tuerca: aquí no hay un controlador de dominio en tu sala de servidores, sino una API pública (Microsoft Graph) a la que se puede llegar desde cualquier navegador del mundo con las credenciales adecuadas.
Mucha gente asume que Entra ID es «Active Directory pero alojado en Azure». No lo es. No hay Kerberos, no hay LDAP clásico, no hay GPO. El modelo de identidad, de permisos y de ataque es distinto, y confundir uno con otro lleva a puntos ciegos serios. Este artículo explica en qué se parecen y en qué no, cuáles son los tres planos de permisos que hay que vigilar, y qué herramientas defensivas usar para auditar tu propio tenant.
Qué aprenderás en este artículo
Qué es un tenant de Entra ID y por qué su superficie de ataque es una API pública · Los objetos clave: usuarios, grupos, aplicaciones, service principals y managed identities · Los tres planos de permisos que se solapan: roles de Entra, RBAC de Azure y permisos de Graph · Qué es el consentimiento de aplicaciones y cómo se abusa con el illicit consent grant · Los huecos habituales de Conditional Access y de la sincronización híbrida con Entra Connect · Herramientas de auditoría defensiva para tu propio tenant: Secure Score, ScubaGear, AzureHound
1. Qué es Entra ID y en qué NO se parece a AD on-prem
Un tenant de Entra ID es una instancia del directorio dedicada a una organización, creada automáticamente en cuanto alguien contrata Microsoft 365 o Azure. Contiene los usuarios, los grupos, las aplicaciones registradas y las políticas de acceso. Todo se administra y se consulta a través de Microsoft Graph, una API REST accesible en graph.microsoft.com, y la autenticación se hace con OAuth 2.0 y OpenID Connect, emitiendo tokens JWT de acceso.
Esa es la diferencia de fondo. En AD on-prem, para atacar el directorio hay que estar dentro de la red y hablar con un controlador de dominio. En Entra ID, la superficie de autenticación (login.microsoftonline.com) y la de administración (Graph) están en internet por diseño. La primera línea de defensa deja de ser el perímetro de red y pasa a ser la identidad: MFA, Conditional Access y el principio de mínimo privilegio sobre los roles.
| Primitiva on-prem (AD DS) | Equivalente aproximado en Entra ID | Matiz importante |
|---|---|---|
| Bosque / dominio | Tenant | Un tenant no se «anida»; las relaciones entre tenants son B2B / B2C |
| Controlador de dominio (LDAP/Kerberos) | Microsoft Graph (REST) + tokens OAuth2/OIDC | No hay Kerberos ni LDAP salvo con Entra Domain Services aparte |
| Cuenta de equipo unida al dominio | Dispositivo registrado o unido a Entra (Entra joined) | El «join» da atributos y cumplimiento, no una cuenta con contraseña rotada igual |
| Grupo de seguridad | Grupo de seguridad o grupo de Microsoft 365 | Los grupos pueden ser dinámicos (por reglas de atributo) y asignables a roles |
| Domain Admins / Enterprise Admins | Global Administrator | Rol de mayor privilegio del tenant; debe haber muy pocos y con MFA fuerte |
| GPO | Conditional Access + políticas de Intune | No es lo mismo: CA decide si dejas entrar; Intune configura el dispositivo |
| Cuenta de servicio (SPN) | Service principal (con secreto o certificado) | Sus credenciales caducan; una app con permisos de Graph es un objetivo de alto valor |
| Relación de confianza entre dominios | Federación / sincronización con Entra Connect | El servidor de sincronización on-prem es un puente crítico en ambos sentidos |
2. Los objetos: identidades humanas y no humanas
El grafo de Entra ID tiene menos tipos de nodo que el de AD, pero los que hay son densos en permisos. Conviene distinguirlos bien porque las rutas de escalada casi siempre pasan por las identidades no humanas, que son las que menos se revisan.
- Usuarios: cuentas de personas (miembros del tenant) o invitados B2B de otra organización. Los invitados suelen tener más permisos de lectura sobre el directorio de los que la gente espera
- Grupos: de seguridad o de Microsoft 365. Los grupos asignables a roles (isAssignableToRole) son especialmente sensibles: quien pueda modificar su pertenencia hereda el rol
- App registrations: la definición de una aplicación (su identidad, sus permisos solicitados, sus URIs de redirección). Vive en el tenant donde se creó
- Service principals: la instancia local de una aplicación dentro de tu tenant, con sus permisos concedidos y sus credenciales (secretos de cliente o certificados). Es el objeto que de verdad «actúa»
- Managed identities: un service principal gestionado por Azure y ligado a un recurso (una VM, una Function). Azure rota sus credenciales; el riesgo es qué permisos se le han dado y quién puede ejecutar código en ese recurso
El patrón de escalada más común
Comprometer un recurso de Azure (una VM, un runner de CI) que tiene una managed identity o un service principal con permisos de Graph altos (por ejemplo, poder añadir credenciales a otras apps o modificar grupos). Desde ahí ya no importa la contraseña de ningún humano: se opera como la aplicación. Por eso el inventario de service principals y sus permisos es una tarea defensiva de primer nivel.
3. Tres planos de permisos que se solapan
Esta es la parte que más cuesta a quien viene de on-prem. En Entra ID / Azure conviven tres sistemas de autorización distintos, con administradores distintos, y un fallo en cualquiera de ellos puede ser suficiente:
| Plano | Qué controla | Ejemplos de roles / permisos | Quién lo suele gestionar |
|---|---|---|---|
| Roles de Entra ID | Administración del propio directorio: usuarios, grupos, apps, CA | Global Administrator, Privileged Role Administrator, Application Administrator, User Administrator | Equipo de identidad / IT |
| Azure RBAC | Acceso a recursos de Azure: suscripciones, grupos de recursos, VMs, almacenamiento | Owner, Contributor, User Access Administrator sobre un scope | Equipo de cloud / plataforma |
| Permisos de Microsoft Graph | Qué puede hacer una aplicación contra el directorio y M365 | Directory.ReadWrite.All, RoleManagement.ReadWrite.Directory, Mail.Read (application permissions) | Se conceden por consentimiento, a veces sin control central |
Los cruces peligrosos entre planos son conocidos. User Access Administrator o el permiso de elevación del Global Administrator permiten saltar del plano de Entra al plano de Azure RBAC sobre todas las suscripciones. Un service principal con RoleManagement.ReadWrite.Directory en Graph puede autoasignarse el rol de Global Administrator. Y Application Administrator o el rol propietario sobre una app permite añadirle una credencial nueva y autenticarse como esa app, heredando todo lo que ella tenga concedido. Ninguno de estos pasos es un exploit: son permisos funcionando como están documentados.
4. El consentimiento de aplicaciones y el «illicit consent grant»
Cuando una aplicación de terceros quiere leer tu correo o tu calendario, te redirige a una pantalla de Microsoft que pide tu consentimiento para unos permisos concretos (scopes). Si aceptas, se crea o se actualiza un objeto de concesión de permisos (oauth2PermissionGrant o appRoleAssignment) y la app recibe tokens para actuar en tu nombre —o, si son permisos de aplicación, en nombre de toda la organización.
El illicit consent grant es el abuso de ese mecanismo: en lugar de robar una contraseña, el atacante monta una aplicación con un nombre plausible y envía a la víctima un enlace de consentimiento legítimo de Microsoft. La víctima hace clic, aprueba «leer tu correo y enviar en tu nombre», y el atacante obtiene acceso persistente que sobrevive al cambio de contraseña y, según los scopes, al MFA, porque el token de refresco ya está emitido. Es una técnica de phishing que no toca la credencial.
Defensas concretas contra el abuso de consentimiento
Restringir el consentimiento de usuario: que un usuario normal solo pueda consentir apps de publicadores verificados y permisos de bajo impacto, o directamente nada («do not allow user consent»). · Activar el flujo de **solicitud de aprobación de administrador**, para que las peticiones legítimas pasen por una cola revisable en vez de bloquearse a ciegas. · Revisar periódicamente las aplicaciones empresariales con permisos altos (Mail.*, Files.*, Directory.*), quién las consintió y cuándo; retirar las que no se reconozcan. · Alertar sobre creación de service principals, adición de credenciales a apps y nuevas concesiones de permisos de alto riesgo en los registros de auditoría de Entra.
5. Conditional Access: potente, pero con huecos clásicos
Conditional Access (CA) es el motor de decisión de acceso de Entra ID: un conjunto de políticas del tipo «si el usuario X accede a la aplicación Y desde una condición Z, entonces exige MFA / dispositivo conforme / bloquea». Bien hecho, es la columna vertebral de un despliegue Zero Trust. Mal hecho, da una falsa sensación de cobertura. Los huecos que más se repiten:
| Hueco | Por qué ocurre | Mitigación |
|---|---|---|
| Cuentas o grupos excluidos «temporalmente» | Exclusiones puestas para depurar y nunca revertidas | Auditar exclusiones cada mes; usar solo cuentas rompe-cristales documentadas |
| Protocolos de autenticación heredados (legacy auth) | IMAP/POP/SMTP AUTH no entienden MFA ni CA moderna | Bloquear legacy auth de forma global; hoy ya viene desactivado por defecto en tenants nuevos |
| Cobertura por aplicación en vez de «todas las apps» | Se protege Exchange y Teams pero se olvida una app nueva | Política base que aplique a «All cloud apps» con las excepciones justas |
| Sin control sobre el registro de métodos MFA | Un atacante con la contraseña registra su propio MFA | Política de CA que exija dispositivo conforme o red de confianza para registrar seguridad |
| MFA débil (SMS / llamada) | Vulnerable a SIM swapping y a fatiga de notificaciones | Exigir métodos resistentes a phishing (FIDO2, passkeys, Windows Hello) para roles privilegiados |
| Device code phishing | El flujo de código de dispositivo es legítimo y difícil de distinguir | Política de CA que restrinja el flujo device code a lo estrictamente necesario |
La recomendación de Microsoft es partir de las políticas de seguridad predeterminadas (security defaults) o de las plantillas de CA, y de ahí construir un juego mínimo: MFA para todos, MFA resistente a phishing para administradores, bloqueo de legacy auth, y bloqueo por geografía o riesgo. Enlaza bien con nuestros artículos de passkeys/FIDO2 y de Zero Trust.
6. Sincronización híbrida: el puente que va en los dos sentidos
Muchas organizaciones no son «solo nube»: tienen un AD on-prem y lo sincronizan con Entra ID mediante Entra Connect (antes Azure AD Connect) o el agente ligero Cloud Sync. Ese servidor de sincronización es uno de los activos más críticos del entorno, porque conecta los dos directorios y, según la configuración, puede ser una ruta de ataque en ambas direcciones:
- De on-prem a la nube: el servidor de Entra Connect tiene una cuenta en el tenant con permisos de sincronización de directorio muy amplios. Si se compromete el servidor, se accede a esa cuenta y a lo que puede tocar en Entra
- De la nube a on-prem: si está habilitado el Password Hash Sync, en el servidor residen materiales sensibles relacionados con las credenciales del dominio local; comprometerlo tiene impacto en el AD interno
- Pass-through Authentication y federación (ADFS): introducen sus propios objetivos —los agentes de PTA y, sobre todo, el certificado de firma de tokens de ADFS, cuyo robo permite falsificar tokens (el patrón del incidente Golden SAML / «Solorigate»)
Trata el servidor de sincronización como Tier 0
Mismo nivel de protección que un controlador de dominio: administración solo desde estaciones seguras (PAW), sin navegación ni correo, parcheo prioritario, MFA fuerte en la cuenta de sincronización del tenant, y vigilancia específica de sus inicios de sesión y de cambios en la configuración de sincronización.
7. Auditar tu propio tenant: herramientas defensivas
La buena noticia es que casi todo lo anterior se puede inventariar en modo lectura. Estas son las herramientas que un equipo defensivo debería pasar sobre su tenant de forma periódica:
| Herramienta | Para qué sirve | Notas |
|---|---|---|
| Microsoft Secure Score | Puntuación y recomendaciones priorizadas de identidad y M365 | Integrada en el portal; buen punto de partida y métrica de evolución |
| ScubaGear (CISA) | Comprueba la configuración de M365/Entra contra las líneas base SCuBA | Open source, solo lectura, informe HTML con desviaciones |
| Microsoft Entra recommendations + Identity Secure Score | Roles con exceso de privilegio, apps con secretos caducando, cuentas sin MFA | Nativo del producto |
| AzureHound / BloodHound CE | Grafo de escalada sobre Entra ID y Azure RBAC de tu tenant | Mismo enfoque que BloodHound en AD; ejecutar solo contra directorio propio y con autorización |
| Microsoft Graph PowerShell / az cli | Consultas puntuales de inventario y auditoría | Roles Directory Reader / Global Reader bastan para leer casi todo |
| Monitor / logs de auditoría de Entra + Sign-in logs | Detección continua: consentimientos, cambios de rol, credenciales de app | Exportar a un SIEM (ver nuestro artículo de Wazuh / Sigma) |
Ejemplos de consultas de solo lectura con Microsoft Graph PowerShell para el inventario básico —quién tiene roles privilegiados y qué aplicaciones tienen permisos peligrosos concedidos:
# Requiere: Connect-MgGraph -Scopes 'RoleManagement.Read.Directory','Directory.Read.All','Application.Read.All'
# 1) Miembros de roles de directorio activos (p. ej. Global Administrator)
Get-MgDirectoryRole | ForEach-Object {
$role = $_
Get-MgDirectoryRoleMember -DirectoryRoleId $role.Id |
Select-Object @{n='Rol';e={$role.DisplayName}},
@{n='Miembro';e={$_.AdditionalProperties.userPrincipalName}}
}
# 2) Service principals con permisos de aplicacion de alto impacto en Graph
$graph = Get-MgServicePrincipal -Filter "appId eq '00000003-0000-0000-c000-000000000000'"
Get-MgServicePrincipalAppRoleAssignedTo -ServicePrincipalId $graph.Id |
Select-Object PrincipalDisplayName,
@{n='Permiso';e={($graph.AppRoles | Where-Object Id -eq $_.AppRoleId).Value}}
# 3) Aplicaciones con secretos o certificados a punto de caducar (o ya caducados)
Get-MgApplication -All |
Select-Object DisplayName,
@{n='SecretExp';e={($_.PasswordCredentials.EndDateTime) -join ', '}},
@{n='CertExp';e={($_.KeyCredentials.EndDateTime) -join ', '}}Rutina mínima trimestral
Contar Global Administrators (objetivo: menos de 5, todos con MFA resistente a phishing y sin licencia de correo si es posible) · revisar aplicaciones empresariales con permisos Directory.* / Mail.* / Files.* · listar exclusiones de Conditional Access · comprobar que legacy auth está bloqueado · confirmar que hay cuentas rompe-cristales probadas · pasar ScubaGear y comparar con el informe anterior.
Uso legal y ético
Todo lo descrito aquí es para auditar el directorio de tu propia organización o uno para el que tengas autorización expresa y por escrito, con alcance definido. Enumerar, recolectar el grafo o analizar la configuración de un tenant ajeno —aunque las herramientas «solo lean»— constituye acceso no autorizado. · En España, el acceso no consentido a un sistema de información y el mantenerse en él contra la voluntad de quien tiene derecho a excluirlo están tipificados en el art. 197 bis del Código Penal; la obtención o facilitación de herramientas concebidas para ello, en el art. 197 ter; y los daños u obstaculización de sistemas ajenos, en el art. 264 y siguientes. El tratamiento de datos personales del directorio queda además sujeto al RGPD y la LOPDGDD. · Practica en un tenant de pruebas propio (Microsoft ofrece tenants de desarrollo gratuitos) o en laboratorios pensados para ello. Si auditas tu organización, hazlo con una cuenta de auditoría de solo lectura, autorización interna y una ventana comunicada al equipo de seguridad.
Referencias
Microsoft — Enterprise access model y Securing privileged access (aka.ms/privsec) · Microsoft — Protecting against consent phishing y gobierno del consentimiento de aplicaciones · CISA — Secure Cloud Business Applications (SCuBA) y la herramienta ScubaGear · Microsoft — Conditional Access: plantillas y arquitectura de políticas · MITRE ATT&CK — T1078.004 (Cloud Accounts), T1528 (Steal Application Access Token), T1098.003 (Additional Cloud Roles) · Nuestros artículos sobre el modelo de seguridad de Active Directory, Zero Trust y passkeys / FIDO2
Conclusión
Entra ID no es Active Directory movido a un centro de datos de Microsoft: es un directorio con una API pública, tres planos de permisos que se solapan y un mecanismo de consentimiento que el phishing sabe aprovechar sin tocar una sola contraseña. Los conceptos de AD que sí se conservan —mínimo privilegio, tiering, vigilar las identidades no humanas, tratar el puente híbrido como Tier 0— siguen siendo la guía correcta.
Para un equipo defensivo el trabajo es medible y casi todo de lectura: contar administradores globales, inventariar service principals y sus permisos de Graph, revisar exclusiones de Conditional Access y pasar una línea base como ScubaGear cada trimestre. Igual que en on-prem, la mayoría de las rutas de escalada se cierran quitando un permiso sobrante, no comprando un producto nuevo.
unfantasmaenelsistema.com | Seguridad, sistemas y todo lo que no debería funcionar (pero funciona)

