Ce script Python fournit des fonctions pour analyser différents types de journaux : journaux d'URL, journaux de pare-feu et journaux d'événements. Chaque fonction utilise des expressions régulières pour extraire les informations pertinentes d'une entrée de journal et renvoie un dictionnaire avec les données analysées.
Le serveur Syslog a été configuré en suivant le guide ici : https://documentation.meraki.com/General_Administration/Monitoring_and_Reporting/Syslog_Server_Overview_and_Configuration
Des exemples Meraki Syslog peuvent être trouvés ici : https://documentation.meraki.com/General_Administration/Monitoring_and_Reporting/Syslog_Event_Types_and_Log_Samples
J'ai créé ce script simple pour récupérer les 100 meilleurs sites Web. Vous pouvez exécuter sur une machine derrière le Meraki MX, et cela générera beaucoup de Syslog.
https://github.com/repenno/top_100
J'ai développé ce script pour analyser les Syslogs dans des objets JSON et les insérer dans une VectorDB prenant en charge les requêtes d'échelle de temps.
J'utilise Langchain et OpenAI pour créer des chatbots à la demande pour les incidents de sécurité et rechercher des informations sur les événements de réseau.
parse_url_log(log_entry: str) -> dict
: analyse les journaux d'URL.parse_firewall_log(log_entry: str) -> dict
: analyse les journaux du pare-feu.parse_event_log(log_entry: str) -> dict
: analyse les journaux d'événements. Décomposons les expressions régulières utilisées dans le script :
Méthode parse_url_log :
Le modèle d'expression régulière utilisé dans cette méthode est conçu pour correspondre aux entrées du journal d'URL. Voici une répartition du modèle :
(?P<date>w{3}s+d{1,2}s+d{2}:d{2}:d{2})
: Cette partie du modèle correspond à la date. w{3}
correspond à n'importe quel caractère de mot (égal à [a-zA-Z0-9_]) exactement 3 fois, ce qui correspond à l'abréviation à trois lettres du jour de la semaine (lundi, mardi, etc.). s+
correspond à n’importe quel caractère d’espacement (espaces, tabulations, sauts de ligne) une ou plusieurs fois. d{1,2}
correspond à n'importe quel chiffre (égal à [0-9]) entre 1 et 2 fois, ce qui correspond au jour du mois (1-31). d{2}:d{2}:d{2}
correspond à l'heure au format HH:MM:SS.
(?P<ip>d{1,3}.d{1,3}.d{1,3}.d{1,3})
: Cette partie du modèle correspond à une adresse IP adresse. d{1,3}
correspond à n'importe quel chiffre entre 1 et 3 fois, ce qui correspond à chaque octet d'une adresse IP (0-255). Le .
correspond à un point littéral.
(?P<id>d+.d+)
: Cette partie du modèle correspond à un identifiant composé d'un ou plusieurs chiffres, d'un point et d'un ou plusieurs chiffres.
(?P<user>w+)
: Cette partie du modèle correspond à un nom d'utilisateur composé d'un ou plusieurs caractères de mot.
(?P<type>w+)
: Cette partie du modèle correspond à un type composé d'un ou plusieurs caractères de mot.
src=(?P<src>d{1,3}.d{1,3}.d{1,3}.d{1,3}:d+)
: Cette partie de le modèle correspond à une adresse IP source et à un port. La structure est similaire au modèle d'adresse IP ci-dessus, mais avec :d+
à la fin pour correspondre au numéro de port.
dst=(?P<dst>d{1,3}.d{1,3}.d{1,3}.d{1,3}:d+)
: Cette partie de le modèle correspond à une adresse IP et un port de destination. La structure est similaire à l'adresse IP source et au modèle de port ci-dessus.
mac=(?P<mac>[0-9A-Fa-f:]{17})
: Cette partie du modèle correspond à une adresse MAC. [0-9A-Fa-f:]
correspond à n'importe quel chiffre ou lettre de A à F (en majuscule ou en minuscule) ou à deux points. {17}
spécifie que ce modèle doit comporter exactement 17 caractères pour correspondre à un format d'adresse MAC.
agent='(?P<agent>.+?)'
: Cette partie du modèle correspond à une chaîne d'agent utilisateur entourée de guillemets simples.
request:s+(?P<request>w+s+w+://.+)
: Cette partie du modèle correspond à une méthode de requête et à une URL.
Méthode parse_firewall_log :
Le modèle d'expression régulière utilisé dans cette méthode est conçu pour correspondre aux entrées du journal du pare-feu. Il est similaire au modèle d'entrée du journal URL mais inclut des champs supplémentaires spécifiques aux journaux du pare-feu tels que le protocole, le sport (port source), le dport (port de destination) et le modèle.
Méthode parse_event_log :
Le modèle d'expression régulière utilisé dans cette méthode est conçu pour correspondre aux entrées du journal des événements. Il est similaire aux modèles précédents mais inclut des champs supplémentaires spécifiques aux journaux d'événements tels que event_type, url,category (facultatif), server et client_mac.
Chaque groupe de ces modèles est nommé à l'aide ?P<name>
, ce qui facilite l'extraction d'informations spécifiques à partir d'une entrée de journal.
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 )
La sortie de chaque fonction est un dictionnaire avec les données analysées de l'entrée du journal.
{ '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' }
Ce script nécessite le module re
intégré de Python pour les expressions régulières.
Les demandes de tirage sont les bienvenues ! Pour les changements majeurs, veuillez d'abord ouvrir un ticket pour discuter de ce que vous souhaitez changer.