Bloqueo de cuentas en Active Directory

La gesti贸n de identidades es uno de los pilares de los administradores de sistemas. Ya sea por lo tedioso que se tornan algunos temas, como dar de alta usuarios nuevos, algunas tareas son automatizadas o se resuelven por medio de software de terceros. Otras, en cambio, son tareas que dependen de la capacidad de investigaci贸n del administrador para poder ser resueltas. Es por ello que hoy quiero conversar sobre el bloqueo de las cuentas y el desbloqueo de las mismas.

驴Qui茅n no ha pasado por la situaci贸n de tener un usuario al que se le bloquea la cuenta m谩s de 20 veces en el d铆a sin motivo aparente? Ah铆 salimos a buscar pistas, ver en que puesto trabaja, que software usa, etc. Para determinar si por alguna casualidad dej贸 tildada la opci贸n de recordar la contrase帽a y ahora, con una diferente, a cada momento aparece el pop-up de ingreso de credenciales.

Un administrador que se respete debe contar con herramientas que solucionen los problemas que van surgiendo d铆a a d铆a y como nosotros siempre damos un paso m谩s, gracias al scripting, vamos a generar nuestras propias herramientas.

Eventos, nuestros aliados de batalla

En el ecosistema Microsoft, los eventos y m谩s puntualmente el visor de eventos deben ser nuestra informaci贸n de referencia sobre lo que sucede en los sistemas. Es por ello, que debemos tener bien claro que se nos ofrece para poder sacar el mayor provecho. Voy a compartir una lista con los principales IDs y t铆tulos de eventos relacionados a los estados que podr铆a tener un usuario de dominio que nos van a servir a lo largo del post. 脡stos eventos los vamos a encontrar en la secci贸n Security del visor de eventos:

ID. Mensaje
4720 Se ha creado una cuenta de usuario.
4722 Se habilit贸 una cuenta de usuario.
4723 Se ha intentado cambiar la contrase帽a de cuenta.
4724 Se ha intentado restablecer la contrase帽a de cuenta.
4725 Se ha deshabilitado una cuenta de usuario.
4726 Se ha eliminado una cuenta de usuario.
4740 Se ha bloqueado una cuenta de usuario.
4767 Se ha desbloqueado una cuenta de usuario.

Obviamente que no vamos a utilizar todos los detallados de la lista, pero simplemente para tener una idea m谩s amplia de la informaci贸n que podemos obtener desde los registros de eventos. Tambi茅n es v谩lido comentar que no son los 煤nicos IDs que hacen referencia a los estados por los que pasa una cuenta de dominio. B谩sicamente nos vamos a centrar en los eventos con ID 4740, que son los que se refieren a las cuentas bloqueadas:

Eventos de Seguridad con ID 4740

La imagen anterior muestra el visor de eventos con el filtro aplicado para que despliegue solamente los eventos con ID 4740.

Ahora bien, dentro de ese evento generado vamos a contar con informaci贸n relevante al momento en que se bloque贸 la cuenta que estamos intentando investigar. Dentro de la informaci贸n que tenemos a disposici贸n, existen 2 valores que son los que nos interesan en esta oportunidad. El primero obviamente es el nombre del usuario, para poder filtrar la informaci贸n que no nos interesa. El segundo valor es el equipo en donde se bloque贸 el usuario.

De m谩s est谩 decir que dentro del evento contamos con m谩s detalles sobre esa acci贸n, Adjunto una captura de un evento para que quede en evidencia el resto de la informaci贸n.

Evento de Seguridad con ID 4740 para la cuenta vsilva

En donde el valor de la etiqueta 鈥淣ombre de equipo del autor de la llamada鈥 es el valor del equipo/servidor donde se bloque贸 la cuenta, en este caso, del usuario vsilva. Seg煤n la imagen, la cuenta se bloque贸 en el servidor DC01.

Como dato adicional antes de comenzar a ver con PowerShell 茅sta informaci贸n, vale la pena recordar que estos eventos se registran en los controladores de dominio.

Manos a la obra

No vamos a necesitar m谩s herramientas que nuestra consola de PowerShell para poder llevar a cabo lo que necesitamos: desplegar informaci贸n detallada sobre el bloqueo de un usuario en particular.

Primero debemos entender que comando nos va a permitir obtener los eventos que necesitamos con informaci贸n al respecto de nuestra necesidad. El cmdlet central que vamos a usar es Get-WinEvent.

Como vimos anteriormente, el ID que indica que una cuenta se encuentra bloqueada es el 4740, por lo que vamos a usar la siguiente sintaxis para guardar todos los eventos con ese ID:

$eventos = Get-WinEvent -FilterHashtable @{logname='Security'; ID=4740; }

Tambi茅n agregamos el tipo de log, Security en este caso, ya que los eventos de auditor铆a se registran en esa categor铆a.

Ya tenemos en nuestra variable $eventos todos los registros que informan sobre un bloqueo de cuenta de usuario. Ahora debemos de manipular toda la informaci贸n que nos proporcionan los eventos para poder obtener la informaci贸n deseada: saber en que equipo/servidor se bloque贸 la cuenta.

As铆 que arm茅 esta peque帽a funci贸n que manipula el resultado de lo anteriormente detallado y lo presenta como un objeto:

function Get-UsuarioBloqueado {
param(
    [string]$Usuario
)

    $eventos = Get-WinEvent -FilterHashtable @{logname='Security'; ID=4740; }
    $datos = 'TargetDomainName', 'TargetUserName'
    $eventos | ForEach-Object {
        ([xml]$_.ToXml()).Event.EventData | ForEach-Object {
            $props = @{}

            $_.Data |
                Where-Object { $datos -contains $_.Name} |
                ForEach-Object { $props[$_.Name] = $_.'#text' }

            New-Object -Type PSObject -Property $props | where {$_.TargetUserName -ge $usuario }
        }
    }
}

Y la utilizamos de la siguiente manera:

Get-UsuarioBloqueado -Usuario vsilva

Resultado de ejecutar la funci贸n Get-UsuarioBloqueado

Como se muestra en el ejemplo, en caso de ejecutar la funci贸n sin especificar un nombre de usuario en particular, vamos a obtener todos los registros que se generaron al bloquearse una cuenta, desplegando la informaci贸n del nombre del usuario y en que equipo sucedi贸 el bloqueo.

Happy scripting!

Comments