fail2ban के साथ सर्वर पर अनधिकृत पहुँच का प्रयास करने वाले सभी लोगों को दूर भगाएँ!
नमस्ते, मैं अक्षम हूँ। पिछले लेख में https://soulminingrig.com/blog/what\-country\-is\-the\-person\-trying\-to\-gain\-unauthorized\-access\-to\-my\-server\-via\-ssh/, मैंने पुष्टि की कि एक ही दिन में बहुत सारे IP से एक्सेस के प्रयास हुए थे। मैंने इसे अब तक लापरवाही से चलाया है और वास्तव में कभी भी अनधिकृत पहुँच का अनुभव नहीं किया है, लेकिन उपाय किए जाने चाहिए।
या बल्कि, लॉग फ़ाइलों का संचय बहुत अधिक हो रहा है और इसे देखना मुश्किल हो रहा है, जो मुझे थोड़ा नापसंद है। इसलिए, मैं Fail2Ban को स्थापित करने की योजना बना रहा हूँ, जो iRedMail स्थापित करते समय एक निर्भरता के रूप में आया था और जिसमें मेरी रुचि थी।
यह क्या है?
लॉग ऑडिट से, यदि निर्धारित संख्या में प्रयास होते हैं, तो IP को ब्लॉक करना संभव है।
इसके अलावा, यदि कोई प्रयास होता है, तो iptables के माध्यम से पैकेट को खोना भी संभव है। [स्थापना
इस बार, मैं रूट के रूप में लॉग इन हूँ, इसलिए मैं sudo का उपयोग नहीं करूँगा। pkg खोज करने पर, मुझे निम्नलिखित पैकेज मिला, इसलिए मैं इसे स्थापित करूँगा।
pkg install py311-fail2ban-1.1.0
मूल रूप से, fail2ban.conf की कॉन्फ़िगरेशन फ़ाइल को सीधे संशोधित करने की अनुशंसा नहीं की जाती है; इसके बजाय, आपको एक jail.conf फ़ाइल बनानी चाहिए और उसमें लिखना चाहिए। इसलिए, इस बार
SSH, Postfix, Dovecot
मैं इन तीनों से संबंधित लॉगिन प्रयासों को बिल्कुल नापसंद करता हूँ, इसलिए मैं उन्हें कॉन्फ़िगर करूँगा।
इसके अलावा, विभिन्न वेबसाइटों को देखने पर, ऐसा लगता है कि इसे केवल सेकंड में ही नहीं, बल्कि 1w, 1d में भी कॉन्फ़िगर किया जा सकता है, इसलिए मैं इसे भव्य रूप से कॉन्फ़िगर करूँगा। मैं बिना किसी दया के एक सप्ताह के लिए भी प्रतिबंध लगा दूँगा।
~ # cat /usr/local/etc/fail2ban/jail.local
[sshd]
enabled = true
port = ssh
logpath = /var/log/auth.log
bantime = 1w
findtime = 1d
maxretry = 5
[postfix]
enabled = true
port = smtp,ssmtp,submission
logpath = /var/log/maillog
bantime = 1w
findtime = 1d
maxretry = 10
action = block-drop[name=postfix, port=smtp, protocol=tcp]
[dovecot]
enabled = true
port = pop3,pop3s,imap,imaps,submission
logpath = /var/log/maillog
bantime = 1w
findtime = 1d
maxretry = 10
action = block-drop[name=dovecot, port=imap, protocol=tcp]
ऐसा लगता है कि [default] सेक्शन बनाना बेहतर होगा, लेकिन मैं इसे एक बार के लिए केवल इन तीनों पर ही लागू करूँगा और यदि आवश्यक हुआ तो इसे जोड़ दूँगा। वैसे, इसे एक सप्ताह करने का कारण है:
-
सबसे पहले, मैं अब कुंजी प्रमाणीकरण के माध्यम से लॉग इन कर रहा हूँ, इसलिए गलती करने का कोई तरीका नहीं है।
-
एक बार जब मैं मेल सर्वर में लॉग इन करता हूँ, तो लॉगिन प्रमाणीकरण कुछ समय के लिए जारी रहता है, इसलिए मैं शायद ही कभी मैन्युअल इनपुट आदि के माध्यम से लॉगिन का प्रयास करता हूँ।
-
एक बार प्रतिबंधित होने के बाद, मैं चाहता हूँ कि पैकेट पूरी तरह से खो जाए।
-
एक दिन में 5 से अधिक लॉगिन त्रुटियाँ वैसे भी असामान्य हैं।
तो, क्या यह काफी सख्त है? या ढीला है? मैं प्रतिबंध अवधि को बहुत कम करके संसाधनों को बर्बाद नहीं करना चाहता, इसलिए मैंने ऐसा किया। वैसे, ऐसा लगता है कि HTTP सर्वर पर GET विधि को भी प्रतिबंधित किया जा सकता है। https-shin.hatenablog.com/entry/2023/05/24/210949 मैं इस सर्वर को केवल एक मध्यवर्ती सर्वर के रूप में उपयोग करता हूँ, इसलिए मैंने इसे अभी तक लागू नहीं किया है, लेकिन यदि आवश्यक हुआ तो मैं इसे आज़मा सकता हूँ। इसके अतिरिक्त, मैंने action = block-drop सेट किया है, और यह कॉन्फ़िगरेशन इस प्रकार है:
# cat /usr/local/etc/fail2ban/action.d/block-drop.conf
[Definition]
actionstart = iptables -N f2b-<name>
iptables -A f2b-<name> -j DROP
iptables -I INPUT -p all -j f2b-<name>
iptables -I FORWARD -p all -j f2b-<name>
actionstop = iptables -D INPUT -p all -j f2b-<name>
iptables -D FORWARD -p all -j f2b-<name>
iptables -F f2b-<name>
iptables -X f2b-<name>
actioncheck = iptables -n -L INPUT | grep -q 'f2b-<name>[ ]'
actionban = iptables -I f2b-<name> -s <ip> -j DROP
actionunban = iptables -D f2b-<name> -s <ip> -j DROP
मूल रूप से, जब कोई प्रतिबंध होता है, तो मैं पैकेट को पूरी तरह से ड्रॉप कर देता हूँ। मैंने सोचा कि 'रिजेक्ट' भी था, लेकिन फिर से देखने पर https://serverfault.com/questions/157375/reject-vs-drop-when-using-iptables, यह पता चला कि 'रिजेक्ट' का उपयोग तब किया जाना चाहिए जब आप दूसरे पक्ष को यह बताना चाहते हैं कि उसे अस्वीकार कर दिया गया है। इसलिए, इस बार, चूंकि यह एक प्रतिबंध है, मैंने बिना किसी दया के पैकेट को पूरी तरह से नष्ट करने का फैसला किया है।
स्टार्टअप और स्वास्थ्य जांच
चूंकि यह FreeBSD है, यह इसके साथ शुरू होता है
service fail2ban start
यदि 'Server ready' दिखाई देता है तो ठीक है। मैं यह देखने के लिए लॉग की जाँच करूँगा कि यह ठीक से काम कर रहा है या नहीं।
# tail /var/log/fail2ban.log
2024-07-24 13:34:05,654 fail2ban.filter [39963]: INFO [sshd] Found - 2024-07-24 13:34:05
2024-07-24 13:34:05,755 fail2ban.filter [39963]: INFO [sshd] Found - 2024-07-24 13:34:05
2024-07-24 13:34:05,884 fail2ban.filter [39963]: INFO [sshd] Found - 2024-07-24 13:34:05
2024-07-24 13:34:06,000 fail2ban.filter [39963]: INFO [sshd] Found - 2024-07-24 13:34:05
2024-07-24 13:34:06,317 fail2ban.actions [39963]: WARNING [sshd] already banned
2024-07-24 13:34:06,731 fail2ban.filter [39963]: INFO [sshd] Found - 2024-07-24 13:34:06
2024-07-24 13:37:14,327 fail2ban.filter [39963]: INFO [sshd] Found - 2024-07-24 13:37:14
2024-07-24 13:42:12,266 fail2ban.filter [39963]: INFO [sshd] Found - 2024-07-24 13:42:12
2024-07-24 13:42:17,389 fail2ban.filter [39963]: INFO [sshd] Found - 2024-07-24 13:42:17
2024-07-24 13:42:23,357 fail2ban.filter [39963]: INFO [sshd] Found - 2024-07-24 13:42:23
मूल रूप से, IP पता प्रदर्शित होता है, लेकिन इस बार मैंने इसे ठीक से छिपा दिया है। यह तुरंत प्रतिबंधित हो गया! मैंने अपने दिल में चिल्लाया, "पकड़ा गया, छोटे!"
(वैसे भी, वे बॉट हैं, तो मैं मशीनों के बारे में क्या सोच रहा हूँ?) इस तरह के बेकार के जश्न को ज़मीन पर रखते हुए, मैं इसे स्वचालित रूप से शुरू करने के लिए /etc/rc.conf में निम्नलिखित जोड़ूँगा।
fail2ban_enable="YES"
अब, सर्वर रीबूट होने पर भी प्रक्रिया स्वचालित रूप से शुरू हो जाएगी।
तो, आज के लिए बस इतना ही। वैसे, मुझे लगता है कि यह देखना भी दिलचस्प होगा कि अब तक प्राप्त लॉग में किन उपयोगकर्ता नामों के साथ लॉगिन का प्रयास किया गया था, इसे एक चार्ट में प्रदर्शित करके। फिर से, धन्यवाद।