此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
模組來執行正規表示式。
歡迎拉取請求!對於重大更改,請先開啟一個問題來討論您想要更改的內容。