Active Directory (AD) es utilizado por muchas organizaciones para la gestión de usuarios y servicios de autenticación. Entender la expiración de la contraseña de las cuentas de usuario de AD es importante para mantener la seguridad. Utilizando PowerShell, esta tarea puede ser automatizada, facilitando la gestión. Este artículo explicará cómo verificar la expiración de la contraseña de las cuentas de usuario de AD utilizando PowerShell, paso a paso.
Comando para verificar la expiración de la contraseña
Para verificar la expiración de la contraseña de una cuenta de usuario de Active Directory, combina el cmdlet Get-ADUser de PowerShell con varios atributos. A continuación se muestra el comando básico para verificar la expiración de la contraseña para un usuario específico.
# Check user's password expiration
Get-ADUser -Identity "username" -Properties "PasswordLastSet", "PasswordNeverExpires" | Select-Object -Property Name, PasswordLastSet, PasswordNeverExpires, @{Name="PasswordExpires"; Expression={if ($_.PasswordNeverExpires -eq $false) { $_.PasswordLastSet.AddDays((Get-ADDefaultDomainPasswordPolicy).MaxPasswordAge.TotalDays) } else {"Never Expires"}}}
Este comando recupera el “PasswordLastSet” (la última vez que se estableció la contraseña), si la contraseña está configurada para no expirar “PasswordNeverExpires”, y si la contraseña tiene una expiración, calcula y muestra cuándo es esa fecha de expiración.
Comentarios
- El cmdlet
Get-ADUser
se utiliza para recuperar información del usuario de AD. - El parámetro
-Identity
especifica el nombre de usuario objetivo. - Con el parámetro
-Properties
, especificas qué atributos quieres recuperar. Por defecto, no se recuperan todos los atributos. - Usa el cmdlet
Select-Object
para elegir la información que quieres mostrar y agregar propiedades personalizadas.
Ejemplo de Script 1: Listar Usuarios con Contraseñas Expiradas
Un script para identificar y listar a los usuarios cuyas contraseñas han expirado entre todos los usuarios de Active Directory puede ayudar a verificar el cumplimiento de las políticas de seguridad organizacional y automatizar las tareas de gestión de cuentas.
El siguiente script de PowerShell detecta a los usuarios cuyas contraseñas han expirado comparando la fecha actual y produce una lista de estos usuarios.
# List expired users
Import-Module ActiveDirectory
$today = (Get-Date)
Get-ADUser -Filter * -Properties PasswordLastSet, PasswordNeverExpires | Where-Object {
$_.PasswordNeverExpires -eq $false -and
($_.PasswordLastSet.AddDays((Get-ADDefaultDomainPasswordPolicy).MaxPasswordAge.TotalDays)) -lt $today
} | Select-Object Name, PasswordLastSet, @{Name="PasswordExpires"; Expression={$_.PasswordLastSet.AddDays((Get-ADDefaultDomainPasswordPolicy).MaxPasswordAge.TotalDays)}}
Comentarios
Import-Module ActiveDirectory
hace disponibles los cmdlets relacionados con Active Directory. Esta línea siempre es necesaria antes de ejecutar scripts relacionados con AD.- El cmdlet
Get-Date
se utiliza para obtener la fecha actual, que sirve como base para determinar la expiración de la contraseña. Get-ADUser -Filter *
apunta a todos los usuarios en Active Directory.- El cmdlet
Where-Object
filtra a los usuarios cuyas contraseñas no son permanentemente válidas y cuya fecha de establecimiento de la contraseña más el período válido máximo definido por la política de contraseñas del dominio es anterior a la fecha de hoy. - Usa el cmdlet
Select-Object
para seleccionar solo la información necesaria y agregar la propiedad personalizadaPasswordExpires
para calcular y mostrar la fecha de expiración de la contraseña.
Este script facilita la gestión de usuarios con contraseñas expiradas, contribuyendo a mantener la seguridad.
Ejemplo de Script 2: Envío Automático de Correos Electrónicos de Notificación Antes de la Expiración
Notificar a los usuarios dentro de la organización que su contraseña está a punto de expirar puede mejorar la experiencia del usuario y reforzar la seguridad. El siguiente script de PowerShell detecta a los usuarios cuyas contraseñas expirarán dentro de un número específico de días y envía automáticamente correos electrónicos de notificación a estos usuarios.
# Sending notification emails before expiration
Import-Module ActiveDirectory
$notificationPeriod = 14 # Número de días antes de enviar la notificación
$smtpServer = "smtp.example.com" # Dirección del servidor SMTP
$fromEmail = "admin@example.com" # Dirección de correo electrónico del remitente
$subject = "Su contraseña expirará pronto" # Asunto del correo electrónico
$users = Get-ADUser -Filter * -Properties EmailAddress, PasswordLastSet, PasswordNeverExpires | Where-Object {
$_.PasswordNeverExpires -eq $false -and
($_.PasswordLastSet.AddDays((Get-ADDefaultDomainPasswordPolicy).MaxPasswordAge.TotalDays - $notificationPeriod)) -lt (Get-Date)
}
foreach ($user in $users) {
$toEmail = $user.EmailAddress
$body = "Estimado/a $($user.Name),\n\nSu contraseña expirará en menos de $notificationPeriod días. Por favor, cambie su contraseña lo antes posible.\n\nAtentamente,\nSu equipo de TI"
Send-MailMessage -SmtpServer $smtpServer -From $fromEmail -To $toEmail -Subject $subject -Body $body
}
Comentarios
- Este script utiliza la variable
$notificationPeriod
para definir cuándo comenzar a notificar a los usuarios, establecido en 14 días de antelación en este ejemplo. - El cmdlet
Get-ADUser
recupera información del usuario incluyendo los atributosEmailAddress
,PasswordLastSet
, yPasswordNeverExpires
. - El cmdlet
Where-Object
filtra a los usuarios cuya expiración de la contraseña se acerca. - El bucle
foreach
se utiliza para enviar un correo electrónico a cada usuario relevante usando el cmdletSend-MailMessage
.
Al ejecutar este script regularmente, los usuarios pueden tomar las medidas adecuadas antes de que expiren sus contraseñas, ayudando a mantener la seguridad de la cuenta y reducir el número de tickets de soporte.
Ejemplo de Script 3: Deshabilitación Automática de Cuentas de Usuario Expiradas
Como medida de seguridad, deshabilitar automáticamente las cuentas de usuario cuyas contraseñas han expirado puede reducir el riesgo de acceso no autorizado. El siguiente script de PowerShell detecta las cuentas de usuario con contraseñas expiradas y deshabilita automáticamente esas cuentas.
# Automatically disabling expired users
Import-Module ActiveDirectory
$today = (Get-Date)
$expiredUsers = Get-ADUser -Filter * -Properties PasswordLastSet, PasswordNeverExpires | Where-Object {
$_.PasswordNeverExpires -eq $false -and
($_.PasswordLastSet.AddDays((Get-ADDefaultDomainPasswordPolicy).MaxPasswordAge.TotalDays)) -lt $today
}
foreach ($user in $expiredUsers) {
# Disabling user account
Disable-ADAccount -Identity $user.SamAccountName
Write-Output "Disabled account: $($user.Name)"
}
Comentarios
Import-Module ActiveDirectory
importa el módulo de Active Directory, permitiendo el uso de cmdlets relacionados con AD.- El cmdlet
Get-ADUser
recupera toda la información del usuario y usaWhere-Object
para filtrar a los usuarios con contraseñas expiradas. - Dentro del bucle
foreach
, el cmdletDisable-ADAccount
se utiliza para deshabilitar las cuentas de los usuarios cuyas contraseñas han expirado. - El script produce una salida en la consola cuando se deshabilita una cuenta de usuario.
Este script es particularmente útil para la gestión de cuentas en grandes organizaciones, automatizando el cumplimiento con las políticas de seguridad y reduciendo la carga de trabajo administrativo. Ejecutar el script regularmente asegura que las cuentas con contraseñas expiradas sean deshabilitadas, mejorando la seguridad del sistema.
Consideraciones de Seguridad
Al automatizar la política de contraseñas y la gestión de cuentas de usuario, se deben tener en cuenta varias consideraciones de seguridad. Presta atención a los siguientes puntos al implementar y operar estos scripts.
- Aplicar el Principio de Menor Privilegio: La cuenta que ejecuta el script debe ser otorgada con los permisos mínimos necesarios. Por ejemplo, si solo se necesita leer información de contraseña de usuario, se deben asignar permisos de solo lectura, y solo los permisos necesarios para deshabilitar cuentas deben ser otorgados para esas operaciones.
- Almacenamiento Seguro de Scripts: Dado que los scripts pueden contener información potencialmente sensible o comandos que alteran el sistema, deben ser almacenados de forma segura para proteger contra el acceso no autorizado.
- Registro y Monitoreo: Los cambios realizados por los scripts deben ser debidamente registrados y monitoreados. Esto permite responder rápidamente a comportamientos inesperados o incidentes de seguridad.
- Mantener Mecanismos de Notificación: Especialmente para scripts que notifican a los usuarios sobre la expiración inminente de la contraseña o deshabilitan automáticamente cuentas, es aconsejable tener mecanismos en lugar para notificar a los administradores o usuarios cuando se toman acciones.
- Revisión y Actualización Regular: Los scripts deben ser revisados y actualizados regularmente según sea necesario, en respuesta a cambios en las políticas organizacionales o actualizaciones en el entorno de Active Directory.
Al adherirse a estas consideraciones de seguridad, los procesos automatizados facilitados por estos scripts pueden operar eficientemente mientras se mantienen alineados con los estándares de seguridad organizacionales.
Conclusión
Usar PowerShell para verificar y gestionar la expiración de la contraseña de las cuentas de usuario de Active Directory es esencial para mantener la seguridad organizacional. Al utilizar los scripts introducidos en este artículo, se puede lograr un monitoreo eficiente de las expiraciones de contraseña de las cuentas de usuario de AD, notificación previa a la expiración y deshabilitación automática de cuentas basada en políticas de seguridad.
Es importante que estos procesos automatizados apoyen y mejoren las políticas de seguridad de la organización. Sin embargo, la automatización debe ir acompañada de la aplicación del principio de menor privilegio, almacenamiento seguro de scripts, registro y monitoreo adecuados, mantenimiento de mecanismos de notificación y revisión y actualización regulares, entre otras consideraciones de seguridad.
En última instancia, al combinar adecuadamente estas mejores prácticas y scripts de automatización, la gestión del entorno de Active Directory puede volverse más eficiente y segura.