Dieses Python-Skript bietet Funktionen zum Parsen verschiedener Protokolltypen: URL-Protokolle, Firewall-Protokolle und Ereignisprotokolle. Jede Funktion verwendet reguläre Ausdrücke, um relevante Informationen aus einem Protokolleintrag zu extrahieren und gibt ein Wörterbuch mit den analysierten Daten zurück.
Der Syslog-Server wurde gemäß der Anleitung hier konfiguriert: https://documentation.meraki.com/General_Administration/Monitoring_and_Reporting/Syslog_Server_Overview_and_Configuration
Meraki-Syslog-Beispiele finden Sie hier: https://documentation.meraki.com/General_Administration/Monitoring_and_Reporting/Syslog_Event_Types_and_Log_Samples
Ich habe dieses einfache Skript erstellt, um die Top 100 Websites zu durchsuchen. Sie können es auf einer Maschine hinter dem Meraki MX ausführen und es wird eine Menge Syslog generiert.
https://github.com/repenno/top_100
Ich habe dieses Skript entwickelt, um Syslogs in JSON-Objekte zu analysieren und in eine VectorDB einzufügen, die Zeitskalenabfragen unterstützt.
Ich verwende Langchain und OpenAI, um On-Demand-Chatbots für Sicherheitsvorfälle zu erstellen und Erkenntnisse zu Netzwerkereignissen zu recherchieren.
parse_url_log(log_entry: str) -> dict
: Analysiert URL-Protokolle.parse_firewall_log(log_entry: str) -> dict
: Analysiert Firewall-Protokolle.parse_event_log(log_entry: str) -> dict
: Analysiert Ereignisprotokolle. Lassen Sie uns die im Skript verwendeten regulären Ausdrücke aufschlüsseln:
parse_url_log-Methode:
Das in dieser Methode verwendete reguläre Ausdrucksmuster ist darauf ausgelegt, URL-Protokolleinträge abzugleichen. Hier ist eine Aufschlüsselung des Musters:
(?P<date>w{3}s+d{1,2}s+d{2}:d{2}:d{2})
: Dieser Teil des Musters entspricht dem Datum. w{3}
stimmt genau dreimal mit jedem Wortzeichen (gleich [a-zA-Z0-9_]) überein, was der dreibuchstabigen Abkürzung für den Wochentag (Mo, Di usw.) entspricht. s+
entspricht einmal oder mehrmals jedem Leerzeichen (Leerzeichen, Tabulatoren, Zeilenumbrüche). d{1,2}
stimmt ein- bis zweimal mit einer beliebigen Ziffer (gleich [0-9]) überein, die dem Tag des Monats (1-31) entspricht. d{2}:d{2}:d{2}
entspricht der Uhrzeit im Format HH:MM:SS.
(?P<ip>d{1,3}.d{1,3}.d{1,3}.d{1,3})
: Dieser Teil des Musters entspricht einer IP Adresse. d{1,3}
entspricht jeder Ziffer zwischen 1 und 3 Mal, was jedem Oktett einer IP-Adresse (0-255) entspricht. Der .
entspricht einem wörtlichen Punkt.
(?P<id>d+.d+)
: Dieser Teil des Musters entspricht einer ID, die aus einer oder mehreren Ziffern, einem Punkt und einer oder mehreren Ziffern besteht.
(?P<user>w+)
: Dieser Teil des Musters entspricht einem Benutzernamen, der aus einem oder mehreren Wortzeichen besteht.
(?P<type>w+)
: Dieser Teil des Musters entspricht einem Typ, der aus einem oder mehreren Wortzeichen besteht.
src=(?P<src>d{1,3}.d{1,3}.d{1,3}.d{1,3}:d+)
: Dieser Teil von Das Muster entspricht einer Quell-IP-Adresse und einem Quell-Port. Die Struktur ähnelt dem obigen IP-Adressmuster, jedoch mit :d+
am Ende, um der Portnummer zu entsprechen.
dst=(?P<dst>d{1,3}.d{1,3}.d{1,3}.d{1,3}:d+)
: Dieser Teil von Das Muster entspricht einer Ziel-IP-Adresse und einem Ziel-Port. Die Struktur ähnelt der Quell-IP-Adresse und dem Portmuster oben.
mac=(?P<mac>[0-9A-Fa-f:]{17})
: Dieser Teil des Musters entspricht einer MAC-Adresse. [0-9A-Fa-f:]
entspricht einer beliebigen Ziffer oder einem beliebigen Buchstaben von A bis F (entweder in Groß- oder Kleinbuchstaben) oder einem Doppelpunkt. {17}
gibt an, dass dieses Muster genau 17 Zeichen lang sein sollte, um einem MAC-Adressformat zu entsprechen.
agent='(?P<agent>.+?)'
: Dieser Teil des Musters entspricht einer in einfache Anführungszeichen eingeschlossenen Benutzeragentenzeichenfolge.
request:s+(?P<request>w+s+w+://.+)
: Dieser Teil des Musters entspricht einer Anforderungsmethode und einer URL.
parse_firewall_log-Methode:
Das in dieser Methode verwendete reguläre Ausdrucksmuster ist so konzipiert, dass es mit Firewall-Protokolleinträgen übereinstimmt. Es ähnelt dem URL-Protokolleintragsmuster, enthält jedoch zusätzliche Felder, die speziell für Firewall-Protokolle gelten, z. B. Protokoll, Sport (Quellport), Dport (Zielport) und Muster.
parse_event_log-Methode:
Das in dieser Methode verwendete reguläre Ausdrucksmuster ist so konzipiert, dass es mit Ereignisprotokolleinträgen übereinstimmt. Es ähnelt den vorherigen Mustern, enthält jedoch zusätzliche Felder speziell für Ereignisprotokolle wie „event_type“, „url“, „category“ (optional), „server“ und „client_mac“.
Jede Gruppe in diesen Mustern wird mit ?P<name>
benannt, was das Extrahieren bestimmter Informationen aus einem Protokolleintrag erleichtert.
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 )
Die Ausgabe jeder Funktion ist ein Wörterbuch mit den analysierten Daten aus dem Protokolleintrag.
{ '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' }
Dieses Skript erfordert das in Python integrierte re
Modul für reguläre Ausdrücke.
Pull-Anfragen sind willkommen! Bei größeren Änderungen öffnen Sie bitte zunächst ein Problem, um zu besprechen, was Sie ändern möchten.