Skrip Python ini menyediakan fungsi untuk mengurai berbagai jenis log: log URL, log firewall, dan log peristiwa. Setiap fungsi menggunakan ekspresi reguler untuk mengekstrak informasi yang relevan dari entri log dan mengembalikan kamus dengan data yang diurai.
Server Syslog dikonfigurasikan dengan mengikuti panduan di sini: https://documentation.meraki.com/General_Administration/Monitoring_and_Reporting/Syslog_Server_Overview_and_Configuration
Contoh Meraki Syslog dapat ditemukan di sini: https://documentation.meraki.com/General_Administration/Monitoring_and_Reporting/Syslog_Event_Types_and_Log_Samples
Saya membuat skrip sederhana ini untuk mengikis 100 situs web teratas. Anda dapat menjalankannya di mesin di belakang Meraki MX, dan itu akan menghasilkan banyak Syslog.
https://github.com/repenno/top_100
Saya mengembangkan skrip ini untuk mengurai Syslogs menjadi objek JSON dan memasukkannya ke dalam VectorDB yang mendukung kueri skala waktu.
Saya menggunakan Langchain dan OpenAI untuk membuat chatbot sesuai permintaan untuk insiden keamanan dan meneliti wawasan tentang peristiwa jaringan.
parse_url_log(log_entry: str) -> dict
: Mem-parsing log URL.parse_firewall_log(log_entry: str) -> dict
: Mengurai log firewall.parse_event_log(log_entry: str) -> dict
: Mengurai log peristiwa. Mari kita uraikan ekspresi reguler yang digunakan dalam skrip:
metode parse_url_log:
Pola ekspresi reguler yang digunakan dalam metode ini dirancang untuk mencocokkan entri log URL. Berikut rincian polanya:
(?P<date>w{3}s+d{1,2}s+d{2}:d{2}:d{2})
: Bagian pola ini cocok dengan tanggal. w{3}
cocok dengan karakter kata apa pun (sama dengan [a-zA-Z0-9_]) tepat 3 kali, yang sesuai dengan singkatan tiga huruf untuk hari dalam seminggu (Senin, Selasa, dll.). s+
cocok dengan karakter spasi apa pun (spasi, tab, jeda baris) satu kali atau lebih. d{1,2}
cocok dengan digit apa pun (sama dengan [0-9]) antara 1 dan 2 kali, yang sesuai dengan hari dalam sebulan (1-31). d{2}:d{2}:d{2}
cocok dengan waktu dalam format HH:MM:SS.
(?P<ip>d{1,3}.d{1,3}.d{1,3}.d{1,3})
: Bagian pola ini cocok dengan IP alamat. d{1,3}
cocok dengan digit apa pun antara 1 dan 3 kali, yang sesuai dengan setiap oktet alamat IP (0-255). .
cocok dengan titik literal.
(?P<id>d+.d+)
: Bagian pola ini cocok dengan ID yang terdiri dari satu atau lebih digit, sebuah titik, dan satu atau lebih digit.
(?P<user>w+)
: Bagian pola ini cocok dengan nama pengguna yang terdiri dari satu atau lebih karakter kata.
(?P<type>w+)
: Bagian pola ini cocok dengan tipe yang terdiri dari satu atau lebih karakter kata.
src=(?P<src>d{1,3}.d{1,3}.d{1,3}.d{1,3}:d+)
: Bagian ini polanya cocok dengan alamat IP sumber dan port. Strukturnya mirip dengan pola alamat IP di atas, tetapi dengan :d+
di akhir untuk mencocokkan nomor port.
dst=(?P<dst>d{1,3}.d{1,3}.d{1,3}.d{1,3}:d+)
: Bagian ini polanya cocok dengan alamat IP dan port tujuan. Strukturnya mirip dengan alamat IP sumber dan pola port di atas.
mac=(?P<mac>[0-9A-Fa-f:]{17})
: Bagian pola ini cocok dengan alamat MAC. [0-9A-Fa-f:]
cocok dengan digit atau huruf apa pun dari A hingga F (dalam huruf besar atau kecil) atau titik dua. {17}
menetapkan bahwa pola ini harus sepanjang 17 karakter agar sesuai dengan format alamat MAC.
agent='(?P<agent>.+?)'
: Bagian pola ini cocok dengan string agen pengguna yang diapit tanda kutip tunggal.
request:s+(?P<request>w+s+w+://.+)
: Bagian pola ini cocok dengan metode permintaan dan URL.
metode parse_firewall_log:
Pola ekspresi reguler yang digunakan dalam metode ini dirancang untuk mencocokkan entri log firewall. Ini mirip dengan pola entri log URL tetapi mencakup bidang tambahan khusus untuk log firewall seperti protokol, olahraga (port sumber), dport (port tujuan), dan pola.
metode parse_event_log:
Pola ekspresi reguler yang digunakan dalam metode ini dirancang untuk mencocokkan entri log peristiwa. Ini mirip dengan pola sebelumnya tetapi mencakup bidang tambahan khusus untuk log peristiwa seperti event_type, url, kategori (opsional), server, dan client_mac.
Setiap grup dalam pola ini diberi nama menggunakan ?P<name>
, yang membuatnya lebih mudah untuk mengekstrak informasi tertentu dari entri log.
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 )
Output dari setiap fungsi adalah kamus dengan data yang diurai dari entri 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' }
Skrip ini memerlukan modul re
bawaan Python untuk ekspresi reguler.
Permintaan tarik dipersilakan! Untuk perubahan besar, silakan buka terbitan terlebih dahulu untuk mendiskusikan apa yang ingin Anda ubah.