تسجيل محاولات تسجيل الدخول غير الصالحة لـ Fail2ban وإجراء الخادم المنبع

I was hoping Discourse could log invalid login attempts to file, even if it is something you have to configure to do so. Then I could create a custom filter and jail for discourse

I use a centralized fail2ban server. the way it works is all my Containers, Docker images, VMs have a custom ban action:

in fail2ban you specify the action to take in your jail, such as:
action = iptables-allports

then all you have to do is edit that action:
sudo nano /etc/fail2ban/action.d/iptables-allports.conf

actionban = <iptables> -I f2b-<name> 1 -s <ip> -j <blocktype>
      curl -s "https://fail2ban.YourDomain.com:35553/fail2ban.php?token=D2f3Ydy45f6y5FRTfyeFrtYErt&action=add&source=TEST_HOST&reason=TEST_FILTER&ip=111.222.333.444"

With this setup your container/docker/vm will fail2ban them locally, but it will also relay this information to your central fail2ban server. The central server can also take all collected IPs and make them available as txt banlist such as: https://fail2ban.YourDomain.com/banned.txt

Then you can have your pfsense firewall subscribe to this banlist, and you can even share the list with other pfsense routers. This way if they try breaking in on one application, they get banned from everything. This has worked great for me for years.

And all that I need to implement this for discourse is for discourse to write an entry to a log file when there is an invalid login attempt :slight_smile:

إعجاب واحد (1)

did you figure out how to hook or log this?

Thanks

إعجاب واحد (1)

Bump. This seems like a very good idea!

Where does Discourse store and show logs?

The NGINX logs
Occasionally NGINX logs may contain some extra tips, they are located at:

cd /var/discourse
./launcher enter app
cd /var/log/nginx
The files access.log and error.log will be there as well as a bunch of rotated compressed files. Running less access.log.2.gz will automatically decompress and display the logfile for you.

This directory is also available on the host at /var/discourse/shared/standalone/log/var-log/nginx .

Unfortunately, the nginx error.log and access.log files do not log any invalid login attempts.

Can anyone suggest another avenue?

Thank you.

إعجاب واحد (1)

Agree. It would be great to hook into a fail2ban kind of automated exponential backoff.

إعجاب واحد (1)

فضولي - هل يتم تتبع طلب الميزة هذا أو التخطيط له بعد؟ ستكون ميزة أمان جيدة.

تسجيل (أو ربط) محاولات تسجيل الدخول الفاشلة حسب عنوان IP

شكرا لك!

إعجاب واحد (1)

يجب أن يحتوي ملف nginx access.log على أسطر تحتوي على استجابات 403 لمسار تسجيل الدخول الذي تحتاجه لهذا. هل فحصت السجلات؟

إعجاب واحد (1)

آه، شكراً لك! أتساءل كيف يمكنني الوصول إليه من خارج صورة/حاوية دوكر

أهلاً @Falco شكراً على الرد. لقد تفقدت السجلات على الفور الآن، ومحاولة كلمة مرور صحيحة ومحاولة كلمة مرور غير صحيحة تبدوان متشابهتين بالنسبة لي (استجابة 200):

(لقد قمت بتنقية عنوان IP والنطاق، والباقي لم يمسه أحد)

كلمة مرور سيئة:

[20/Dec/2021:08:07:31 -0800] "community.example.com" 10.111.222.33 "GET /session/csrf HTTP/1.1" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:95.0) Gecko/20100101 Firefox/95.0" "session/csrf" 200 1185 "https://community.example.com/" 0.016 0.017 "-"
[20/Dec/2021:08:07:32 -0800] "community.example.com" 10.111.222.33 "POST /session HTTP/1.1" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:95.0) Gecko/20100101 Firefox/95.0" "session/create" 200 1111 "https://community.example.com/" 0.552 0.550 "-"

كلمة مرور جيدة:

[20/Dec/2021:08:24:50 -0800] "community.example.com" 10.111.222.33 "GET /session/csrf HTTP/1.1" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:95.0) Gecko/20100101 Firefox/95.0" "session/csrf" 200 1185 "https://community.example.com/" 0.020 0.020 "-"
[20/Dec/2021:08:24:51 -0800] "community.example.com" 10.111.222.33 "POST /session HTTP/1.1" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:95.0) Gecko/20100101 Firefox/95.0" "session/create" 200 2251 "https://community.example.com/" 1.216 1.216 "-"

لذلك، بما أن كليهما يعيد استجابة 200، لا يمكنك استخدام هذا لـ fail2ban، ستقوم بحظر جميع المستخدمين بكلمة مرور جيدة أو سيئة.

إعجابَين (2)

يستخدم تويتر 400 لكلمة المرور الخاطئة، لكن فيسبوك ولينكد إن وجوجل وأمازون تُرجع 200. في رأيي، يبدو 200 خاطئًا، ولكنه يبدو الشيء “الطبيعي”؟

ربما يمكنك البدء بمكون إضافي يتصل بهذه الطريقة هنا

ويفعل ما تحتاجه؟

3 إعجابات

رائع، شكراً على الرد! حالما أحصل على القليل من وقت الفراغ سأحاول إنشاء إضافة لتوليد هذه المعلومات! (كل ما أحتاجه هو تسجيل عنوان IP في ملف عندما يحاول شخص ما تسجيل الدخول بكلمة مرور غير صحيحة، على سبيل المثال: محاولة تسجيل دخول غير صالحة من IP 10.111.222.33)

3 إعجابات

شكرا لك! آمل أن أتمكن من استخدام هذا المكون الإضافي؛ أخبرني إذا كان بإمكانك توفيره.

هل تمكنت من تشغيل هذا الأمر على الإطلاق؟ أنا مهتم جدًا باستخدام fail2ban مع نسخة discourse الخاصة بي أيضًا.

أنا أكتب عن أدوار مسؤول الويب العصامي والمستخدم النهائي البحت، ولكن…

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

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

المتسللون المبتدئون قصة أخرى، بالطبع. ينسخون ويلصقون كل ما يجدونه، ويقومون بتدويرها ولا يلعبون بعناوين IP. عندها يمكن لـ Fail2ban إيقافهم، حتى لو كانوا نادرًا ما يفعلون أي ضرر، ولكنهم يزيدون الحمل. المشكلة الحقيقية هي كمية المتسللين المبتدئين عندما يكون هناك تدفق فوري.

ولكن طالما أن VPS يمكنه التعامل مع مثل هذا الموقف، فهذا لا يهم. الآن هو عام 2023 ومعظم هؤلاء الأوغاد يطرقون الثغرات القديمة لـ wordpress على موقع discourse :wink:

ولكن يجب أن يكون لدينا بعض المنطق لإيقاف تسجيلات الدخول المستمرة، بغض النظر عما إذا كان هذا ليس تهديدًا يوميًا، على ما أعتقد.