Delegar permisos mínimos en cuenta de servicio Ansible para DC y Exchange

En muchos entornos corporativos se exige que la automatización no se convierta en un “usuario dios” dentro del dominio. Esta guía muestra cómo otorgar a la cuenta de servicio que emplea Ansible exactamente los privilegios que necesita para instalar software, aplicar actualizaciones de Windows y reiniciar DC y Exchange, pero sin convertirla en administradora del dominio completo.

Índice

Contexto y objetivos

El reto consiste en equilibrar agilidad y seguridad cuando:

  • Ansible orquesta tareas críticas sobre Windows Server.
  • Se debe respetar el principio de menor privilegio.
  • Los equipos incluyen Controladores de Dominio (DC) y servidores Exchange.

El objetivo final es una cuenta que pueda desplegar, parchear y reiniciar, pero que no tenga poder para crear usuarios, replicar atributos sensibles de Active Directory o leer buzones.

Principio de menor privilegio con Ansible

Al proteger una cuenta de servicio de Ansible debes pensar en tres planos:

  1. Superficie de tareas: exactamente qué cmdlets, binarios o API va a invocar.
  2. Ubicación: sobre qué equipos u OU se aplicarán los privilegios.
  3. Duración: que los derechos sean permanentes solo si es imprescindible; de lo contrario, usa elevación temporal.

Diseño de la cuenta de servicio

Buenas prácticas:

  • Tipo de cuenta: gMSA (Group Managed Service Account). El KDS rota la clave cada 30 días sin intervención humana.
  • Nombre descriptivo: gMSAansibleops. Evita “svc” genéricos.
  • Inicio de sesión: bloquea el logon interactivo (Deny log on locally). Solo debe autenticarse por WinRM.
  • MFA o restricción por estaciones: si tu solución MFA tolera cuentas de servicio, aplícala; si no, restringe Log On To a los nodos de control de Ansible.

Tabla resumen de la solución

FaseAcciónDetalles clave
Definir el alcance de permisosInstalación/ejecución de binarios, gestión de Windows Update y reinicio remoto.Un documento de alcance agiliza auditorías y pruebas.
Crear/seleccionar la cuenta de serviciogMSA dedicada, contraseña gestionada, sin logon interactivo.Un gMSA elimina la rotación manual de claves.
Delegar en DCGPO + derechos SeShutdownPrivilege, SeRemoteShutdownPrivilege, membresía Remote Management Users o JEA.No agregues al grupo Administrators; vincula la GPO solo a la OU  Domain Controllers.
Delegar en ExchangeRBAC personalizado, permisos sobre carpetas de instalación y WinRM idéntico a DC.Evita Organization Management completo.
Ajustes avanzadosDelegación restringida Kerberos, atributos TrustedForDelegation.Solo si la arquitectura salta entre hosts.
PruebasEntorno de ensayo, check mode de Ansible.Verifica que no modifica objetos fuera de alcance.
Auditoría y monitoreoAdvanced Security Audit, revisión de SIEM.Alertas ante escaladas.
Documentación y mantenimientoRegistro de cambios y revisiones semestrales.Facilita auditorías y traspaso de personal.

Delegación en Controladores de Dominio

GPO dedicada

  • Crea una GPO llamada GPOAnsibleDC y víncula solo a la OU Domain Controllers.
  • En la pestaña Delegation añade la cuenta gMSAansibleops$ con permiso Edit settings.

User Rights Assignment

Dentro de la misma GPO, modifica Computer Configuration → Policies → Windows Settings → Security Settings → Local Policies → User Rights Assignment:

  • Shut down the system (SeShutdownPrivilege).
  • Force shutdown from a remote system (SeRemoteShutdownPrivilege).
  • Log on as a service, en caso de ejecutar tareas como servicio.

WinRM y PowerShell Remoting

Opciones:

  1. Añade la cuenta al grupo local Remote Management Users por GPO de Preferencias.
  2. Configura Just Enough Administration (JEA) con un endpoint que solo exponga los cmdlets que Ansible invoca (por ejemplo Restart-Computer, Get-HotFix, Start-Process).
# En un DC, como administrador del dominio
Install-Module -Name JEA
New-PSRoleCapabilityFile -Path "C:\Program Files\WindowsPowerShell\Modules\JEA\RoleCapabilities\AnsibleOps.psrc" -VisibleCmdlets Restart-Computer, Get-HotFix, Start-Process
Register-PSSessionConfiguration -Name AnsibleOps -RunAsVirtualAccount -RoleDefinitions @{ 'contoso\gMSAansibleops$' = @{ RoleCapabilities = 'AnsibleOps' } }

