Active Directory: contraseñas sin expiración con PSO de 16 caracteres y complejidad

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.

Índice

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érminoDescripción resumida
Default Domain PolicyGPO que define la contraseña «por defecto» para todo el dominio.
PSOObjeto almacenado en CN=Password Settings Container,CN=System,DC=… que permite asignar una directiva de contraseña distinta a usuarios o grupos concretos.
msDS‑PasswordSettingsPrecedenceNúmero que decide qué PSO gana si a un usuario le aplican varias.
MaximumPasswordAgeTiempo 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

PasoQué hacerDetalles útiles
1Crear o editar la PSODefinir MinimumPasswordLength = 16 y PasswordComplexityEnabled = True.
2Desactivar la expiraciónEstablecer MaximumPasswordAge = 0 con PowerShell si la GUI no permite el valor.
3Asignar la PSOAgregar el grupo o los usuarios al atributo msDS‑PSOAppliesTo.
4Forzar la aplicaciónEjecutar gpupdate /force o esperar replicación.
5 (opcional)Atributo por usuarioUsar PasswordNeverExpires para excepciones puntuales.

Verificación y pruebas

  1. Confirmar la PSO efectiva
      Ejecuta:
    Get-ADUserResultantPasswordPolicy "UsuarioPrueba"   Verifica que aparezca la PSO «PSO‑NoExpire‑16Chars» y que MaximumPasswordAge sea 00:00:00.
  2. 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.
  3. 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.

Índice