この 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 の Web サイトを収集するために、この単純なスクリプトを作成しました。 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 回正確に一致します。これは、曜日 (月曜日、火曜日など) の 3 文字の省略形に相当します。 s+
任意の空白文字 (スペース、タブ、改行) に 1 回以上一致します。 d{1,2}
、月の日 (1 ~ 31) に対応する、1 ~ 2 回の任意の数字 ([0 ~ 9] に等しい) と一致します。 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}
IP アドレス (0 ~ 255) の各オクテットに対応する、1 ~ 3 回の範囲の任意の数字と一致します。 .
リテラルのドットと一致します。
(?P<id>d+.d+)
: パターンのこの部分は、1 つ以上の数字、ドット、および 1 つ以上の数字で構成される ID と一致します。
(?P<user>w+)
: パターンのこの部分は、1 つ以上の単語文字で構成されるユーザー名と一致します。
(?P<type>w+)
: パターンのこの部分は、1 つ以上の単語文字で構成されるタイプと一致します。
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}
、MAC アドレス形式と一致するために、このパターンの長さがちょうど 17 文字である必要があることを指定します。
agent='(?P<agent>.+?)'
: パターンのこの部分は、一重引用符で囲まれたユーザー エージェント文字列と一致します。
request:s+(?P<request>w+s+w+://.+)
: パターンのこの部分はリクエスト メソッドと URL に一致します。
parse_firewall_log メソッド:
この方法で使用される正規表現パターンは、ファイアウォールのログ エントリと一致するように設計されています。これは URL ログ エントリ パターンに似ていますが、プロトコル、スポーツ (送信元ポート)、dポート (宛先ポート)、パターンなどのファイアウォール ログに固有の追加フィールドが含まれています。
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
モジュールが必要です。
プルリクエストは大歓迎です!大きな変更の場合は、まず問題を開いて、変更したい内容について話し合ってください。