Búsqueda de sitios web

Búsqueda de registros de Active Directory con PowerShell


Las últimas semanas he pasado tiempo con Active Directory y automatizando tareas de administración con PowerShell. Si retrocede una o dos páginas de publicaciones, verá algunos de los scripts y funciones que he compartido. Hoy quiero abordar algo que surgió en comentarios recientes relacionados con el seguimiento de cambios en Active Directory. Una pregunta lógica es: "¿Quién hizo el cambio?". También me gustaría saber "¿Qué cambiaron?" PowerShell por sí solo no puede obtener todas estas respuestas. Y si ejecuta una infraestructura de Active Directory de tamaño decente, espero que invierta en herramientas de administración de nivel empresarial. El código que estoy compartiendo está bien para tiendas pequeñas que no tienen más remedio que hacer lo suyo. O para situaciones en las que necesita llenar un vacío y abordar un problema a corto plazo.

Excavación del registro de eventos

Para obtener la información que desea sobre quién realiza cambios en Active Directory, deberá profundizar en los registros de eventos. Específicamente, debe consultar el registro de eventos de seguridad. Y para ser aún más específico, debe consultar el registro de eventos de seguridad en un controlador de dominio que pueda escribir en Active Directory. Cuando un administrador habilita una cuenta de usuario en DOM1, se realiza una entrada en el registro de eventos de seguridad. Obviamente, no verá el cambio en el registro de eventos de seguridad en DOM2.

Mi premisa y el código que les mostraré asumen la configuración predeterminada del registro de eventos en los servidores de Windows. Si está reenviando registros o administrándolos con una solución de terceros, deberá tenerlo en cuenta al revisar mi código. La información que les mostraré está en el registro de eventos de seguridad y es específica del servidor. La forma de gestionar estos registros depende de usted.

Antes de profundizar más, una breve advertencia. Cada organización tiene sus propias políticas y procedimientos para la gestión del registro de eventos. Sólo puede consultar cambios relacionados con Active Directory si la información no se ha eliminado del registro de eventos de seguridad. Esto significa que es posible que deba asegurarse de que sus archivos de registro sean lo suficientemente grandes para satisfacer sus necesidades. En mi dominio de prueba, ejecuté este comando para aumentar el tamaño a 1 GB.

limit-eventlog -LogName security -ComputerName dom2,dom1 -MaximumSize 1024MB

Eventos de gestión de usuarios

Me centraré en los eventos de gestión de usuarios. Cada tipo de evento está conectado a un ID de evento. Aquí hay una tabla hash tramposa que uso.

# a hashtable of user management event IDs for the Security event log
$ADEvent = @{
   UserChanged  = 4738
   UserCreated  = 4720
   UserDeleted  = 4726
   UserEnabled  = 4722
   UserDisabled = 4725
}

Cuando administra una cuenta de usuario de AD, es posible que obtenga varias entradas de registro para la misma actividad. Por ejemplo, si crea una cuenta de usuario y la habilita, lo más probable es que vea un evento UserCreated y UserEnabled. Probablemente también un UserChanged. Mantenlo en mente.

Para consultar el registro de eventos, le sugiero que aprenda a usar Get-WinEvent. Ofrece más flexibilidad de consulta, es un poco más rápido (creo) y cuando llegas a PowerShell 7 es la única herramienta que tendrás. Cuento contigo para leer ayuda y ejemplos. Mientras tanto, aquí tienes una muestra.

Get-WinEvent -FilterHashtable @{Logname = 'Security';ID=4720;Starttime="2/1/2021"} -ComputerName dom1

Esto consulta todos los eventos de creación de usuarios en DOM1 que se han registrado desde el 1 de febrero de 2021.

Profundicemos en los detalles del mensaje.

La entrada del registro de eventos mostrará el Asunto, la cuenta responsable de la actividad y el Objetivo. En este caso, parece Empresa\Administrador creado Empresa\L.Kuja. No tengo idea de dónde se creó esa cuenta, pero siempre puedo buscarla con Get-ADUser.

Mientras tengo esto en mente, también quiero señalar la lista de atributos. Cuando se modifica una cuenta de usuario, estos son los únicos atributos que se capturan en el registro de eventos. Si cambio el Departamento o Título de un usuario, eso no queda registrado en el registro de eventos de seguridad. Si este tipo de seguimiento de auditoría es importante para usted, es por eso que busca productos de gestión de terceros.

Obtener-ADUserAudit

Con estas limitaciones en mente, escribí una función de PowerShell llamada Get-ADUserAudit. Tiene parámetros para crear una búsqueda en uno o más controladores de dominio para diferentes tipos de eventos de administración de usuarios que se han registrado desde un momento determinado.

Get-ADUserAudit -event created,deleted -since "2/1/2021"

El comportamiento predeterminado es buscar en todos los controladores de dominio de réplica.

La función escribe un objeto personalizado en la canalización que tiene una vista de formato personalizado predeterminada. Permítanme explicar brevemente el resultado. Las propiedades DomainController, Since y EventType deberían ser evidentes. La propiedad Targets es una colección de todas las cuentas de usuario que se identificaron para un evento particular. TargetCount es una forma rápida de ver cuántas cuentas de usuario. En otras palabras, desde el 1 de febrero, se crearon (o al menos iniciaron sesión) 5 cuentas de usuario en DOM1. Administradores muestra todas las cuentas de administrador asociadas con los eventos. Entonces, en el mismo período, Administrator, AprilS y ArtD crearon las cuentas. El resultado no le dirá qué administrador creó qué cuenta de usuario. Tendría que volver a profundizar en el registro de eventos para obtener esa información.

Por supuesto, puedes personalizar los resultados como quieras.

Get-ADUserAudit -event created,deleted,enabled,disabled -outvariable a | sort-object eventtype | format-table -GroupBy eventtype -Property since,domaincontroller,targetcount

O aquí hay una manera de resumir los eventos.

$a | group-object eventtype -ov b | select-object @{Name="Since";Expression={$a[0].Since}},Name,@{Name="Total";Expression = { ($_.group.targetcount | measure-object -sum).sum}}

$A es el resultado guardado de mi comando anterior.

Si esto fuera algo que quisiera ejecutar con frecuencia, crearía un script de control para ahorrar algo de escritura. Incluso podría ir más allá, porque no puedo evitarlo, y configurarlo como un trabajo programado para crear una versión HTML y enviarla por correo electrónico.

¿Dónde está el código?

Si desea ver cómo hice todo esto, o obtener el código para poder probarlo usted mismo, puede descargar los archivos desde esta esencia de Github. En una nota relacionada, es posible que también le interese el comando Convert-EventLogRecord que forma parte del módulo PSScriptTools. Este comando facilita el análisis de información de los registros de eventos.

Get-WinEvent -FilterHashtable @{Logname = 'Security';ID=4720;Starttime="2/1/2021"} -ComputerName dom2 | 
Convert-EventLogRecord |  
Format-table -GroupBy Computername -Property ID,TimeCreated,
@{Name="Admin";Expression={"$($_.SubjectDomainName)\$($_.SubjectUsername)"}},
@{Name="Account";Expression = { (Get-ADuser $_.samaccountname).DistinguishedName }}

Ahora puedo ver claramente qué administrador creó cada cuenta.

Déjame saber lo que piensas o si algo de esto es útil.

Artículos relacionados