نصب و پیکربندی Fail2ban بر روی Ubuntu 20.04
Fail2ban یکی از نرمافزارهای محبوب امنیتی است که برای جلوگیری از حملات بروت فورس (Brute-force) استفاده میشود. این نرم افزار در سال ۲۰۰۴ و به زبان برنامهنویسی پایتون نوشته شده است. نرمافزار Fail2ban بر روی سیستم عاملهای مبتنی بر یونیکس مانند لینوکس قابل نصب است. البته برای استفاده از آن باید یک فایروال مانند iptables یا TCP Wrapper بر روی سیستم شما نصب شده باشد. به عبارت بهتر، نرمافزار Fail2ban وظیفه مانیتورینگ فایل های لاگ (Log) را برعهده دارد. به این صورت که فایلهای لاگ را بررسی کرده و به دنبال آی پی که قصد نفوذ به سیستم و ایجاد اختلال در امنیت سرور را دارند، میگردد و پس از یافتن آن، اقدام به بلاک کردن IP مذکور خواهد نمود.
ادمین سرور قادر است قوانینی برای بلاک کردن آیپیها تعیین نماید. برای مثال هر فرد میتواند تا ۳ بار با پسورد اشتباه به سرور درخواست ورود بفرستد و در صورتی که از این تعداد تجاوز کند، نرمافزار مربوطه آن آیپی را بلاک میکند. حتی شما میتوانید برای از بلاک در آوردن (Unban) نیز قانون تعیین کنید. برای نمونه بعد از ۳ روز میتوانید آی پی را بهصورت اتوماتیک از بلاک در آورید.
فهرست مطالب
Fail2ban چیست؟
تمامی سرویسهایی که در اینترنت قرار دارند در معرض خطر حملات بدافزارها هستند. بهخصوص بر روی پروتکلهای خاصی مانند SSH و SMTP، حجم این حملات بسیار بالا است. مهاجمان با استفاده از حملات بروت فورس تلاش میکنند پسورد لاگین ssh یا ایمیلهای میل سرور را در آورند. ابزار Fail2ban برای مانیتورینگ گزارشهای سرویسها برای فعالیتهای مخرب، به محافظت از دستگاه لینوکس در برابر حملات کمک میکند.
تمام ورودیهای مطابق با الگوها شمرده میشوند و زمانی که تعداد آنها به یک آستانه از پیش تعریف شده میرسد، Fail2ban آیپی متخلف را با استفاده از فایروال سیستم، برای مدت زمانی خاص بلاک میکند. در نهایت با پایان دوره بلاک، آدرس IP از لیست بلاکها خارج میشود. اما اگر باز از آن آیپی حملات تکرار شود، مجدد بلاک خواهد شد.
یکی از مزایای Fail2ban امکان ادغام آن با بسیاری از APIهای مختلف مانند blocklist.de و AbuseIPDB است. این سایتها، دیتابیسهای بزرگی از هکرها و اسپمرهایی دارند که توسط افراد مختلف گزارش شدهاند و شما میتوانید از این دیتابیسها استفاده کرده و آیپیهای خطرناک را در بلک لیست خود قرار دهید. البته استفاده از آن یک مشکلی نیز دارد و آن این است که بیش از هزاران آیپی در داخل دیتابیس آنها است که باید در بازههای زمانی خاص توسط سرور ما چک شده و برای هر کدام از آن آیپیها، یک خط کد برای بردن آنها به بلک لیست نوشته شود. این موضوع به خودی خود ممکن است منابع زیادی از سرور را به خود اختصاص دهد و این در حالی است که معلوم نیست اصلاً از آیپیهای آن دیتابیس حملهای به ما صورت بگیرد یا خیر. تازه اگر حملهای صورت نیز بگیرد، با توجه به تنظیماتی که کردهایم باید آن آیپی به بلک لیست برود. پس تصمیم استفاده کردن یا نکردن از ترکیب fail2ban با دیتابیسهای خارجی به عهدهی خودتان است.
آموزش نصب Fail2ban در اوبونتو ۲۰.۰۴
در ابتدا با استفاده از apt اقدام به نصب این پکیج از مخازن اوبونتو میکنیم:
#apt install fail2ban
بعد از اتمام نصب، سرویس مربوط به آن بهصورت اتوماتیک شروع به کار میکند. برای تست این موضوع از دستور زیر استفاده نمایید:
#systemctl status fail2ban
خروجی این دستور اگر به شکل زیر بود یعنی این سرویس آماده به کار است و فقط باید پیکربندی شود:
systemctl status fail2ban
● fail2ban.service – Fail2Ban Service
Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2020-08-19 06:16:29 UTC; 27s ago
Docs: man:fail2ban(1)
Main PID: 1251 (f2b/server)
Tasks: 5 (limit: 1079)
Memory: 13.8M
CGroup: /system.slice/fail2ban.service
└─۱۲۵۱ /usr/bin/python3 /usr/bin/fail2ban-server -xf start
آموزش پیکربندی Fail2ban
بعد از نصب این نرمافزار شما میتوانید فایلهای اصلی آن را در آدرس etc/fail2ban/ مشاهده نمایید. دو فایل اصلی برای پیکربندی عبارتند از:
/etc/fail2ban/jail.conf
/etc/fail2ban/jail.d/defaults-debian.conf
پیشنهاد میشود هیچکدام از این دو را تغییر ندهید زیرا احتمالاً در صورت بهروزرسانی نرمافزار، تغییرات شما پاک خواهند شد. برای انجام تغییرات باید بدانید که اولویت اجرا به ترتیب زیر خواهد بود. البته این نکته را در نظر داشته باشید که تنظیمات موجود در فایلهای با پسورند local. بر روی تنظیمات conf. اولویت دارند و اصطلاحاً بر روی آنها override میشوند:
- /etc/fail2ban/jail.conf
- /etc/fail2ban/jail.d/*.conf
- /etc/fail2ban/jail.local
- /etc/fail2ban/jail.d/*.local
سادهترین و بهترین راه، ساخت یک کپی از فایل jail.conf و انجام تغییرات بر روی فایل جدید است. با استفاده از دستور زیر یک کپی با نام jail.local ایجاد میکنیم:
#cp /etc/fail2ban/jail.{conf,local}
#vim /etc/fail2ban/jail.local
در ادامه، تمام تنظیمات آموزش داده شده در داخل این فایل اضافه خواهد شد.
نکته: هر زمان که در فایلهای پیکربندی Fail2ban تغییری ایجاد نمودید، باید با استفاده از دستور زیر اقدام به ری استارت سرویس آن نمایید تا تنظیمات جدید اعمال گردند:
#systemctl restart fail2ban
تنظیمات عمومی پیش فرض
در ابتدای فایل تنظیمات عبارت [DEFAULT] را خواهید دید. خطوطی که در زیر آن قرار دارند، به عنوان قوانین پیشفرض fail2ban شناخته میشوند. اگر بهصورت اختصاصی برای یک Jail قانونی مشخص نشود، از قوانین این بخش استفاده میشود. تعدادی از آنها را در این قسمت مورد بررسی قرار میدهیم:
banaction = iptables-multiport
این خط تعیین میکند که fail2ban از چه برنامهای برای ban کردن استفاده کند. باتوجه به اینکه فایروال iptables بهصورت پیشفرض بر روی لینوکس نصب است، گزینه iptables-multiport انتخاب شده است.
protocol = tcp
در قسمت پروتکل مشخص میکنیم که fail2ban چه پروتکلی را مورد بررسی قرار دهد. این پروتکل میتواند tcp یا udp باشد.
enabled = false
اگر این گزینه را در حالت true قرار دهید، تمام Jailهایی که ساخته شدهاند و بهصورت اختصاصی برایشان تعیین نشده که فعال شوند یا خیر را فعال میکند. پیشنهاد میکنیم باتوجه به اینکه بعد از نصب fail2ban یکسری jail پیشفرض وجود دارند که شما دقیقاً نمیدانید چه کاری انجام میدهند، این گزینه را در حالت false نگه دارید و برای هر jail بهصورت اختصاصی تعیین کنید که فعال شود.
قرار دادن IP در وایت لیست
ممکن است شما نیز به دلایلی از جمله فراموشی پسورد، چندین بار ورود ناموفق داشته و توسط نرمافزار ban شوید. این اتفاق برای ادمین شبکه ممکن است سنگین تمام شود بهخصوص اگر مورد اورژانسی اتفاق افتاده باشد و شما نیاز به اتصال سریع به سرور داشته باشید. در این مورد بهترین راهکار این است که آیپیهایی خود را در لیست سفید (Whitelist) قرار دهید تا هیچگاه ban نشوید.
با افزودن خط زیر میتوانید لیست آیپیهای وایت لیست را مشخص نمایید:
jail.local - Whitelist
ignoreip = 127.0.0.1/8 ::1 37.221.4.72 172.20.20.0/24
همانطور که مشاهده مینمایید شما این امکان را دارید که در یک خط، چندین IP و حتی Network تعریف کنید. باید با استفاده از space آدرسها را از یکدیگر جدا کنید. در ضمن هم امکان افزودن IPv4 و هم IPv6 وجود دارد.
تنظیمات Ban
چه شرایطی باید اتفاق بیوفتد که یک آیپی Ban شود؟ چه مدتی این ban برقرار خواهد بود؟ برای پاسخ به این سوالات باید چندین پارامتر مهم را تعیین کنیم. اما اینکه برای هر پارامتر چه مقداری تعیین کنیم، بستگی به سازمان و سیاستهای آن دارد. ممکن است یک شرکت تنها برای یک روز، یک آیپی را که سه بار پسورد اشتباه وارد کرده Ban کند و سازمانی دیگر یک ماه، یک آیپی را که پنج بار اشتباه پسوردی را وارد کرده ban نماید.
Bantime
اولین پارامتر bantime است که مدت زمانی را که یک آیپی باید ban شود، تعیین میکند. بهصورت پیشفرض این مدت ۱۰ دقیقه تعیین شده است که به نظر خیلی مدت کمی است. برای وارد کردن زمان نیز ابتدا یک عدد و بعد حرف اول واحد زمان را وارد میکنیم. برای مثال برای ۴۰ دقیقه از ۴۰m و برای ۸ روز از ۸d و برای ۱ یک ماه از ۱m استفاده میکنیم. اگر واحد زمان تعیین نشود، بهصورت پیشفرض از ثانیه استفاده خواهد شد. پس حتماً دقت نمایید که واحد زمان را وارد کنید که به مشکل بر نخورید. در صورتی که میخواهید یک IP برای همیشه ban شود، از اعداد منفی استفاده کنید.
در مثال زیر، ما مدت زمان ۳ روز را تعیین کردهایم که به نظر برای اکثریت افراد مناسب است:
jail.local - Bantime
bantime = 3d
findtime
این شرط مدت زمان اتفاق افتادن خطاها قبل از Ban شدن را مشخص میکند. برای مثال اگر این مدت زمان ۱۰ دقیقه باشد و حداکثر تعداد مجاز خطا، ۳ عدد باشد، باید در این مدت ۱۰ دقیقه هر سه خطا اتفاق بیوفتد تا آن آیپی Ban شود. اگر دو خطا در مدت ۱۰ دقیقه انجام شود و خطای سوم بعد از گذشت ۱۱ دقیقه اتفاق بیوفتد، شرط برقرار نشده و آیپی Ban نمیشود.
در یک سناریوی محتمل، ممکن است حملات بروت فورس بهگونهای طراحی شده باشد که هر چند دقیقه، حمله صورت گیرد و نه پشت سر هم. به همین دلیل اگر شما عدد کوچکی برای این پارامتر تعیین کرده باشید، احتمالاً نمیتوانید این حمله را دفع کرده و آیپیهای حمله کننده را Ban کنید.
در مثال زیر، ما مدت زمان ۱ ساعت را برای این پارامتر تعیین کردهایم:
jail.local - Findtime
findtime = 1h
maxretry
این پارامتر تعداد خطاهای مجاز یک آیپی قبل از Ban شدن را تعیین میکند. برای مثال اگر عدد ۳ برای آن تعیین شود، بدین معنی است که اگر یک آیپی برای بار سوم یک خطایی را انجام داد باید Ban شود. البته ترکیب این پارامتر با findtime برای چک کردن بررسی خواهد شد. به صورت پیشفرض عدد ۵ برای این پارامتر تعیین شده که به نظر برای اکثر ما مناسب خواهد بود.
jail.local - Maxretry
maxretry = 5
با استفاده از دستورات زیر میتوانیم به صورت دستی یک آیپی را Ban یا Unban کنیم:
#fail2ban-client set sshd unbanip 37.221.4.72
#fail2ban-client set sshd banip 37.221.4.72
ارسال ایمیل
شما میتوانید قابلیت ارسال ایمیل برای آیپیهایی که Ban شدهاند را فعال نمایید تا همیشه بهصورت لحظهای از اتفاقاتی که در سرور میفتد، باخبر باشید.
برای فعال کردن ارسال ایمیل باید موارد زیر را مشخص نمایید:
jail.local - Email Notification
destemail = security@actobit.com
sender = fail2ban@actobit.com
mta = sendmail
action_mwl = %(banaction)s[name=%(__name__)s, port=”%(port)s”, protocol=”%(protocol)s”, chain=”%(chain)s”] %(mta)s-whois-lines[name=%(__name__)s, sender=”%(sender)s”, dest=”%(destemail)s”, logpath=”%(logpath)s”, chain=”%(chain)s”]
مفهوم Jail در Fail2ban
شاید بتوان گفت که مفهوم Jail یکی از مهمترین فرآیندهای Fail2ban است که باید بیاموزید. یک Jail مکانی است که یک سرویس در آن مشخص شده و فیلترها و اقداماتی در رابطه با آن سرویس تعریف میشود. در واقع پیش شرطها و اقداماتی که در صورت وقوع آن پیششرطها باید صورت بگیرد، در این قسمت تعیین میشود. وقتی برنامه را نصب میکنید، تعدادی Jail بهصورت پیشفرض تعریف شدهاند و تنها SSH Jail فعال است.
در مثال زیر نمونهای از یک Jail که برای ssh تعریف شده است را مشاهده مینمایید. با قرار دادن خط enabled = true میتوانید یک Jail را فعال نمایید. همچنین میتوانید پارامترهای maxretry، bantime یا findtime را بهصورت اختصاصی فقط برای یک Jail خاص نیز تعریف نمایید که در این صورت این پارامترهای موجود در Jail اولویت خواهند داشت.
jail.local - Jail Concept
[sshd]
enabled = true
maxretry = 3
findtime = 1d
bantime = 4w
ignoreip = 127.0.0.1/8 23.34.45.56
اینکه برای هر سرویس چه چیزهایی و به چه صورت باید چک شوند، توسط فیلترها (Filters) تعیین میشوند. این فیلترها در آدرس زیر قرار دارند و شما اگر با مفاهیم regular expressions آشنا باشید، میتوانید در داخل آنها دست برده و تنظیمشان نمایید.
/etc/fail2ban/filter.d
شما میتوانید نام سرویسهایی که قادرید از طریق آنها jail تعریف کنید را نیز از آدرس بالا مشاهده نمایید. مهمترین این سرویسها عبارتند از:
- apache
- nginx
- exim
- mysqld
- named
- phpmyadmin
- postfix
- qmail
- roundcube
- sendmail
- squid
- sshd
- vsftpd
برای چک کردن وضعیت یک Jail از دستور زیر استفاده میکنیم:
#fail2ban-client status sshd
همچنین با استفاده از دستور زیر میتوانید تمام آدرسهایی که در تمام jailها محدود شدهاند را مشاهده کنید:
#iptables -S
ساخت Jail برای SSH
SSH پروتکلی است که از طریق آن میتوان به یک سرور بهصورت ریموت متصل شده و آن را در Command-line مدیریت کرد. به دلیل اینکه پورت مربوط به این پروتکل همیشه در معرض دید همگان در اینترنت قرار دارد و از طرف دیگر اگر یوزر و پسورد لاگین مربوط به ssh زده شود، هکر میتواند کل اختیار سرور را در دست بگیرد، بسیار مستعد حملات توسط هکرها و اسپمرها است. پورت پیشفرض این پروتکل، ۲۲ است و بسیاری برای حفظ امنیت، این پورت را تغییر میدهند. هر چند این تغییر میتواند بسیار موثر باشد اما در حفظ امنیت سرور باز کافی نیست. راه مناسب استفاده از fail2ban و ساخت jail برای آن است.
نمونهای از پیکربندی مناسب برای ssh را در زیر مشاهده مینمایید:
jail.local - SSH Jail
[sshd]
enabled = true
maxretry = 3
findtime = 2h
bantime = 1d
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
نکته: اگر پورت ssh را در سرور خود تغییر دادهاید حتما باید آن را در قسمت port (قسمت قرمز رنگ) وارد نمایید. در مثال ما به دلیل اینکه این پورت همچنان بهصورت پیشفرض ۲۲ است، از همان عبارت ssh استفاده شده است.
اما به عنوان ادمین یک شبکه ممکن است مشاهده کنید، با وجود این Jail، بهصورت مجدد یک آیپی وقتی unban شد، باز به حملهی بروت فورس خود ادامه میدهد و این موضوع دائماً تکرار میشود. به عنوان یک راهحل میتوانید مقادیر پارامترهای maxretry و findtime را کم کرده و bantime را بالا ببرید. اما ممکن است این موضوع، کاربران قانونی که به اشتباه خطا میکنند را نیز تحت تاثیر قرار دهد. پس راهحل درست چیست؟
در این زمان بهترین راه استفاده از یک jail دیگر به نام sshlongterm است که برای این گروه از آیپیها استفاده میشود. به عبارت بهتر هم باید یک jail برای sshd تعریف کنید و هم یکی برای sshlongterm:
jail.local - SSH Jail
[sshlongterm]
port = ssh
logpath = %(sshd_log)s
banaction = iptables-multiport
maxretry = 35
findtime = 3d
bantime = 7d
enabled = true
filter = sshd
ساخت Jail برای Postfix
اگر اسپمرها بتوانند دسترسی به یک اکانت ایمیل شما را بدست آورند، به راحتی میتوانند از آن ایمیل اسپم ارسال کرده و اعتبار آیپی شما را از بین ببرند. در این صورت آیپی شما در بلک لیستهای بزرگ قرار میگیرند و در نتیجه، یا دیگران ایمیلهای شما را دریافت نمیکنند و یا آنها را به پوشه اسپم ارسال میکنند. شما میتوانید به راحتی و با ابزار Mxtoolbox جستجو نمایید که دامین شما در چه بلک لیستهایی قرار دارد.
اما اگر بعد از جستجو متوجه شدید که در بعضی از بلک لیستها قرار داشتید باید چه کار کنید؟ آیا فقط باید صبر کنید؟ یا باید آیپی میل سرور خود را تغییر دهید؟ بهترین راه این است که وارد سایتهایی شوید که دامین شما در لیست سیاه آنها قرار دارد. احتمالاً هر کدام پروسهای را گذاشتهاند که شما میتوانید از طریق آن اقدام کرده و خود را از لیست سیاه آن سایت در آورید. البته بعضیها نیز پولی هستند و باید با پرداخت مبلغی این کار را انجام دهید. پس همانطور که مشاهده میکنید مسیر طولانی در پیش خواهید داشت. بهتر است از روشهای پیشگیری استفاده کنید تا اسپمرها نتوانند از طریق بروت فورس پسورد یا حمله لغتنامهای (حمله دیکشنری)، پسورد یکی از ایمیلهای شما را زده و با سوء استفاده از دامین شما، آیپیهایتان را به بلک لیست بفرستند. یکی از این روشهای پیشگیری استفاده از fail2ban است که در ادامه توضیح خواهیم داد.
نرمافزار Postfix عموماً از روش SASL که مخفف Simple Authentication and Security Layer است، برای احراز هویت کاربر و امنیت دادهها استفاده میکند. این جا نقطهای است که اسپمرها به دنبال هک آن هستند تا با زدن پسورد کاربر بتوانند از آن نام ایمیل سوء استفاده کنند. اگر لاگهای میل سرور را چک کنید احتمالاً این گزینه را زیاد خواهید دید: SASL LOGIN authentication failed
اگر این خطا بهصورت دائم تکرار میشود، نشان میدهد که کسی به دنبال اهراز هویت است و دارد پسوردهای مختلف را چک میکند. اگر برای یکی از ایمیل اکانتهای خود پسورد سادهای گذاشته باشید، احتمالاً باید منتظر باشید که بعد از مدت کوتاهی پسورد آن زده شود. نگران نباشید! خوشبختانه fail2ban قادر است تعداد این تلاشها برای زدن پسورد را تا حد زیادی کاهش دهد.
در فایل jail.local اقدام به ساخت یک jail اختصاصی برای SASL نمایید:
jail.local - Postfix SASL Jail
[sasl]
enabled = true
port = smtp
filter = postfix-sasl
logpath = /var/log/mail.log
maxretry = 5
findtime = 6h
bantime = 1d
باتوجه به اینکه هیچ فیلتری بهصورت پیشفرض برای این بخش وجود ندارد، اقدام به ساخت آن نیز میکنیم:
#vim /etc/fail2ban/filter.d/postfix-sasl.conf
postfix-sasl.conf
# Fail2Ban filter for postfix authentication failures
[INCLUDES] before = common.conf
[Definition] _daemon = postfix/smtpd
failregex = ^%(__prefix_line)swarning: [-._\w]+\[<HOST>\]: SASL (?:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed(: [ A-Za-z0-9+/]*={0,2})?\s*$
ساخت Jail برای Port Scan
اگر ufw را فعال کرده باشید و لاگهای مربوط به آن را چک کنید، مشاهده خواهید کرد که به میزان زیادی در حال اسکن پورتهای سرور شما هستند تا از این طریق پورتهای باز را پیدا نمایند. یکی از راههای جلوگیری از این مشکل، استفاده از یک Jail برای مسدود کردن آیپیهایی است که اقدام به اسکن پورتها میکنند.
باتوجه به اینکه هیچ فیلتری بهصورت پیشفرض برای این بخش وجود ندارد، اقدام به ساخت آن میکنیم:
#vim /etc/fail2ban/filter.d/portscan.conf
portscan.conf
[Definition] failregex = UFW BLOCK.* SRC=<HOST>
ignoreregex =
در ادامه اقدام به ساخت یک Jail در فایل jail.local برای Port Scan نمایید:
jail.local - Port Scan Jail
[portscan]
enabled = true
filter = portscan
logpath = /var/log/ufw.log
action = ufw
maxretry = 20
findtime = 2h
bantime = 7d
در این قسمت دقت نمایید که عدد maxretry را خیلی کم انتخاب نکنید که آیپیهای خودتان هم دچار مشکل شوند بهخصوص اگر به دلایل مختلف آیپیهای خودتان را در وایت لیست نگذاشتهاید.
سخن پایانی
ما در این مقاله سعی نمودیم، نصب و راه اندازی Fail2ban در لینوکس را بهطور کامل آموزش دهیم. با این وجود اگر خودتان امکان انجام این کار را ندارید و تصمیم به برون سپاری آن دارید، میتوانید از خدمات لینوکس اکتوبیت استفاده کرده و با پر نمودن فرم مربوطه، درخواست خود را ارسال نمایید. ما در اولین فرصت با شما تماس خواهیم گرفت.