Vicen Moreno

Pro Googler

Follow me on GitHub

Azure AD PIM - Administración de accesos privilegiados Just-In-Time

Cuando los administradores no deberían ser administradores todo el tiempo

El incidente

Un administrador con cuenta comprometida. El atacante tenía acceso Global Admin permanente. Daño masivo en 20 minutos.

Después de ese incidente, implementamos Privileged Identity Management (PIM).

El problema con permisos permanentes

Escenario típico:

Juan = Global Administrator (permanente)

Juan 99% del tiempo hace tareas normales (email, docs). Pero tiene privilegios de dios 24/7.

Si su cuenta se compromete:

  • Atacante tiene Global Admin inmediatamente
  • Puede borrar todo
  • Puede crear backdoors
  • Puede extraer datos

Privileged Identity Management (PIM)

PIM implementa Just-In-Time access:

Juan = Eligible for Global Administrator
     ↓ (cuando lo necesita)
     Activa rol por 4 horas
     ↓ (con MFA + justificación)
     Juan = Active Global Administrator (temporal)
     ↓ (después de 4 horas)
     Juan = Eligible (privilegios expirados)

Configuración inicial

1. Habilitar PIM

Azure AD → Privileged Identity Management → Azure AD roles → Get started

Requiere licencia Azure AD Premium P2.

2. Hacer roles “eligible” en lugar de “permanent”

PIM → Azure AD roles → Assignments

Para cada admin:
  1. Remove permanent assignment
  2. Add eligible assignment

Vía PowerShell:

Connect-AzureAD

# Obtener role
$role = Get-AzureADDirectoryRole | Where-Object {$_.DisplayName -eq "Global Administrator"}

# Listar miembros actuales
$members = Get-AzureADDirectoryRoleMember -ObjectId $role.ObjectId

# Convertir a eligible
foreach ($member in $members) {
    # Remover permanent
    Remove-AzureADDirectoryRoleMember -ObjectId $role.ObjectId -MemberId $member.ObjectId

    # Añadir como eligible (requiere Microsoft Graph)
    # Usar Azure Portal o Graph API para esto
}

3. Configurar Role Settings

PIM → Azure AD roles → Settings → Global Administrator → Edit

Activation:

  • Maximum duration: 4 hours
  • Require MFA: Yes
  • Require justification: Yes
  • Require ticket information: Yes (opcional, para control adicional)
  • Require approval: No (para admins confiables) / Yes (para roles muy sensibles)

Assignment:

  • Allow permanent eligible assignment: No
  • Expire eligible assignments after: 6 months (fuerza revisión)

Notification:

  • Send notifications when admins activate: Yes
  • Send to: Security team email

Workflow del admin

Activación de rol

Admin necesita privilegios:

Azure Portal → PIM → My roles → Azure AD roles
→ Global Administrator → Activate

Formulario:
  - Duration: 4 hours (máximo configurado)
  - Justification: "Necesito crear nuevo tenant para proyecto X"
  - MFA challenge
  - Submit

Después de aprobar MFA:

Status: Active
Expires: 4 hours from now

Durante esas 4 horas, el admin tiene privilegios completos.

Vía PowerShell (automatizado)

Para entornos donde admins activan frecuentemente:

# Instalar módulo
Install-Module AzureADPreview

# Conectar
Connect-AzureAD

# Solicitar activación
$roleDefinitionId = (Get-AzureADMSPrivilegedRoleDefinition -ProviderId aadRoles -ResourceId $tenantId | Where-Object {$_.DisplayName -eq "Global Administrator"}).Id

$schedule = New-Object Microsoft.Open.MSGraph.Model.AzureADMSPrivilegedSchedule
$schedule.Type = "Once"
$schedule.StartDateTime = (Get-Date).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.fffZ")
$schedule.endDateTime = (Get-Date).AddHours(4).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.fffZ")

Open-AzureADMSPrivilegedRoleAssignmentRequest `
    -ProviderId 'aadRoles' `
    -ResourceId $tenantId `
    -RoleDefinitionId $roleDefinitionId `
    -SubjectId $userId `
    -Type 'UserAdd' `
    -AssignmentState 'Active' `
    -Schedule $schedule `
    -Reason "Deployment de nueva infraestructura"

Aprobación de activaciones (opcional)

Para roles ultra-sensibles:

PIM → Settings → Global Administrator → Edit
→ Activation → Require approval: Yes
→ Select approvers: [Security team members]

Workflow con aprobación:

