Script para la recolección de eventos de Microsoft windows remotamente

Este script lo desarrollé para un cliente y permite recoger eventos de una o varias máquinas corriendo Microsoft Windows. Se ha probado con Microsoft Windows Server 2003 pero posiblemente funcione bien en otras versiones. A continuación inserto la documentación creada para el cliente, que explica en detalle el funcionamiento.

Descarga el script Remote-Events_log-retriever

Objetivos del script

El objetivo de este script es la recogida remota de eventos de auditoría de inicio de sesión, tanto correctos como fallidos, de servidores Microsoft Windows y exportarlos a un archivo en formato CSV que podrá ser importado y analizado por Splunk. El agente de Splunk es el encargado de enviar este archivo a Splunk cuando se recogen nuevos eventos.

Estructura de archivos

Para dotar de flexibilidad y facilidad de administración al script, se ha divido en varios archivos de configuración y de registro de la actividad. La estructura que se encuentra en el directorio Remote-Events_log-retriever es la siguiente:

  • get-event-log.vbs: Es el código del script y el archivo que se ejecuta periódicamente para recoger los eventos remotos
  • user.txt: Este archivo de texto especifica el nombre de usuario que utilizará el script para conectar a los servidores remotos
  • pwd.txt: Este archivo de texto especifica la contraseña que utilizará el script para conectar a los servidores remotos
  • listado-de-servidores.txt: Este archivo incluye el listado de servidores de los cuales deseamos extraer el registro de eventos. Los servidores se especifican mediante su dirección IP y se inserta uno por línea.
  • Listado-de-eventos.txt: En este archivo se indica de qué registro de eventos y qué eventos queremos extraer. El archivo se compone de líneas con el formato “registro_de_eventos:id_evento1:id_evento2:…:id_eventoN
  • last-event-time.txt:  Este archivo es el encargado de guardar un registro de la última vez que se ha recogido eventos en cada servidor, almacena una línea para cada servidor del que ha recogido datos con el formato “IP_del_servidor$fecha y hora%
  • eventos: Es el directorio en el que se almacenan los eventos recogidos en formato CSV
  • eventos/eventos.csv: Este archivo almacena los últimos eventos recogidos y  transformados al formato CSV, es monitorizado por el cliente de Splunk y cuando hay cambios lo envía a Splunk para que lo indexe. El archivo se sobre escribe en cada ejecución del script
  • logs: Directorio que almacena el log del script
  • log/get_event-log.log: Archivo de log del script, el script acepta distintos niveles de log, según el nivel configurado este archivo tendrá más o menos información sobre la ejecución del script

Instrucciones de uso

Los pasos necesarios para ejecutar el script son:

  1. Indicar el nombre de usuario para conectar a los servidores remotos en el archivo user.txt
  2. Indicar la contraseña para conectar a los servidores remotos en el archivo pwd.txt
  3. Especificar qué eventos y de qué registro deseamos recoger, editando el archivo Listado-de-eventos.txt. Este archivo debe contener una línea por cada registro de eventos y separado por dos puntos cada identificador de evento que que se deban recoger, un ejemplo sería este:
security:4625:4624:528:529:530:531:532:533:535

application:11707

  1. Especificar de qué servidores se deben recoger logs mediante el archivo listado-de-servidores.txt. El archivo debe contener la dirección IP, nunca el nombre de máquina, de cada servidor a consultar; una IP por línea. El script comprueba que cada línea se una dirección válida y limpia los espacios que puedan haber en cada línea
  2. Una vez configurado el script, hay que ejecutar el archivo get-event-log.vbs. La ejecución generará el archivo de eventos.csv, en el directorio eventos, que contendrá los eventos, de todos los servidores, recogidos y el archivo get_event-log.log en la carpeta log que contiene los errores que pueda encontrar el script durante su ejecución. Además genera el archivo last-event-time.txt para mantener un registro de la última vez que ha obtenido registros de cada servidor, para así obtener tan solo los que sean más recientes en la siguiente ejecución y no duplicar eventos.

Funcionamiento interno

La lógica del flujo del script se puede resumir en:

  • Inicialización de constantes, variables, archivos y objetos necesarios
  • Abre el archivo de log log/ get_event-log.log
  • Coge los servidores del archivo listado-de-servidores.txt
  • Recoge la última ejecución para todos los servidores del archivo last-event-time.txt
  • Abre el archivo de eventos eventos/eventos.csv
  • Para cada servidor
    • Comprueba que la IP cumpla con el formato IP
    • Conecta al servidor
    • Abre el archivo Listado-de-eventos.txt
    • Para cada registro de eventos
      • Genera la query con todos los eventos que se quieren recoger del registro y el tiempo de la última ejecución
      • Ejecuta la consulta
      • Procesa cada evento recogido y lo escribe al archivo eventos/eventos.csv en formato csv
    • Almacena la fecha y hora de la ejecución si ha recogido algún evento
  • Cierra los archivos abiertos
  • Finaliza la ejecución

Variables  del programa

