Auditar los permisos de Microsoft 365 en una tarde
Auditoría básica de permisos de Microsoft 365 en unas horas: administradores, MFA, cuentas sin uso, consentimientos OAuth y reenvíos, con PowerShell de solo lectura.
- microsoft-365
- entra-id
- auditoria
- powershell
- iam
Se puede hacer una auditoría básica de permisos de Microsoft 365 en una tarde si se limita a lo que más riesgo concentra: administradores, invitados externos, cuentas sin MFA o sin uso, aplicaciones con consentimiento y reenvíos de correo. No sustituye a una auditoría completa, pero encuentra los fallos que usan los atacantes y que casi siempre se acumulan sin que nadie los mire.
Necesitas un rol de lectura (Global Reader o Security Reader) y el módulo de PowerShell de Microsoft Graph. Todo lo que sigue es de solo lectura.
1. Administradores (30 minutos)
Lista quién tiene roles privilegiados y por qué. Más de cinco administradores globales ya es una señal de alerta, y cada uno debería poder justificarse. El detalle de qué roles usar en su lugar está en mínimo privilegio en Entra ID.
Connect-MgGraph -Scopes "RoleManagement.Read.Directory","User.Read.All"
Get-MgDirectoryRole -All | ForEach-Object {
$rol = $_.DisplayName
Get-MgDirectoryRoleMember -DirectoryRoleId $_.Id |
ForEach-Object { [pscustomobject]@{ Rol = $rol; Usuario = $_.AdditionalProperties.userPrincipalName } }
}
2. MFA (30 minutos)
El informe de registro de métodos de autenticación muestra quién no tiene MFA y quién usa métodos débiles.
Connect-MgGraph -Scopes "AuditLog.Read.All"
Get-MgReportAuthenticationMethodUserRegistrationDetail -All |
Where-Object { -not $_.IsMfaRegistered } |
Select-Object UserPrincipalName, IsAdmin
Primero los administradores sin MFA, después finanzas y dirección. Para qué métodos exigir, mira MFA resistente a phishing.
3. Cuentas sin uso e invitados (30 minutos)
Connect-MgGraph -Scopes "User.Read.All","AuditLog.Read.All"
Get-MgUser -All -Property DisplayName,UserPrincipalName,UserType,SignInActivity,AccountEnabled |
Where-Object { $_.AccountEnabled -and $_.SignInActivity.LastSignInDateTime -lt (Get-Date).AddDays(-90) } |
Select-Object UserPrincipalName, UserType, @{n='UltimoAcceso';e={$_.SignInActivity.LastSignInDateTime}}
Cuenta habilitada sin acceso en 90 días: pregunta a su responsable. Los invitados externos (UserType = Guest) merecen revisión aparte: ¿siguen colaborando? ¿a qué equipos tienen acceso? Este mismo problema, en versión de ciclo de vida, es el de las cuentas huérfanas. Ten en cuenta que SignInActivity requiere licencia Entra ID P1.
4. Aplicaciones con consentimiento (30 minutos)
Las aplicaciones OAuth con permisos como Mail.Read o Files.Read.All siguen teniendo acceso aunque cambies la contraseña.
Connect-MgGraph -Scopes "Directory.Read.All"
Get-MgOauth2PermissionGrant -All |
Select-Object ClientId, ConsentType, Scope
Busca aplicaciones desconocidas con permisos amplios y consentimiento de usuario. Revoca lo que nadie reconozca y restringe quién puede dar consentimiento.
5. Reenvíos de correo (20 minutos)
Connect-ExchangeOnline
Get-Mailbox -ResultSize Unlimited |
Where-Object { $_.ForwardingSmtpAddress -or $_.ForwardingAddress } |
Select-Object UserPrincipalName, ForwardingSmtpAddress, ForwardingAddress
Un reenvío a una dirección externa que nadie recuerda crear es una de las señales de BEC. Revisa también las reglas de bandeja que reenvían o mueven correo.
6. Políticas de acceso (20 minutos)
Comprueba que existen las políticas base y que ninguna cuenta está excluida sin motivo. Lista y orden en acceso condicional: las políticas base. Mira también la puntuación de seguridad (Secure Score) en el portal de Defender, que sirve como lista de tareas priorizada.
Qué hacer con lo que encuentres
- Anota cada hallazgo con responsable y fecha, en una hoja.
- Arregla primero lo que sea de riesgo alto y esfuerzo bajo: MFA a administradores, bajas de cuentas, reenvíos desconocidos.
- Repite cada trimestre. La utilidad de una auditoría está en la comparación entre fechas.
Preguntas frecuentes
¿Cada cuánto conviene revisar los permisos?
Como mínimo cada trimestre, y siempre tras cambios grandes (fusiones, salidas de personal clave, migraciones).
¿Necesito licencias especiales?
Para lo básico no. La actividad de inicio de sesión requiere Entra ID P1, y las revisiones de acceso automáticas, Entra ID Governance.
¿Es seguro ejecutar estos comandos?
Son de solo lectura y no modifican nada, pero pruébalos primero con una cuenta de lectura y revisa el alcance de los permisos que concedes a Graph.