يوفر برنامج 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
لقد قمت بتطوير هذا البرنامج النصي لتحليل Syslogs إلى كائنات 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}
يطابق أي رقم (يساوي [0-9]) بين 1 و2 مرات، وهو ما يتوافق مع اليوم من الشهر (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+)
: يتطابق هذا الجزء من النمط مع معرف يتكون من رقم واحد أو أكثر، ونقطة، ورقم واحد أو أكثر.
(?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 ولكنه يتضمن حقول إضافية خاصة بسجلات جدار الحماية مثل البروتوكول والرياضة (المنفذ المصدر) وdport (منفذ الوجهة) والنمط.
طريقة parse_event_log:
تم تصميم نمط التعبير العادي المستخدم في هذه الطريقة لمطابقة إدخالات سجل الأحداث. إنه مشابه للأنماط السابقة ولكنه يتضمن حقولًا إضافية خاصة بسجلات الأحداث مثل events_type وurl والفئة (اختياري) والخادم و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' }
يتطلب هذا البرنامج النصي وحدة re
مدمجة في Python للتعبيرات العادية.
طلبات السحب هي موضع ترحيب! لإجراء تغييرات كبيرة، يرجى فتح مشكلة أولاً لمناقشة ما تريد تغييره.