مساء الخير
أريد أن أخبرك مدى سهولة وطبيعية تكوين خادم جمع بيانات تعريف حركة مرور الشبكة لأجهزة توجيه Mikrotik.
الغرض: سيكون الهدف تخزين سجلات جدار الحماية "المضغ" في قاعدة بيانات لمزيد من التحليل.
الوسائل: أي توزيع جديد لـ Linux مع rsyslogd v8 والإصدارات الأحدث مناسب للتنفيذ ، ربما ستعمل الصيغة المقترحة على الإصدار 7 أيضًا. نحن بحاجة أيضًا إلى نظام إدارة قواعد البيانات ، اخترت mariadb. سيختلف نمو قاعدة البيانات اعتمادًا على عدد القواعد المسجلة ، لأن حجم محرك الأقراص حسب تقديرك ، في حالتي ، يتم تسجيل 30-40 قاعدة ، وهو ما يقرب من 1200 ألف سطر في اليوم. خلال شهر استخدام قاعدة البيانات ، بما في ذلك الفهارس ، نمت إلى 3.8 غيغابايت.
الميكانيكا: يرسل جهاز التوجيه سجلًا إلى الخادم البعيد عبر UDP. باستخدام التعبيرات العادية ، يقوم خادم rsyslog بتنظيف سلاسل المعلومات غير الضرورية ، ويقوم بإنشاء إدراج SQL وإرساله إلى نظام إدارة قواعد البيانات. يقوم DBMS ، باستخدام مشغل قبل الإدراج ، بإجراء تنظيف إضافي وفصل للحقول التي لا يمكن تحليلها في rsyslog.
تكوين RSYSLOG
تحرير الملف /etc/rsyslog.conf
أضف الأسطر التالية هناك:
module(load="ommysql") module(load="imudp") input(type="imudp" port="514")
وبالتالي ، نقوم بتحميل الوحدات اللازمة ونفتح منفذ 514 UDP.
يبدو خط السجل من Mikrotik كما يلي:
20180927155341 BLOCKSMKNETS forward: in:ether6 - LocalTORF out:VLAN55 - RT_INET, src-mac 00:15:17:31:b8:d7, proto TCP (SYN), 192.168.0.234:2457->192.168.6.14:65535, len 60
كما ترون ، سيكون من الصعب تخزين الكثير من الإضافات في قاعدة البيانات واختيار واضح.
من الناحية النظرية ، أحتاج إلى إضافة هذه البيانات:
20180927155341 ether6 VLAN5 192.168.0.234 2457 192.168.6.14 65535 00:15:17:31:b8:d7 TCP SYN forward BLOCKSMKNETS 60
لم أستطع الحصول على مثل هذا الخط باستخدام rsyslog واحد فقط. يستخدم نظام Rsyslog النظامي POSIX ERE / BRE ، لذلك لا توجد طريقة لتطبيق ميزات مثل lookahead أو lookbehind.
هناك أداة تسمح لك بتصحيح النظامي ، جربه ، ربما يمكنك فصل المنفذ عن العنوان ، وكذلك اسم الواجهة من الداخل: والخروج:. فقط ضع في اعتبارك أن بعض بروتوكولات الرياضة والموانئ مفقودة.
بشكل عام ، كان الناتج كما يلي:
20180927155341 in:ether6 out:VLAN5 192.168.0.234:2457 192.168.6.14:65535 00:15:17:31:b8:d7 TCP (SYN) forward BLOCKSMKNETS 60
هناك وثائق حول كيفية طهي النظام الأساسي rsyslog.
في الشكل النهائي ، سيبدو ملف التكوين لاستلام السجل من Mikrotik /etc/rsyslog.d/20-remote.conf كما يلي:
$template tpl_traflog,"insert into traflog.traffic (datetime, inif, outif, src, dst, smac, proto, flags, chain, logpref, len) values ('%timereported:::date-mysql%', '%msg:R,ERE,0,DFLT,0:in:[a-zA-Z]+[0-9]+|in:<[a-zA-Z]+-[a-zA-Z]+>--end%', '%msg:R,ERE,0,BLANK,0:out:[a-zA-Z]+[0-9]+|out:<[a-zA-Z]+-[a-zA-Z]+>--end%', '%msg:R,ERE,0,DFLT,0:([0-9]+\.){3}[0-9]+[:]?([0-9]+)?--end%', '%msg:R,ERE,0,DFLT,1:([0-9]+\.){3}[0-9]+[:]?([0-9]+)?--end%', '%msg:R,ERE,0,BLANK:([0-f]+:){5}[0-f]+--end%', '%msg:R,ERE,0,BLANK:\b[AX]{3,4}\b--end%', '%msg:R,ERE,0,BLANK:\([AZ]+\)|\(([AZ]+\,){1,3}[AZ]+\)--end%', '%msg:R,ERE,0,DFLT:[ax]+--end%', '%msg:F,32:2%', '%msg:R,ERE,0,DFLT:[0-9]+$--end%' )",SQL if ($fromhost-ip == '192.168.0.230') and ($syslogtag contains "firewall") then {action(type="ommysql" server="localhost" serverport="3306" db="traflog" uid="rsyslogger" pwd="rsyslogger" template="tpl_traflog") stop}
في السطر الأول ، وصف القالب (القالب) هو سطر من كود SQL لنقله إلى DBMS.
السطر الثاني هو الشرط الذي سيحدث فيه الإجراء ، أي السجل في DBMS.
تبدو الحالة كما يلي: إذا كان مصدر السجل = 192.168.0.230 (
if ($fromhost-ip == '192.168.0.230')
) وإذا كان سطر msg يحتوي على "جدار حماية" (و (يحتوي $ syslogtag على "جدار حماية")) ، فاستخدم الوحدة النمطية ommysql مع معلمات الاتصال (
then {action(type="ommysql" server="localhost" serverport="3306" db="traflog" uid="rsyslogger" pwd="..."
) نسمي النموذج tpl_traflog (
template="tpl_traflog")
) ، وبعد ذلك نتوقف عن معالجة الخط (
stop}
).
من الممكن أن يكون هناك خطأ في حالتك ، قد يكون ذلك بسبب أسماء الواجهات أو بادئات السجل ، ربما شيء آخر. للتصحيح ، سنقوم بما يلي ، والتعليق على السطر الثاني ، وإضافة نموذج جديد وشرطين جديدين:
$template tpl_traflog_test,"%timereported:::date-mysql% %msg:R,ERE,0,DFLT,0:in:[a-zA-Z]+[0-9]+|in:<[a-zA-Z]+-[a-zA-Z]+>--end% %msg:R,ERE,0,BLANK,0:out:[a-zA-Z]+[0-9]+|out:<[a-zA-Z]+-[a-zA-Z]+>--end% %msg:R,ERE,0,DFLT,0:([0-9]+\.){3}[0-9]+[:]?([0-9]+)?--end% %msg:R,ERE,0,DFLT,1:([0-9]+\.){3}[0-9]+[:]?([0-9]+)?--end% %msg:R,ERE,0,BLANK:([0-f]+:){5}[0-f]+--end% %msg:R,ERE,0,BLANK:\b[AX]{3,4}\b--end% %msg:R,ERE,0,BLANK:\([AZ]+\)|\(([AZ]+\,){1,3}[AZ]+\)--end% %msg:R,ERE,0,DFLT:[ax]+--end% %msg:F,32:2% %msg:R,ERE,0,DFLT:[0-9]+$--end%\n" if ($fromhost-ip == '192.168.0.230') then {action(type="omfile" file="/var/log/remote/192.168.0.230.log" )} if ($fromhost-ip == '192.168.0.230') then {action(type="omfile" file="/var/log/remote/192.168.0.230.log" template="tpl_traflog_test" ) stop}
أعد تشغيل المسجل.
يشبه القالب tpl_traflog_test tpl_traflog ، ولكن بدون SQL INSERT.
يضيف الشرط الأول السطر غير المعالج٪ msg٪ إلى الملف /var/log/remote/192.168.0.230.log ، لأن القالب غير محدد.
الشرط الثاني يضيف السطر الذي تمت معالجته إلى نفس الملف.
لذلك سيكون أكثر ملاءمة للمقارنة.
بعد ذلك ، قم بإعداد قاعدة البيانات.
نستعد DB
سنخفض إعداد DBMS ، كل شيء قياسي هنا.
نبدأ وحدة التحكم الخلية وتنفيذ التعليمات البرمجية التالية:
الجدول جاهز ، المستخدم.
الآن قم بإضافة مشغل ، وسوف يفعل ما فشل المسجل في فصل العنوان عن المنفذ ، وتنظيف أسماء الواجهات ، وإزالة الأقواس من العلم:
يبحث REGEXP_REPLACE عن المعلمة الثانية بعد العلامة العشرية (الموسم العادي) ويستبدلها بالمعامل الثالث ، وفي حالتنا لا يوجد شيء بين علامتي الاقتباس ، وبالتالي فإنه ببساطة يزيل ما يعثر عليه.
فلنقم بإدراج اختبار ، على غرار الطريقة التي سيقوم بها المسجل:
دعنا نرى ما حدث:
select * from tarffic;
إذا كان كل شيء صحيحًا ، فانتقل. إذا لم يكن كذلك ، ابحث عن الخطأ.
أضف فهرس واحد على الأقل. أنا لست خبيرًا في إنشاء الفهارس ، ولكن كما أفهمها ، في mysql ، من الأصح استخدام الفهارس ذات حقول الربط المختلفة للاستعلامات المختلفة ، حيث يمكن أن يستخدم استعلام واحد فهرس واحد فقط (أو هل أنا على خطأ؟). إذا فهمت ، افعل ذلك حسب تقديرك.
غالبًا ما يتعين علي تقديم طلبات ببادئة معينة ، لذلك أضفت هذا الفهرس:
تم.
تحتاج الآن إلى البدء في الإرسال على جهاز التوجيه ، وإضافة إعدادات خادم السجل عن بُعد والإجراء إليه ، وإضافة خيار السجل إلى إحدى قواعد جدار الحماية ، وإضافة بادئة لا تزيد عن 24 حرفًا.
في وحدة تحكم Mikrotik ، يبدو الأمر مثل هذا:
/system logging action set 3 remote=192.168.0.94 src-address=192.168.0.230 add name=remote2 remote=192.168.0.19 syslog-facility=local6 target=remote /system logging add action=remote topics=error,account,critical,event,info add action=remote2 topics=firewall /ip firewall filter ... add action=drop chain=input comment="drop ssh brute forcers" dst-port=22,8291 log=yes log-prefix=DROP_SSH_BRUTE protocol=tcp src-address-list=ssh_blacklist ...
حيث 192.168.0.230 هو عنوان جهاز التوجيه ، 192.168.0.19 هو عنوان خادم السجل لسجلات جدار الحماية ، و 192.168.0.94 هو خادم سجل آخر ، لدي سجلات نظام Mikrotik هناك ، نحن لسنا بحاجة إليه الآن. إعدادنا بعيد 2.
بعد ذلك ، انظر ما يندرج في الملف:
tail -f /var/log/remote/192.168.0.230.log
يجب أن تنتقل الخطوط من جهاز التوجيه إلى الملف ، ما لم يتم تشغيل القاعدة الخاصة بك في كثير من الأحيان.
إذا كانت بعض الحقول مفقودة ، أي أن وقت التسلسل و inif و outif و src و dst و smac و proto و flags و chain و logpref و len غير متبوع ، فيمكنك محاولة تغيير المعلمة في قوالب تصحيح الأخطاء في المسجل ، واستبدال BLANK بـ DLFT. ثم بدلاً من فراغ أي حقل ، ستظهر بعض الحروف ، ولا أتذكر أيًا منها بالفعل. إذا حدث ذلك ، فهذا يعني أن هناك خطأ ما في الجدول العادي وتحتاج إلى إصلاحه.
إذا سار كل شيء كما ينبغي ، فقم بإيقاف شروط الاختبار والقالب.
تحتاج أيضًا إلى تشغيل التهيئة الافتراضية في /etc/rsyslog.d/ أدناه ، وأعدت تسميته إلى 50-default.conf بحيث لا يتم سكب السجلات البعيدة في سجل النظام / var / log / message
أعد تشغيل المسجل.
دعنا ننتظر قليلاً حتى تمتلئ قاعدة بياناتنا. ثم يمكننا أن نبدأ التحديد.
بعض الاستفسارات كمثال:لمعرفة حجم قاعدة البيانات وعدد الصفوف: MariaDB [traflog]> select table_schema as "database", round(sum(data_length + index_length)/1024/1024,2) as "size Mb", TABLE_ROWS as "count rows" from information_schema.tables group by table_schema; +
نما ما يقرب من 4 غيغابايت في الشهر ، لكنه يعتمد على عدد وخصائص قواعد جدار الحماية المسجلة
عدد البادئات المسجلةعدد البادئات المسجلة لا يساوي عدد القواعد ، وبعض القواعد تعمل مع بادئة واحدة ، ولكن لا يزال عدد البادئات الإجمالية؟ وكم عدد القواعد التي تم وضعها لهم؟
MariaDB [traflog]> select logpref,count(logpref) from traffic group by logpref order by count(logpref) desc; +
ACCEPT_TORF_INET هو الرائد ، من خلال هذه البادئة ، يمكنك العثور على كل شخص دخل إلى الإنترنت من شبكتنا المحلية ، وتم تسجيل البروتوكولات والمنافذ ، وسيأتي الوقت وسوف يتم إغلاق الوصول للبعض. هناك بيانات مرجعية للعمل المستقبلي على البق.
Smtp الرمح زعيمدعونا نرى من حاول اليوم الوصول إلى خادم SMTP:
MariaDB [traflog]> select src,count(dport) from traffic where logpref='SMTP_DNAT' and datetime > '2018101600000000' group by src order by count(dport) desc limit 10; +
من الواضح أن العقدة 191.96.249.92 هي الفائزة اليوم. دعونا نرى في القواعد المسجلة التي لا يزال يظهر فيها:
MariaDB [traflog]> select src,dport,count(dport),logpref from traffic where src='191.96.249.92' group by logpref order by count(dport) desc; +
هذا متخصص فقط في smtp ، ~ 1 ٪ من الزيارات لمحاولة تخمين كلمة المرور أو محاولة إرسال بعض القمامة ، ذهب الباقي إلى الحمام.
استغرق الطلب 10 دقائق ، وهذا كثير ، الفهارس الحالية ليست مناسبة له ، أو يمكنك إعادة صياغة الطلب ، لكننا لن نتحدث عنه الآن.
في المستقبل ، من المخطط أن يتم ربط واجهة الويب بالاستعلامات والنماذج القياسية.
يتم إعطاء المتجه ، آمل أن تكون هذه المقالة مفيدة.
شكرا لكم جميعا!
المراجع:وثائق Rsyslogوثائق Mysqlوثائق تسجيل Mikrotikبفضل مجتمع LOR للحصول على
النصائح.UPD.1تمت إضافة حقل العلامات إلى قاعدة البيانات ، يمكنك الآن تتبع مدة الاتصال عن طريق التقاط SYN ، FIN.
تم إصلاح بعض الأخطاء في النظام الأساسي لـ rsyslog وكذلك مشغلات mysql.
الغريب أن القاعدة الافتراضية defconf: إسقاط غير صالح يسقط جميع الحزم النهائية لاتصالات TCP ، ونتيجة لذلك ، تفشل جميع العقد التي تحاول إغلاق الاتصال في العلم ، وإرسال العديد من FINs. هل هذا صحيح؟
أضفت قاعدة تسمح بمرور TCP عبر إشارات ACK و FIN.
تحت مفسد SQL ، إجراء يظهر وقت اتصالات TCP في الدقائق الخمس الأخيرة
links_list () DROP PROCEDURE IF EXISTS connections_list; DELIMITER // CREATE PROCEDURE connections_list() BEGIN DECLARE logid BIGINT UNSIGNED; DECLARE done INT DEFAULT FALSE; DECLARE datefin DATETIME; DECLARE datesyn DATETIME; DECLARE conntime TIME; DECLARE connsport INT; DECLARE conndport INT; DECLARE connsrc VARCHAR(21); DECLARE conndst VARCHAR(21); DECLARE cur CURSOR FOR SELECT id,datetime,src,sport,dst,dport FROM conn_syn_fin WHERE flags='SYN'; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=TRUE; DROP TABLE IF EXISTS conn_syn_fin; DROP TABLE IF EXISTS connless; CREATE temporary TABLE connless(datestart DATETIME,dateend DATETIME,duration TIME,src VARCHAR(21),sport INT,dst VARCHAR(21),dport INT); CREATE temporary TABLE conn_syn_fin (SELECT * from traffic WHERE datetime > now() - interval 5 minute and src in (select src from traffic where datetime > now() - interval 5 minute and logpref='TCP_FIN' and flags like '%FIN%') and (flags like '%SYN%' or flags like '%FIN%') order by id); OPEN cur; read_loop: LOOP FETCH cur INTO logid,datesyn,connsrc,connsport,conndst,conndport; IF done THEN LEAVE read_loop; END IF; set datefin=(SELECT datetime FROM conn_syn_fin WHERE id>logid and src=connsrc and sport=connsport and flags like '%FIN%' and dst=conndst and dport=conndport limit 1); set conntime=(SELECT timediff(datefin,datesyn)); INSERT INTO connless (datestart,dateend,duration,src,sport,dst,dport) value (datesyn,datefin,conntime,connsrc,connsport,conndst,conndport); END LOOP; CLOSE cur; select * from connless; END; // DELIMITER ;
نتيجة لهذا الإجراء ، سيتم إنشاء جدولين مؤقتين.
يحتوي الجدول
conn_syn_fin على إدخالات السجل مع
علامتي SYN و FIN ، ثم يتم إجراء البحث باستخدام المؤشر في هذا الجدول.
يحتوي الجدول غير
المحدود على قائمة بالاتصالات ، المفتوحة والمكتملة ، المكتملة لها مدة مفتوحة ، على التوالي ، لا.
لاحظ وقت أخذ العينات ناقص خمس دقائق من الوقت الحالي. طلبي بطيء. ببطء يمر عبر البحث عن المؤشر ، يعالج حوالي 10 سجلات في الثانية ، حاول تسريعها في كل شيء ، ولكن وقت التنفيذ دائمًا هو نفسه تقريبًا.
لاحظ أيضًا أن هذا الإجراء هو لأغراض العرض التوضيحي فقط. إذا كنت بحاجة إلى إجراء تحديد لـ src / sport / dst / dport معين ، فمن الأفضل إجراء إجراء منفصل مشابه لهذا الإجراء. إذا كنت خبيرًا في sql ، فيمكنك كتابة استعلامك بشكل أفضل.
استدعاء links_list () ؛ MariaDB [traflog]> call connections_list(); +
بعد اكتمال الإجراء ، تبقى الجداول المؤقتة
conn_syn_fin و
connless ، يمكنك النظر إليها بمزيد من التفاصيل إذا وجدت شيئًا مريبًا أو غير موثوق به. بعد بدء الإجراء ، يتم حذف الجداول القديمة وتظهر جداول جديدة. اكتب إذا وجدت خطأ.