Este script de Python proporciona funciones para analizar diferentes tipos de registros: registros de URL, registros de firewall y registros de eventos. Cada función utiliza expresiones regulares para extraer información relevante de una entrada de registro y devuelve un diccionario con los datos analizados.
El servidor Syslog se configuró siguiendo la guía aquí: https://documentation.meraki.com/General_Administration/Monitoring_and_Reporting/Syslog_Server_Overview_and_Configuration
Se pueden encontrar ejemplos de Meraki Syslog aquí: https://documentation.meraki.com/General_Administration/Monitoring_and_Reporting/Syslog_Event_Types_and_Log_Samples
Creé este sencillo script para seleccionar los 100 sitios web principales. Puede ejecutarlo en una máquina detrás de Meraki MX y generará una gran cantidad de Syslog.
https://github.com/repenno/top_100
Desarrollé este script para analizar Syslogs en objetos JSON e insertarlos en un VectorDB que admita consultas de escala de tiempo.
Utilizo Langchain y OpenAI para crear chatbots bajo demanda para incidentes de seguridad e investigar información sobre eventos de networking.
parse_url_log(log_entry: str) -> dict
: analiza los registros de URL.parse_firewall_log(log_entry: str) -> dict
: analiza los registros del firewall.parse_event_log(log_entry: str) -> dict
: analiza registros de eventos. Analicemos las expresiones regulares utilizadas en el script:
método parse_url_log:
El patrón de expresión regular utilizado en este método está diseñado para coincidir con las entradas del registro de URL. Aquí hay un desglose del patrón:
(?P<date>w{3}s+d{1,2}s+d{2}:d{2}:d{2})
: Esta parte del patrón coincide con la fecha. w{3}
coincide con cualquier carácter de palabra (igual a [a-zA-Z0-9_]) exactamente 3 veces, lo que corresponde a la abreviatura de tres letras del día de la semana (lunes, martes, etc.). s+
coincide con cualquier carácter de espacio en blanco (espacios, tabulaciones, saltos de línea) una o más veces. d{1,2}
coincide con cualquier dígito (igual a [0-9]) entre 1 y 2 veces, lo que corresponde al día del mes (1-31). d{2}:d{2}:d{2}
coincide con la hora en formato HH:MM:SS.
(?P<ip>d{1,3}.d{1,3}.d{1,3}.d{1,3})
: Esta parte del patrón coincide con una IP DIRECCIÓN. d{1,3}
coincide con cualquier dígito entre 1 y 3 veces, lo que corresponde a cada octeto de una dirección IP (0-255). El .
coincide con un punto literal.
(?P<id>d+.d+)
: esta parte del patrón coincide con un ID que consta de uno o más dígitos, un punto y uno o más dígitos.
(?P<user>w+)
: esta parte del patrón coincide con un nombre de usuario que consta de uno o más caracteres de palabra.
(?P<type>w+)
: esta parte del patrón coincide con un tipo que consta de uno o más caracteres de palabra.
src=(?P<src>d{1,3}.d{1,3}.d{1,3}.d{1,3}:d+)
: Esta parte de el patrón coincide con una dirección IP y un puerto de origen. La estructura es similar al patrón de dirección IP anterior, pero con :d+
al final para que coincida con el número de puerto.
dst=(?P<dst>d{1,3}.d{1,3}.d{1,3}.d{1,3}:d+)
: Esta parte de el patrón coincide con una dirección IP y un puerto de destino. La estructura es similar a la dirección IP de origen y al patrón de puerto anteriores.
mac=(?P<mac>[0-9A-Fa-f:]{17})
: esta parte del patrón coincide con una dirección MAC. [0-9A-Fa-f:]
coincide con cualquier dígito o letra de la A a la F (ya sea en mayúsculas o minúsculas) o dos puntos. {17}
especifica que este patrón debe tener exactamente 17 caracteres para coincidir con el formato de dirección MAC.
agent='(?P<agent>.+?)'
: esta parte del patrón coincide con una cadena de agente de usuario entre comillas simples.
request:s+(?P<request>w+s+w+://.+)
: esta parte del patrón coincide con un método de solicitud y una URL.
método parse_firewall_log:
El patrón de expresión regular utilizado en este método está diseñado para coincidir con las entradas del registro del firewall. Es similar al patrón de entrada del registro de URL, pero incluye campos adicionales específicos de los registros del firewall, como protocolo, deporte (puerto de origen), dport (puerto de destino) y patrón.
método parse_event_log:
El patrón de expresión regular utilizado en este método está diseñado para coincidir con las entradas del registro de eventos. Es similar a los patrones anteriores, pero incluye campos adicionales específicos de los registros de eventos, como event_type, url, categoría (opcional), server y client_mac.
Cada grupo en estos patrones recibe un nombre usando ?P<name>
, lo que facilita la extracción de información específica de una entrada de registro.
fw_log_entry = "Oct 2 21:22:43 192.168.128.1 1 1696306963.825147405 satosugu firewall src=fe80::cde:941e:d4ef:3d22 dst=ff02::fb protocol=udp sport=5353 dport=5353 pattern: 1 all"
parsed_log = MerakiMXSyslogParser . parse_firewall_log ( fw_log_entry )
print ( parsed_log )
url_log_entry = "Oct 2 21:18:42 192.168.128.1 1 1696306722.864107379 satosugu urls src=192.168.128.3:58754 dst=192.229.211.108:80 mac=0C:4D:E9:BE:F4:B2 agent='Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/118.0' request: POST http://ocsp.digicert.com/"
parsed_log = MerakiMXSyslogParser . parse_url_log ( url_log_entry )
print ( parsed_log )
event_log_entry = "Oct 2 21:09:28 192.168.128.1 1 1696306168.009553886 satosugu events content_filtering_block url='https://youtube.com/...' category0='User-defined Blacklist' server='192.178.50.78:443' client_mac='0C:4D:E9:BE:F4:B2'"
parsed_log = MerakiMXSyslogParser . parse_event_log ( event_log_entry )
print ( parsed_log )
event_log_entry = "Oct 2 21:12:00 192.168.128.1 1 1696306320.822027826 satosugu events content_filtering_block url='https://xvideos.com/...' server='185.88.181.2:443' client_mac='0C:4D:E9:BE:F4:B2'"
parsed_log = MerakiMXSyslogParser . parse_event_log ( event_log_entry )
print ( parsed_log )
La salida de cada función es un diccionario con los datos analizados de la entrada del registro.
{ 'date' : 'Oct 2 21:22:43' , 'ip' : '192.168.128.1' , 'id' : '1696306963.825147405' , 'user' : 'satosugu' , 'type' : 'firewall' , 'src' : 'fe80::cde:941e:d4ef:3d22' , 'dst' : 'ff02::fb' , 'protocol' : 'udp' , 'sport' : '5353' , 'dport' : '5353' , 'pattern' : '1 all' }
{ 'date' : 'Oct 2 21:18:42' , 'ip' : '192.168.128.1' , 'id' : '1696306722.864107379' , 'user' : 'satosugu' , 'type' : 'urls' , 'src' : '192.168.128.3:58754' , 'dst' : '192.229.211.108:80' , 'mac' : '0C:4D:E9:BE:F4:B2' , 'agent' : 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/118.0' , 'request' : 'POST http://ocsp.digicert.com/' }
{ 'date' : 'Oct 2 21:09:28' , 'ip' : '192.168.128.1' , 'id' : '1696306168.009553886' , 'user' : 'satosugu' , 'type' : 'events' , 'event_type' : 'content_filtering_block' , 'url' : 'https://youtube.com/...' , 'category' : 'User-defined Blacklist' , 'server' : '192.178.50.78:443' , 'client_mac' : '0C:4D:E9:BE:F4:B2' }
{ 'date' : 'Oct 2 21:12:00' , 'ip' : '192.168.128.1' , 'id' : '1696306320.822027826' , 'user' : 'satosugu' , 'type' : 'events' , 'event_type' : 'content_filtering_block' , 'url' : 'https://xvideos.com/...' , 'category' : None , 'server' : '185.88.181.2:443' , 'client_mac' : '0C:4D:E9:BE:F4:B2' }
Este script requiere el módulo re
integrado de Python para expresiones regulares.
¡Las solicitudes de extracción son bienvenidas! Para cambios importantes, primero abra un problema para discutir lo que le gustaría cambiar.