Delegación en servidores Exchange

RBAC granular

Crea un grupo de roles personalizado:

# Con permisos de Org Management
New-RoleGroup -Name "AnsibleOps-Exchange" -Roles "Server Management","Mailbox Import Export","View-Only Configuration"
Add-RoleGroupMember -Identity "AnsibleOps-Exchange" -Member "CONTOSO\gMSAansibleops$"

Permisos de sistema de archivos

  • Concede Modify sobre C:\InstallTemp y la ruta de logs que use tu playbook.
  • Mantén NTFS y Audit ACE para rastrear uso no autorizado.

WinRM idéntico al paso de DC

Reutiliza el endpoint JEA o, si lo prefieres, limita el puerto 5985/5986 a la VLAN del controlador de Ansible mediante firewall.

Ejemplo de implementación paso a paso

El siguiente flujo sirve como “runbook” reproducible:

  1. Solicitar la gMSA (incluye justificación de negocio).
    # Ejecutar en un DC Add-KdsRootKey -EffectiveImmediately $true # Solo la primera vez New-ADServiceAccount -Name gMSAansibleops -DNSHostName gMSAansibleops.contoso.com -PrincipalsAllowedToRetrieveManagedPassword "CN=Ansible Controllers,CN=Computers,DC=contoso,DC=com"
  2. Instalar la gMSA en cada nodo de control de Ansible.
    Install-ADServiceAccount -Identity gMSAansibleops
  3. Crear la GPO y vincularla solo a Domain Controllers.
  4. Añadir el gMSA al grupo RBAC en Exchange.
  5. Registrar el endpoint JEA con los cmdlets mínimos.
  6. Configurar la conexión en Ansible (inventory):
    [windows] dc01.contoso.com exch01.contoso.com \[windows\:vars] ansible\user=CONTOSO\gMSA\ansible\_ops\$ ansible\_password="" ansible\_port=5986 ansible\_connection=winrm ansible\winrm\transport=kerberos ansible\winrm\server\cert\validation=ignore ansible\become\method=runas ansible\become\user="NT AUTHORITY\SYSTEM"
  7. Ejecutar playbook en check mode y revisar resultados.
  8. Promover a producción solo tras superar validaciones.

Pruebas y validación

Incluye siempre un entorno que refleje la topología real pero con datos sintéticos:

  • Lanza tareas de instalación (win_package) y confirma que el software aparece en Apps & Features.
  • Aplica win_updates apuntando a tu WSUS/Patch API y verifica códigos de reinicio.
  • Reinicia un DC (win_reboot); confirma replicación y tiempos de arranque.
  • Ejecuta pruebas negativas: intento de New-ADUser debe fallar con Access Denied.

Auditoría y monitoreo continuo

Políticas de auditoría

Activa estas subcategorías en Advanced Security Audit:

  • DS AccessDirectory Service Changes.
  • Object AccessFile Share, Other Object Access.
  • Privilege UseSensitive Privilege Use.

Reenvía eventos a tu SIEM y genera alertas automáticas si la cuenta intenta escalar privilegios o acceder fuera de los OU esperados.

Integración con Ansible Tower/AWX

Habilita Job Events y Activity Stream para correlacionar cada ejecución con su auditoría en el DC o Exchange. Mantén los tokens de Tower cifrados con Fernet y rota la SECRET_KEY.

Mantenimiento y revisión periódica

  • Revisión semestral de permisos comparando desired state (repositorio IaC) frente a ACL reales con Compare-Object.
  • Rotación de gMSA gestionada automáticamente; revisa que los controladores de dominio no estén desincronizados más de 10 horas (requisito para la rotación).
  • Documentación viva: usa Markdown en tu repositorio Git y requiere pull requests para cambios.

Conclusión

Al delegar con precisión quirúrgica, la cuenta de Ansible mantiene la automatización de despliegues, parches y reinicios, sin exponer el dominio a un compromiso total. Adoptar gMSA, JEA y RBAC reduce la superficie de ataque, simplifica la gestión de credenciales y cumple los requisitos de auditoría. Una estrategia de menor privilegio no solo protege hoy, sino que crea la base para escalar la automatización con confianza mañana.

Índice