باستخدام قاعدة بيانات سجل Mikrotik لقمع القوة الغاشمة

مساء الخير

في منشور سابق ، تحدثت عن كيفية وبسهولة وبطبيعة الحال ، يمكنك تكوين مجموعة بيانات تعريف حركة مرور الشبكة على أجهزة توجيه Mikrotik في قاعدة بيانات.

الآن حان الوقت لتعليم خادمنا لإجراء تحليل أولي للبيانات المستلمة وإعادة إرسال الأوامر.

الغرض: التحكم الديناميكي في قواعد جدار الحماية Mikrotik لقمع هجمات الشبكة بتخمين كلمة المرور.

الوسائل: توزيع Linux جديد مع rsyslogd v8 ، crond ، mariadb DBMS وجهاز التوجيه Mikrotik نفسه.

الميكانيكا: باستخدام المهمة المعينة ، يتم تنفيذ استعلام SQL في قاعدة البيانات مع بيانات مرور متراكمة ومحدثة وإرجاع قائمة بعناوين IP الصادرة ، ويقوم البرنامج النصي bash الذي تم إطلاقه من التاج بإنشاء أوامر Mikrotik ، وباستخدام اتصال ssh ، يُجدد قائمة العناوين لقواعد الحظر الحالية.

سيكون حول حماية منافذ TCP المفتوحة. يمكن أن تكون هذه منافذ تدخل Mikrotik وتُرسل إلى الشبكة المحلية.

بادئ ذي بدء ، نشير إلى حيث قد تكون هناك نقاط ضعف:

  • بروتوكولات التحكم من ssh ، التلنت ، الويب ، جهاز التوجيه winbox
  • خدمات البريد smtp ، pop ، imap
  • أي خدمات الويب المقدمة خارج
  • سطح المكتب البعيد MS RDP ، VNC ، إلخ.
  • أي شيء آخر حسب تقديرك

كتابة استعلام SQL للبحث عن القوة الغاشمة

تحتوي مؤسستنا على خوادم طرفية مفتوحة للخارج من خلال منافذ غير ذات أولوية.
في DNAT Mikrotik ، قمت بتشغيل تسجيل القواعد الضرورية عن طريق إضافة البادئة RDP_DNAT. من خلال هذه البادئة سوف نبحث:

MariaDB [traflog]> select src,dport,count(dport) as ' ' from traffic where datetime>now() - interval 1 day and logpref='RDP_DNAT' group by src having count(dport)>50; +-----------------+-------+---------------------------------------+ | src | dport |   | +-----------------+-------+---------------------------------------+ | 185.156.177.58 | 12345 | 118 | | 185.156.177.59 | 12345 | 267 | | 193.238.46.12 | 12345 | 318 | | 193.238.46.13 | 12345 | 319 | | 193.238.46.99 | 12345 | 342 | | 194.113.106.150 | 12345 | 67 | | 194.113.106.152 | 12345 | 167 | | 194.113.106.153 | 12345 | 190 | | 194.113.106.154 | 12345 | 192 | | 194.113.106.155 | 12345 | 190 | | 194.113.106.156 | 12345 | 216 | | 194.113.106.158 | 12345 | 124 | +-----------------+-------+---------------------------------------+ 12 rows in set (0.06 sec) 

يعرض هذا الطلب عنوان IP (الذي سيأتي منه الهجوم) ، والمنفذ الذي تم إجراء الاتصال به (تم تغيير رقم المنفذ) وعدد محاولات الاتصال ، مع التجميع الأولي حسب src واختيار الخطوط ، مع عدد المحاولات أكثر من 50 عبر الماضي ، من اللحظة الحالية ، اليوم.

في حالتي ، يمكن حظر هذه العناوين بأمان ، لأن عدد الاتصالات مع العملاء "الجيدين" أقل ، لا يزيد عن 5-10 يوميًا من عنوان IP واحد.