Prácticamente todos los parámetros utilizados por el programa se pueden configurar mediante sus variables, las variables que controlan estos aspectos son:

  • intLoggingLevel = ERRO: Define el nivel de error que se quiere guardar en el log, sus valores pueden ser: DBG=0, INFORMATIONAL=1, ERRO=2, CRITICAL=3. Para depurar el script se recomienda usar el nivel DBG
  • strDomain = “WORKGROUP”: Dominio de los servidores a consultar
  • strBasePath = “c:\Remote-Events_log-retriever\”: Ruta que contiene el script
  • strLastTimeFile = strBasePath & “last-event-time.txt”: Ruta del archivo de registro de la fecha y hora de la última obtención de eventos
  • strServersFile = strBasePath & “listado-de-servidores.txt”: Ruta del archivo con el listado de servidores a consultar
  • strLogFile = strBasePath & “log\get_event-log.log”: Ruta del archivo de registro del script
  • strEventsCsvFile = strBasePath & “eventos\eventos.csv”: Ruta del archivo de eventos en formato csv
  • strEventsFile = strBasePath & “Listado-de-eventos.txt”: Ruta del archivo de los registros de eventos y los eventos a consultar
  • strUserFile = strBasePath & “user.txt”: Ruta del archivo que contiene el nombre de usuario para conectar con los servidores
  • strPwdFile = strBasePath & “pwd.txt”: Ruta del archivo que contiene la contraseña para conectar con los servidores

Descarga el script Remote-Events_log-retriever

10 pensamientos en “Script para la recolección de eventos de Microsoft windows remotamente

  1. ignacio

    Hola muy buenas tengo un problemilla.
    Necesito inventariar muchos equipo dentro de un dominio.
    He pensado crear un script y meterlo dentro de un GPO de active directory para que se ejecute cuando el pc se encienda, El scrip ya lo he creado y funciona, y la GPO supongo que tampoco será muy dificil.
    Mi problema es el siguiente:
    ¿Como hago que este scrip que me extrae los datos a la vez los lance a una máquina diferente a la mia para su almacenamiento?
    El scrip que he creado es el siguiente:
    WMIC /Output:datos equipo.csv OS get /all /format:LIST
    WMIC.EXE /Output:”Adaptador de redes.csv” Path Win32_NetworkAdapterConfiguration Where IPEnabled=TRUE Get DNSHostName, Description, IPAddress, IPSubnet, DefaultIPGateway, DNSServerSearchOrder, DHCPEnabled, MACAddress /Format:LIST

    Responder
  2. Brus

    Saludos,

    Muchísimas gracias por el aporte, se agradece bastante.
    Lo que necesito saber es que tengo que poner en el txt de “Listado-de-eventos.txt” para hacer un recuento (si se pudiera) de cuantos “Errores, advertencias o Críticos” hay sobre errores de “Disk” o de “ntfs”, en caso de no poder hacer un recuento que diga (hay X errores en disk o ntfs) pues aunque sea que me diga si tiene o no tiene alguno de estos 2 tipos de errores y que errores tiene si disk o ntfs.

    Gracias de antemano!

    Responder
  3. sw

    Saludos, una pregunta al realizar las consultas a otro windows la consulta de la fecha me la hace desfazada, revise que no haya diferencia de horarios entre los equipos, pero aún así me hace consulta +6 y +8 hrs noté que es variante por lo que no puedo sumar o restar a la fecha, los eventos reales, ejemplo: hr real 11/4/2015 8:10:03 AM y la hora que me arroja el evento a la salida del script es 20151104141003.445839-000 que en traducción se entiende que es 2015-11-04 14:10:03 .445839-000 alguna idea de por que puede presentar este detalle?, de antemano, gracias.

    Responder
      1. abdulet Autor

        Hola sw,

        Lo único que se me ocurre es una direncia entre el servidor y el cliente, ya sea en la hora, la zona horaria o por la librería de conversión. Yo probaría a ejecutar el script desde el propio servidor a ver si el tiempo cuadra. Por favor reporta el resultado, sobre todo si encuentras algún bug!

        Gracias
        Abdul

        Responder
  4. Pedro

    Hola, este script que has creado, me ha resultado muy útil para no tener que entrar a los event logs server a server.

    Tengo un par de cuestiones:
    – Habría alguna manera de poder definir rangos de fechas en los que buscar? para que no busque en todo el log, por ejemplo solo en las ultimas 24 horas.
    – Se podría filtrar únicamente por los “errores” sin “warnings”, habría alguna manera de decirle que me busque todo lo que sea error sin tener que poner todos los errors ID manualmente en el “listado de eventos”???

    Gracias de antemano.

    Responder
    1. abdulet Autor

      Hola Pedro,

      Para la primera preguna, la respuesta es no, lo que puedes hacer es simular que ya has ejecutado el script añadiendo la fecha en el archivo last-event-time.txt con el formato “IP_del_servidor$fecha y hora%”, así en la próxima ejecución tan solo recogerá los eventos más recientes de dicha fecha.

      Para la segunda pregunta, lamentablemente la respuesta también es que no, el script lo realicé para recoger unos eventos concretos, creo recordar que si indicas un * recoge todos los eventos pero no está diseñado para recoger eventos por categorías 🙁 pero no creo que sea muy complicado adaptarlo 😉

      Saludos

      Responder

Deja un comentario

Tu dirección de correo electrónico no será publicada.