Estandarizar claves eternas en entornos corporativos de Active Directory es posible sin sacrificar seguridad: basta una PSO bien diseñada con 16 caracteres y complejidad habilitada. Aprende paso a paso cómo implementarla correctamente y evita errores que provocan caducidades inesperadas.
Problema planteado
El administrador necesita que un conjunto específico de cuentas mantenga la contraseña activa indefinidamente, pero sin descuidar los requisitos mínimos de 16 caracteres y complejidad (Password Complexity). La duda surge al configurar la Password Settings Object (PSO):
- ¿Basta con desmarcar Enforce maximum password age?
- ¿O es necesario marcarla y establecer
0 días
, un valor que la interfaz gráfica no acepta?
La respuesta correcta es: establecer MaximumPasswordAge = 0
. A continuación verás por qué y cómo hacerlo.
Conceptos básicos
Antes de poner manos a la obra conviene repasar algunos términos:
Término | Descripción resumida |
---|---|
Default Domain Policy | GPO que define la contraseña «por defecto» para todo el dominio. |
PSO | Objeto almacenado en CN=Password Settings Container,CN=System,DC=… que permite asignar una directiva de contraseña distinta a usuarios o grupos concretos. |
msDS‑PasswordSettingsPrecedence | Número que decide qué PSO gana si a un usuario le aplican varias. |
MaximumPasswordAge | Tiempo máximo (días, horas, minutos) que una contraseña puede estar vigente antes de expirar. |
Requisitos previos
- Controlador de dominio Windows Server 2008 o superior (las PSO aparecieron con el nivel funcional 2008).
- Cuenta con privilegios para “Create, Delete and Manage Password Settings Objects” o equivalente.
- Módulo
ActiveDirectory
de PowerShell instalado (en servidores y en Windows 10/11 basta con RSAT). - Conocimiento del grupo o usuarios destino.
Solución paso a paso
Crear o editar la PSO
Puedes usar el Active Directory Administrative Center, ADSI Edit o PowerShell. El ejemplo siguiente usa PowerShell por ser el método más rápido y preciso:
Crear la PSO
New-ADFineGrainedPasswordPolicy `
-Name "PSO‑NoExpire‑16Chars" `
-Precedence 10 `
-MinPasswordLength 16 `
-PasswordComplexityEnabled $true `
-PasswordHistorySize 24 `
-MaxPasswordAge 0.00:00:00 # 0 días = sin expiración
Si la PSO ya existe, basta con modificarla:
Set-ADFineGrainedPasswordPolicy "PSO‑NoExpire‑16Chars" -MaxPasswordAge 0.00:00:00
Desactivar la expiración de forma correcta
No es suficiente con dejar sin marcar Enforce maximum password age en la GUI. Esa casilla «sin marcar» significa “hereda lo que diga la política de dominio”, de modo que, si la Default Domain Policy fija 90 días, los usuarios seguirán caducando. El único modo garantizado es poner 0
en MaximumPasswordAge.
Asignar la PSO
Añade los usuarios o el grupo al atributo msDS‑PSOAppliesTo
:
Add-ADFineGrainedPasswordPolicySubject `
-Identity "PSO‑NoExpire‑16Chars" `
-Subjects "CN=GrupoSinExpiracion,OU=Seguridad,DC=contoso,DC=com"
Forzar la aplicación
Aunque el cambio se replica rápidamente, puedes acelerar la actualización:
gpupdate /force
o simplemente espera el próximo Kerberos ticket refresh y el background refresh de Directivas.
Ajuste individual (opcional)
Para casos aislados, marcar Password never expires en la pestaña Account de cada usuario resulta más simple que crear una PSO nueva:
Set-ADUser "usuario" -PasswordNeverExpires $true
Sin embargo, esta práctica complica el control centralizado y el reporte de excepciones.
Tabla resumen de acciones
Paso | Qué hacer | Detalles útiles |
---|---|---|
1 | Crear o editar la PSO | Definir MinimumPasswordLength = 16 y PasswordComplexityEnabled = True . |
2 | Desactivar la expiración | Establecer MaximumPasswordAge = 0 con PowerShell si la GUI no permite el valor. |
3 | Asignar la PSO | Agregar el grupo o los usuarios al atributo msDS‑PSOAppliesTo . |
4 | Forzar la aplicación | Ejecutar gpupdate /force o esperar replicación. |
5 (opcional) | Atributo por usuario | Usar PasswordNeverExpires para excepciones puntuales. |
Verificación y pruebas
- Confirmar la PSO efectiva
Ejecuta:Get-ADUserResultantPasswordPolicy "UsuarioPrueba"
Verifica que aparezca la PSO «PSO‑NoExpire‑16Chars» y queMaximumPasswordAge
sea00:00:00
. - Observar la fecha de expiración
Con el usuario logueado, abre una ventana de comandos y lanza:net user %username% /domain
La línea «Password expires» debe mostrar Never. - Auditar eventos
Habilita la auditoría de cambios de directiva y revisa el visor de eventos (Security ID 4672 y 4739) para confirmar que la PSO se aplicó.
Buenas prácticas adicionales
- Usar passphrases de 16 caracteres —o más— compuestas de varias palabras aleatorias para facilidad de memorización sin sacrificar entropía.
- Activar MFA para cuentas privilegiadas: una contraseña que nunca caduca requiere múltiples factores que mitiguen la exposición prolongada.
- Revisar la precedencia: si otra PSO tiene valor Precedence menor (más alta prioridad) podría anular el
MaxPasswordAge = 0
. Mantén documentada la matriz de PSO. - Registrar excepciones: los auditores suelen exigir un inventario de cuentas con contraseña infinita. Exporta periódicamente:
Get-ADUser -Filter * -Properties PasswordNeverExpires | Where-Object {$_.PasswordNeverExpires -eq $true} | Select-Object SamAccountName, Enabled | Export-Csv C:\Reportes\ContraseñasSinExpiración.csv -NoTypeInformation
- No desactivar history: aunque la contraseña no caduque,
PasswordHistorySize
debe impedir la reutilización tras un eventual cambio. - Aplica LAPS o PAM a cuentas de servicio locales; estas no aceptan PSO y requieren otras medidas.
Preguntas frecuentes
¿Qué ocurre si más tarde quiero volver a caducar las contraseñas?
Cambia MaximumPasswordAge
a la cantidad de días deseada (ej. 90.00:00:00
). A partir de la próxima autenticación interactiva, el contador de expiración se reiniciará con la fecha actual. ¿Puedo fijar expire‑at‑logon sin afectar la PSO?
Sí. El atributo pwdLastSet
a 0
forzará cambio inmediato, incluso si MaximumPasswordAge = 0
. Tras el cambio, la contraseña volverá a ser “eterna”. ¿La casilla GUI «Enforce maximum password age» vale para PSO?
Solo expone el mismo atributo msDS-MaximumPasswordAge
. Si la desmarcas, la PSO no establece ningún valor y el controlador aplicará la política de dominio. Para un efecto “sin expiración” debes forzar 0
. ¿Las PSO afectan a equipos unidos al dominio?
No. Las PSO solo influyen en cuentas almacenadas en el AD (user
o inetOrgPerson
). Las contraseñas de equipos dependen del proceso automático de machine‑password‑change.
Conclusión
Una contraseña que nunca caduca no es sinónimo de inseguridad si se combina con longitud suficiente, complejidad, auditoría y factores de autenticación adicionales. Configurar MaximumPasswordAge = 0
mediante una PSO brinda control granular y evita sorpresas que puedan bloquear cuentas críticas. Adoptar buenas prácticas y documentar las excepciones garantizará la aceptación de auditores y la continuidad operativa.