الطلب يعمل بشكل جيد وسريع ، لكنه طويل بعض الشيء. لمزيد من الاستخدام ، أقترح عمل طريقة عرض ، والتي ستنسخ أقل في المستقبل:

 MariaDB [traflog]> create or replace view rdp_brute_day as select src, dport, count(dport) from traffic where datetime>now() - interval 1 day and logpref='RDP_DNAT' group by src having count(dport)>50; Query OK, 0 rows affected (0.23 sec) 

دعونا نتحقق من كيفية عمل العرض:

 MariaDB [traflog]> select src,count(dport) from rdp_brute_day; +----------------+--------------+ | src | count(dport) | +----------------+--------------+ | 185.156.177.58 | 11 | +----------------+--------------+ 1 row in set (0.09 sec) 

عظيم

نضيف المستخدم Mikrotik مع إذن من مفتاح DSA

في وحدة التحكم في نظام التشغيل linux ، نقوم بإنشاء مفتاح dsa ، تحت المستخدم نيابة عن من سيتم إطلاق المهمة المجدولة ، لقد قمت بعمله من root:

 root@monix:~# ssh-keygen -t dsa Generating public/private dsa key pair. Enter file in which to save the key (/root/.ssh/id_dsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_dsa. Your public key has been saved in /root/.ssh/id_dsa.pub. ... 

عبارة المرور ليست ضرورية. نقوم بنسخ المفتاح العام /root/.ssh/id_dsa.pub إلى Mikrotik بأي طريقة ممكنة. أخرجته باستخدام الأمر cat ، ونسخ النص من نافذة المعجون في ملف نصي ، وحفظه وسحبه إلى نافذة ملفات winbox.

لا أعرف السبب ، لكن خلال العمليات التالية من خلال واجهة winbox ، حدث خطأ ما. عند الاتصال من الخادم عبر ssh ، طلب Mikrotik أيضًا كلمة مرور مني. بعد أن حذفت المستخدم الذي تم إنشاؤه ونفذت جميع العمليات من خلال وحدة التحكم ، عمل اتصال dsa. فعلت تقريبا كما هو موضح هنا .

بشكل عام ، تلقيت إدخال الترحيب بدون كلمة مرور باستخدام مفتاح dsa وقمت بتشغيل أمر التحقق:

 root@monix:/# ssh rsyslogger@192.168.0.230 /system resource print uptime: 2w1d5h22m43s version: 6.43.2 (stable) ... 

جيد

كتابة السيناريو باش

البرنامج النصي لم يكن معقدًا:

 mikrotik_cmd_list(){ brute_src_list=$(mysql --skip-column-names traflog -e 'select src from rdp_brute_day') for src in $brute_src_list do echo "ip firewall address-list add address=$src list=rdp_banlist timeout=1d" done } mikrotik_cmd_list | ssh -T rsyslogger@192.168.0.230 

من أجل نقل جميع الأوامر داخل نفس اتصال ssh ، كنت بحاجة إلى وصف الوظيفة mikrotik_cmd_list () ، حيث يتم تنفيذ الطلب أولاً مع حفظ عناوين بروتوكول الإنترنت إلى المتغير brute_src_list ، ثم في هذا المتغير ، يولد هذا المتغير أوامر متتالية في Mikrotik. بعد استدعاء الوظيفة ، يتم توجيه الإخراج عبر الأنبوب إلى ssh.

لا تنسى إغلاق حقوق الوصول إلى البرنامج النصي للجميع باستثناء الجذر وجعل الملف قابل للتنفيذ.
سيضيف الأمر الذي ينشئه البرنامج النصي عنوان IP إلى rdp_banlist ليوم واحد ، بعد هذا الوقت ستتم إزالته من القائمة نفسها. إذا كنت تريد تركها للأبد ، فقم بإزالة خيار المهلة.

أضف قاعدة إلى جدار الحماية

لقد توصلت إلى خيارين لكيفية استخدام قائمة rdp_banlist:

الخيار الأول: أضف rdp_banlist مع علامة تعجب إلى قواعد NAT مع البادئة RDP_DNAT.

 add action=dst-nat chain=dstnat comment="..." dst-address=1.2.3.4 dst-port=12345 log=yes log-prefix=RDP_DNAT protocol=tcp src-address-list=\ !rdp_banlist to-addresses=192.168.200.181 to-ports=3389 

شيء من هذا القبيل. وهذا هو ، نحن dnat كل شيء ، ما عدا ما هو في rdp_banlist.

في هذا الخيار ، هناك علامة زائد وناقص.

زائد هو أن الاتصالات سوف تتوقف على الفور.

الجانب السلبي هو أن هذا ip لم يعد يدخل في قاعدة بيانات traflog وبعد يوم واحد ، عندما انقضت مهلة التخزين في القائمة السوداء ، سيبدأ حماقة مرة أخرى.

الخيار الثاني: أضف rdp_banlist مع علامة التعجب إلى قاعدة جدار الحماية في السلسلة الأمامية ، حيث نسمح لحركة المرور بالمرور عبر TCP 3389 ، على غرار الطريقة في الطريقة الأولى.

 add action=accept chain=forward comment="..." dst-port=3389 log=yes log-prefix=ACCEPT_RDP protocol=tcp src-address-list=\ !rdp_banlist to-ports=3389 

شيء من هذا القبيل. نحن نسمح بكل شيء عدا ذلك في قائمة الحظر.

هناك أيضا زائد وناقص.

زائد. سيتم متابعة تدفق السجلات التي تحتوي على البادئة RDP_DNAT في قاعدة بيانات traflog ، والتي نحدد بها علامة الهجوم. نتيجة لذلك ، عند انتهاء مهلة الحظر لمضيف معين يواصل محاولات القوة الغاشمة ، ستتم إضافته إلى قائمة الحظر مرة أخرى بعد بدء المهمة المجدولة التالية.

الجانب السلبي هو أنه يستمر في هراء في جدول DSTNAT ، إنشاء سجل جديد مع كل اتصال ، وإن كان مؤقتا.

بشكل عام ، القرار لك ، اخترت كليهما :) (في الواقع ، أول واحد يعمل في هذه الحالة) ، حيث تم تشغيل الثاني في وقت سابق وكانت الميكانيكا مختلفة هناك ، بناءً على الإدخالات المتسلسلة في قوائم المرحلة 1 ، المرحلة 2 ، المرحلة 3 ، banlist ... حسنا ، تحصل على هذه النقطة. إنها خدعة قديمة وليست موثوقة للغاية ، حيث يمكنها بسهولة حظر العملاء "الجيدين" وفي نفس الوقت تخطي العملاء "السيئين" الذين قاموا بحساب مرحلة المهلة 1 بأدب.

وظيفة المقرر crontab

يبقى لإضافة المهمة المعينة إلى crontab:

 root@monix:/root# echo '12 * * * * root /usr/share/traflog/scripts/rdp_brute.sh >/dev/null 2>&1' >> /etc/crontab 

سيتم تشغيل هذا السجل النصي كل ساعة في 12 دقيقة.

يجب أن أعترف ، لقد انتهيت للتو من العمل على هذه الميكانيكا اليوم وبقدر كبير من الاحتمال ، قد يحدث خطأ ما. وفقًا للظروف ، سأقوم بإكمال وتصحيح الأخطاء. أريد أن أشرب أن أنام ​​بشكل سليم في عطلة رأس السنة ، ولهذا السبب أنا في عجلة من أمري حتى النهاية.
هذا ربما كل شيء.

شكرا لكم جميعا على اهتمامكم وسنة جديدة سعيدة!

المراجع

وثائق Mysql
وثائق جدار الحماية Mikrotik
بفضل أندريه سميرنوف على مقال حول اتصال DSA.

Source: https://habr.com/ru/post/ar434736/


All Articles