1. Admin solicita activación
     ↓
2. Approver recibe notificación email
     ↓
3. Approver revisa en: PIM → Approve requests
     ↓
4. Si aprueba → Admin tiene privilegios
5. Si niega → Admin no puede activar

Access Reviews

Revisión periódica de quién tiene acceso:

PIM → Azure AD roles → Access reviews → New

Review name: Quarterly Global Admin Review
Start date: 2024-01-01
Frequency: Quarterly
Duration: 14 days
Reviewers: Self-review + Manager approval

Cada trimestre, los admins deben justificar por qué siguen necesitando el rol.

Alertas de seguridad

PIM genera alertas automáticas:

Alerta: “Too many Global Administrators”

Trigger: >5 Global Admins activos
Action: Revisar y reducir

Alerta: “Roles are being assigned outside PIM”

Trigger: Alguien asignó rol permanente directamente
Action: Investigar quién y por qué

Alerta: “Potential stale accounts”

Trigger: Admin eligible que no ha activado en 90+ días
Action: Remover acceso innecesario

Configurar alertas:

PIM → Azure AD roles → Alerts → Alert settings

Monitoreo y auditoría

Ver activaciones históricas:

PIM → Azure AD roles → Resource audit

Filtrar por:
  - Action: Activate
  - Role: Global Administrator
  - Time range: Last 30 days

Query en Azure Monitor:

AuditLogs
| where OperationName == "Add member to role completed (PIM activation)"
| where TargetResources has "Global Administrator"
| project TimeGenerated, Identity, ActivityDisplayName, Result
| order by TimeGenerated desc

Alertas para activaciones sospechosas:

AuditLogs
| where OperationName == "Add member to role completed (PIM activation)"
| where TimeGenerated between (datetime(2024-01-01T22:00:00Z) .. datetime(2024-01-01T06:00:00Z)) // Horario nocturno
| project TimeGenerated, Identity, TargetResources

Alert rule:

Condition: Count > 0
Action: Email security team

Roles específicos recomendados para PIM

No todos los roles necesitan PIM:

Definitivamente PIM:

  • Global Administrator
  • Privileged Role Administrator
  • Security Administrator
  • Exchange Administrator
  • SharePoint Administrator

Considerar PIM:

  • User Administrator
  • Application Administrator
  • Cloud Application Administrator

Probablemente NO necesita PIM:

  • Directory Readers (solo lectura)
  • Guest Inviter
  • Message Center Reader

Break-glass accounts

Crítico: Mantener 2 cuentas de emergencia FUERA de PIM:

Cuentas:
  - breakglass1@tudominio.onmicrosoft.com
  - breakglass2@tudominio.onmicrosoft.com

Configuración:
  - Global Administrator (permanent)
  - NO conditioned by PIM
  - NO MFA (para emergencias donde MFA falla)
  - Contraseñas largas (20+ caracteres) en caja fuerte física
  - Monitoreadas 24/7 (alerta si se usan)

Si PIM falla o hay lockout masivo, estas cuentas pueden restaurar acceso.

Problemas encontrados

1. Admins olvidaban activar rol

Admin: "¿Por qué no puedo crear usuarios?"
Respuesta: "Olvidaste activar tu rol Global Admin"

Solución: Entrenamiento + mensajes de error claros.

2. Aprobaciones retrasaban trabajo crítico

Aprobador de vacaciones → Activación bloqueada.

Solución: Múltiples approvers + activación sin aprobación para roles menos sensibles.

3. Roles expiraban en medio de cambio

Admin haciendo deployment largo → Rol expira → Deployment falla.

Solución: Extender duration máxima a 8 horas para roles operativos.

Resultados

Antes:

  • 12 Global Admins permanentes
  • Cuentas comprometidas = impacto inmediato
  • 0 auditoría de cuándo se usan privilegios

Después (con PIM):

  • 12 Global Admins eligible
  • Promedio 2-3 activos simultáneamente
  • Cada activación requiere MFA + justificación
  • Auditoría completa de uso de privilegios
  • Tiempo de exposición reducido 95%

Incidentes desde implementación: 0 compromisos con impacto debido a PIM.

¿Usas PIM en tu organización? ¿Qué configuración de activation time funciona mejor para ti?


 Anterior      Posterior

Por Vicente José Moreno Escobar el 20 de mayo de 2020
Archivado en: Azure   Azure AD   Seguridad



Puedes disfrutar de otros artículos como éste en el archivo del sitio.