该Python脚本提供了解析不同类型日志的功能:URL日志、防火墙日志和事件日志。每个函数都使用正则表达式从日志条目中提取相关信息,并返回包含已解析数据的字典。
Syslog 服务器是按照此处的指南进行配置的:https://documentation.meraki.com/General_Administration/Monitoring_and_Reporting/Syslog_Server_Overview_and_Configuration
Meraki Syslog 示例可在此处找到:https://documentation.meraki.com/General_Administration/Monitoring_and_Reporting/Syslog_Event_Types_and_Log_Samples
我创建了这个简单的脚本来抓取前 100 个网站。您可以在 Meraki MX 后面的机器上运行,它会生成大量 Syslog。
https://github.com/repenno/top_100
我开发了这个脚本来将 Syslog 解析为 JSON 对象并插入到支持时间刻度查询的 VectorDB 中。
我使用 Langchain 和 OpenAI 创建按需聊天机器人来处理安全事件并研究网络事件的见解。
parse_url_log(log_entry: str) -> dict
:解析 URL 日志。parse_firewall_log(log_entry: str) -> dict
:解析防火墙日志。parse_event_log(log_entry: str) -> dict
:解析事件日志。 让我们分解一下脚本中使用的正则表达式:
parse_url_log方法:
此方法中使用的正则表达式模式旨在匹配 URL 日志条目。以下是该模式的细分:
(?P<date>w{3}s+d{1,2}s+d{2}:d{2}:d{2})
:模式的这一部分与日期匹配。 w{3}
与任何单词字符(等于 [a-zA-Z0-9_])精确匹配 3 次,这对应于一周中的某一天(Mon、Tue 等)的三个字母缩写。 s+
匹配任何空白字符(空格、制表符、换行符)一次或多次。 d{1,2}
匹配 1 到 2 次之间的任何数字(等于 [0-9]),对应于月份中的日期 (1-31)。 d{2}:d{2}:d{2}
匹配 HH:MM:SS 格式的时间。
(?P<ip>d{1,3}.d{1,3}.d{1,3}.d{1,3})
:模式的这一部分与 IP 匹配地址。 d{1,3}
匹配 1 到 3 次之间的任何数字,对应于 IP 地址的每个八位字节 (0-255)。这.
匹配文字点。
(?P<id>d+.d+)
:模式的这一部分匹配由一位或多位数字、一个点以及一位或多位数字组成的 ID。
(?P<user>w+)
:模式的这一部分与由一个或多个单词字符组成的用户名匹配。
(?P<type>w+)
:模式的这一部分与由一个或多个单词字符组成的类型匹配。
src=(?P<src>d{1,3}.d{1,3}.d{1,3}.d{1,3}:d+)
:这部分该模式与源 IP 地址和端口匹配。该结构与上面的 IP 地址模式类似,但末尾带有:d+
以匹配端口号。
dst=(?P<dst>d{1,3}.d{1,3}.d{1,3}.d{1,3}:d+)
:这部分该模式与目标 IP 地址和端口匹配。该结构类似于上面的源IP地址和端口模式。
mac=(?P<mac>[0-9A-Fa-f:]{17})
:模式的这一部分与 MAC 地址匹配。 [0-9A-Fa-f:]
匹配从 A 到 F 的任何数字或字母(大写或小写)或冒号。 {17}
指定此模式的长度应恰好为 17 个字符,以匹配 MAC 地址格式。
agent='(?P<agent>.+?)'
:模式的这一部分与用单引号括起来的用户代理字符串匹配。
request:s+(?P<request>w+s+w+://.+)
:模式的这一部分匹配请求方法和 URL。
parse_firewall_log方法:
此方法中使用的正则表达式模式旨在匹配防火墙日志条目。它与 URL 日志条目模式类似,但包含特定于防火墙日志的其他字段,例如协议、sport(源端口)、dport(目标端口)和模式。
parse_event_log方法:
此方法中使用的正则表达式模式旨在匹配事件日志条目。它与之前的模式类似,但包含特定于事件日志的附加字段,例如 event_type、url、category(可选)、server 和 client_mac。
这些模式中的每个组都使用?P<name>
命名,这使得从日志条目中提取特定信息变得更加容易。
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 )
每个函数的输出是一个字典,其中包含来自日志条目的已解析数据。
{ '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' }
该脚本需要 Python 的内置re
模块来执行正则表达式。
欢迎请求请求!对于重大更改,请先打开一个问题来讨论您想要更改的内容。