نحوه حفاظت از SSH با استفاده از Fail2Ban در Ubuntu
۲۲ دی ۱۴۰۳
مقدمه
SSH روشی استاندارد (de facto) برای اتصال به سرورهای مجازی است. این پروتکل، پایدار (durable) و قابل گسترش (extensible) است. با توسعه استانداردهای جدید رمزنگاری، میتوان از آنها برای تولید کلیدهای جدید SSH استفاده کرد و اطمینان حاصل کرد که پروتکل اصلی، امن باقی میماند. با این حال، هیچ پروتکل یا مجموعه نرمافزاری، به طور کامل بدون نقص نیست، و از آنجا که SSH به طور گسترده در اینترنت استفاده میشود، به عنوان یک attack surface یا attack vector ظاهر میشود و ممکن است افراد بتوانند از طریق آن، به سرور مجازی، دسترسی پیدا کنند.
هر سرویسی که به شبکه متصل باشد، به این روش میتواند هدف حمله قرار گیرد. اگر لاگهای مربوط به سرویس SSH سرور مجازی خود را بررسی کنید، اغلب تلاشهای ورود مکرر و سیستماتیکی را خواهید دید که نمایانگر حملات brute force توسط کاربران و رباتها هستند. با وجود اینکه میتوانید با بهینهسازی تنظیمات سرویس SSH، احتمال موفقیت این حملات را تقریباً به صفر برسانید — مثلاً با غیرفعال کردن احراز هویت با رمز عبور (password authentication) و استفاده از کلیدهای SSH به جای آن — این حملات همچنان میتوانند یک خطر جزئی و مداوم باشند.
برای استقرارهای بزرگ در محیط بهرهبرداری (large-scale production deployments) که این خطر به هیچ وجه قابل قبول نیست، معمولاً یک پروتکل مانند WireGuard در مقابل سرویس SSH پیادهسازی میشود. این کار باعث میشود که اتصال مستقیم به پورت پیشفرض SSH یعنی 22 از اینترنت خارجی، بدون نرمافزار یا gatewayهای اضافی، غیرممکن شود. راهحلهای این شکلی، به طور گستردهای مورد اعتماد هستند اما پیچیدگیهای خاص خود را دارند و ممکن است برخی اتوماسیونها یا هوکهای نرمافزاری کوچک را، مختل کنند.
در کنار این راهحلها، میتوانید از ابزاری به نام Fail2Ban استفاده کنید. Fail2Ban میتواند حملات brute force را به طور قابل توجهی کاهش دهد. این ابزار با ایجاد قوانینی که به صورت خودکار تنظیمات فایروال (firewall configuration) شما را تغییر میدهند، آیپیهای خاص را پس از تعداد مشخصی تلاش ناموفق برای ورود، مسدود میکند. این قابلیت به سرور مجازی (VPS) شما این امکان را میدهد که بدون دخالت شما، در برابر این تلاشهای دسترسی، مقاومتر شود.
در این مقاله، نحوه نصب و استفاده از Fail2Ban روی سرور Ubuntu را بررسی خواهیم کرد.
پیشنیازها
برای استفاده از این مقاله، به ابزارهای زیر، نیاز دارید:
- یک سرور Ubuntu (ترجیحاً نسخه 22.04 به بعد) و یک کاربر غیر root یا non-root user با دسترسیهای sudo.
- یک سرور دوم، که از طریق آن بتوانید به سرور اول متصل شوید و آن را آزمایش کنید (این پیشنیاز اختیاری است).
اگر که با SSH یا مفهوم سرور مجازی (VPS – Virtual Private Server)، آشنایی ندارید؛ توصیه میشود که برای درک کامل این مقاله، در ابتدا، مقالههای زیر را، مطالعه کنید:
- سرور مجازی یا VPS چیست؟ + معرفی انواع VPS و کاربردهای آن
- SSH چیست؟ + نحوه استفاده از SSH برای اتصال به سرور مجازی (VPS)
مرحله اول — نصب Fail2ban
Fail2ban در repositoryهای نرمافزاری Ubuntu موجود است. برای شروع، بهعنوان یک کاربر غیر root، دستورات زیر را اجرا کنید تا لیست بستهها (package listings) را بهروزرسانی کرده و Fail2ban را نصب کنید:
sudo apt update
sudo apt install fail2ban
Fail2ban پس از نصب، به صورت خودکار، در سرور، یک سرویس پسزمینه (background service) راهاندازی میکند. با این حال، این سرویس به طور پیشفرض غیرفعال است، زیرا برخی از تنظیمات دیفالت آن، ممکن است باعث ایجاد اثرات ناخواسته شوند. میتوانید این موضوع را با استفاده از دستور systemctl
بررسی کنید:
systemctl status fail2ban.service
خروجی دستور فوق، مانند شکل زیر است:
○ fail2ban.service - Fail2Ban Service
Loaded: loaded (/lib/systemd/system/fail2ban.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:fail2ban(1)
میتوانید Fail2ban را بلافاصله فعال کنید، اما ابتدا بهتر است برخی از ویژگیهای آن را بررسی کنید.
مرحله دوم – پیکربندی Fail2ban
سرویس Fail2ban فایلهای پیکربندی خود را در دایرکتوری /etc/fail2ban
نگهداری میکند. یک فایل پیشفرض به نام jail.conf
در این دایرکتوری وجود دارد. به آن دایرکتوری بروید و با استفاده از دستور head -20
، بیست خط اول این فایل را چاپ کنید:
cd /etc/fail2ban
head -20 jail.conf
خروجی دستور فوق، مانند شکل زیر است:
#
# WARNING: heavily refactored in 0.9.0 release. Please review and
# customize settings for your setup.
#
# Changes: in most of the cases you should not modify this
# file, but provide customizations in jail.local file,
# or separate .conf files under jail.d/ directory, e.g.:
#
# HOW TO ACTIVATE JAILS:
#
# YOU SHOULD NOT MODIFY THIS FILE.
#
# It will probably be overwritten or improved in a distribution update.
#
# Provide customizations in a jail.local file or a jail.d/customisation.local.
# For example to change the default bantime for all jails and to enable the
# ssh-iptables jail the following (uncommented) would appear in the .local file.
# See man 5 jail.conf for details.
#
# [DEFAULT]
همانطور که مشاهده کردید، چند خط اول فایل jail.conf
کامنت شدهاست. این چند خط با کاراکتر #
آغاز میشوند که نشان میدهد به عنوان مستندات خوانده میشوند و نه به عنوان تنظیمات. همچنین، در این کامنتها ذکر شده است که نباید این فایل را مستقیماً تغییر دهید.
به جای آن، دو گزینه در اختیار دارید:
- ایجاد پروفایلهای جداگانه برای Fail2ban در چندین فایل، داخل دایرکتوری
jail.d/
. - ایجاد و جمعآوری تمام تنظیمات local خود در یک فایل به نام
jail.local
.
فایل jail.conf
بهصورت دورهای با بهروزرسانی Fail2ban بهروز میشود و بهعنوان منبع تنظیمات پیشفرض، برای مواردی که جایگزینی برای آنها ایجاد نکردهاید، استفاده خواهد شد.
در این آموزش، فایل jail.local
را ایجاد خواهیم کرد. برای این کار، کافیست تا فایل jail.conf
را کپی کنید:
sudo cp jail.conf jail.local
اکنون میتوانید تغییرات پیکربندی را شروع کنید. فایل را با استفاده از ویرایشگر متن nano یا ویرایشگر مورد علاقه خود باز کنید:
sudo nano jail.local
هنگامی که این فایل را اسکرول میکنید، میتوانید برخی از گزینههایی را که ممکن است بخواهید بهروزرسانی کنید بررسی کنید. تنظیماتی که در بخش [DEFAULT]
در بالای فایل قرار دارند، برای تمام سرویسهایی که توسط Fail2ban پشتیبانی میشوند اعمال میشوند. در سایر بخشهای فایل، هدرهایی مانند [sshd]
و دیگر سرویسها وجود دارند که شامل تنظیمات مخصوص هر سرویس هستند. این تنظیمات خاص، بر روی تنظیمات پیشفرض اعمال میشوند و در صورت تضاد با تنظیمات دیفالت، اولویت خواهند داشت.
پارامتر bantime
پارامتر bantime
مدتزمانی را تعیین میکند که یک کلاینت پس از تلاش ناموفق برای احراز هویت (authentication) مسدود میشود. این مقدار بر حسب ثانیه اندازهگیری میشود. به طور پیشفرض، این مقدار روی 10 دقیقه تنظیم شده است.
[DEFAULT]
. . .
bantime = 10m
. . .
پارامترهای findtime
و maxretry
دو پارامتر بعدی، findtime
و maxretry
هستند که با هم کار میکنند تا شرایطی را بررسی کنند که در آن، یک کلاینت به عنوان یک کاربر غیرمجاز شناخته شده و باید مسدود شود.
- پارامتر
maxretry
تعداد تلاشهایی را که یک کلاینت باید در یک بازه زمانی تعریفشده توسط پارامترfindtime
برای احراز هویت انجام دهد، قبل از اینکه مسدود شود، مشخص میکند. - پارامتر
findtime
مدت زمانی را تعریف میکند که در طی آن، تلاشهای ناموفق برای ورود باید ثبت شوند.
با تنظیمات پیشفرض، سرویس Fail2ban یک کلاینت را که 5 بار تلاش ناموفق برای ورود در بازه زمانی 10 دقیقهای داشته باشد، مسدود میکند.
[DEFAULT]
. . .
findtime = 10m
maxretry = 5
. . .
دریافت اعلانهای ایمیل هنگام عملکرد Fail2ban
اگر نیاز دارید که هنگام عملکرد Fail2ban، اعلانهای ایمیل دریافت کنید، باید پارامترهای destemail
و sendername
و mta
را تنظیم کنید.
- پارامتر
destemail
آدرس ایمیلی را که باید پیامهای مسدودسازی را دریافت کند، تعیین میکند. - پارامتر
sendername
مقدار فیلد “From” در ایمیل را تنظیم میکند که همان فرستنده است. - پارامتر
mta
سرویس پستی که برای ارسال ایمیل استفاده خواهد شد را پیکربندی میکند. به طور پیشفرض، این مقدارsendmail
است، اما ممکن است بخواهید از Postfix یا راهحلهای پستی دیگری استفاده کنید.
[DEFAULT]
. . .
destemail = root@localhost
sender = root@<fq-hostname>
mta = sendmail
. . .
پارامتر action_
این پارامتر اقداماتی را که Fail2ban هنگام اعمال یک مسدودسازی انجام میدهد، تنظیم میکند:
[DEFAULT]
. . .
action = $(action_)s
. . .
مقدار action_
کمی قبل از این پارامتر در فایل تعریف شده است. عمل پیشفرض این است که تنظیمات فایروال شما، بهروزرسانی شود و میزبان متخلف، تا زمانی که مدت مسدودسازیاش (ban time) به پایان برسد، مسدود بماند. چندین اسکریپت دیگر به صورت پیشفرض برای action_
ارائه شدهاند که میتوانید مقدار $(action_)
را با آنها جایگزین کنید:
…
# ban & send an e-mail with whois report to the destemail.
action_mw = %(action_)s
%(mta)s-whois[sender="%(sender)s", dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]
# ban & send an e-mail with whois report and relevant log lines
# to the destemail.
action_mwl = %(action_)s
%(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]
# See the IMPORTANT note in action.d/xarf-login-attack for when to use this action
#
# ban & send a xarf e-mail to abuse contact of IP address and include relevant log lines
# to the destemail.
action_xarf = %(action_)s
xarf-login-attack[service=%(__name__)s, sender="%(sender)s", logpath="%(logpath)s", port="%(port)s"]
# ban IP on CloudFlare & send an e-mail with whois report and relevant log lines
# to the destemail.
action_cf_mwl = cloudflare[cfuser="%(cfemail)s", cftoken="%(cfapikey)s"]
%(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]
…
به عنوان مثال، action_mw
علاوه بر اقدام فوق، یک ایمیل نیز، ارسال میکند. action_mwl
علاوه بر اقدام و ارسال ایمیل، لاگها را نیز در ایمیل ضمیمه میکند. action_cf_mwl
، همه موارد گفته شده را انجام میدهد و همچنین یک بهروزرسانی به Cloudflare API مرتبط با حساب شما ارسال میکند تا کاربر متخلف در Cloudflare نیز، مسدود شوند.
تنظیمات مربوط به Individual Jail
در بخش بعدی فایل پیکربندی، تنظیمات مربوط به سرویسهای جداگانه ارائه شده است. این تنظیمات با هدرهای مشخصی، (مانند [sshd]
) تعریف میشوند. برای فعالسازی هر یک از این بخشها، باید عبارت enabled = true
را در زیر هدر مربوطه اضافه کنید:
[jail_to_enable]
. . .
enabled = true
. . .
به صورت پیشفرض، در فایل پیکربندی، سرویس SSH فعال و سایر سرویسها غیرفعال هستند. در این بخش، تنظیمات دیگری نیز وجود دارند، از جمله:
filter
: فیلتری که تعیین میکند آیا یک خط در لاگ، تلاش ناموفق برای احراز هویت را نشان میدهد یا خیر.logpath
: مسیری که به Fail2ban میگوید لاگهای یک سرویس، در کجا قرار دارند.
مقدار filter
در واقع به فایلی در دایرکتوری /etc/fail2ban/filter.d
اشاره میکند، که پسوند .conf
آن حذف شده است. این فایل شامل عبارات منظم (Regular Expressions) هست که تعیین میکند آیا یک خط در لاگ، نشاندهنده یک تلاش ناموفق است یا خیر. این مقاله به جزئیات این فایل نمیپردازد زیرا این تنظیمات پیچیده هستند. با این حال، برای مشاهده فیلترهای موجود، میتوانید دایرکتوری زیر را بررسی کنید:
ls /etc/fail2ban/filter.d
اگر فایلی مرتبط با سرویسی که استفاده میکنید در دایرکتوری /etc/fail2ban/filter.d
پیدا کردید، بهتر است آن را با یک ویرایشگر متنی باز کنید. اکثر این فایلها بهخوبی با کامنتها، توضیح داده شدهاند و میتوانید متوجه شوید که هر اسکریپت برای مقابله با چه نوع شرایطی طراحی شده است. بیشتر این فیلترها دارای بخشهای از پیش تعریفشده (و غیرفعال) در فایل jail.conf
هستند که در صورت نیاز میتوانید آنها را در فایل jail.local
فعال کنید.
فرض کنید وبسایتی را با Nginx میزبانی میکنید و بخشی از سایت که رمزدار است تحت حملات متعدد برای ورود قرار گرفته است. در این حالت، میتوانید به Fail2ban بگویید از فایل nginx-http-auth.conf
برای بررسی این وضعیت در فایل لاگ /var/log/nginx/error.log
استفاده کند.
این پیکربندی از پیش در بخشی به نام [nginx-http-auth]
در فایل /etc/fail2ban/jail.conf
تعریف شده است. تنها کافی است پارامتر enabled
را به این شکل اضافه کنید:
. . .
[nginx-http-auth]
enabled = true
. . .
بعد از اتمام ویرایش فایل، تغییرات را ذخیره کرده و فایل را ببندید. اکنون میتوانید سرویس Fail2ban را فعال کنید تا از این پس بهصورت خودکار اجرا شود. برای این کار دستور زیر را اجرا کنید:
sudo systemctl enable fail2ban
سپس؛ برای بار اول به صورت دستی، fail2ban را با دستور زیر، اجرا کنید:
sudo systemctl start fail2ban
برای اطمینان از اجرای صحیح سرویس، از دستور زیر استفاده کنید:
sudo systemctl status fail2ban
اگر سرویس بهدرستی اجرا شده باشد، خروجی مشابه زیر نمایش داده میشود:
Output
● fail2ban.service - Fail2Ban Service
Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enab>
Active: active (running) since Mon 2022-06-27 19:25:15 UTC; 3s ago
Docs: man:fail2ban(1)
Main PID: 39396 (fail2ban-server)
Tasks: 5 (limit: 1119)
Memory: 12.9M
CPU: 278ms
CGroup: /system.slice/fail2ban.service
└─39396 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
Jun 27 19:25:15 fail2ban22 systemd[1]: Started Fail2Ban Service.
Jun 27 19:25:15 fail2ban22 fail2ban-server[39396]: Server ready
در مرحله بعدی، میتوانید عملکرد Fail2ban را از طریق آزمایش سیاستهای مسدودسازی بررسی کنید.
همچنین بخوانید: نحوه نصب و استفاده از mosh روی سرور مجازی (VPS)
مرحله ۳ – تست سیاستهای مسدودسازی (اختیاری)
برای آزمایش عملکرد Fail2ban، میتوانید با استفاده از یک سرور مجازی (VPS) دیگر (که در آینده نیازی به دسترسی به سرور Fail2ban شما نخواهد داشت)، قوانین مسدودسازی را بررسی کنید. در ابتدا از سرور مجازی دوم خود به سرور مجازی شامل Fail2ban متصل شوید و یک نام کاربری غیرواقعی وارد کنید:
ssh blah@your_server
هنگام درخواست رمز عبور، کاراکترهای تصادفی وارد کنید و این کار را چندین بار تکرار کنید. پس از چند بار تلاش ناموفق، پیام خطا از Permission denied به Connection refused تغییر میکند. این پیام نشاندهنده این است که سرور مجازی دوم شما توسط Fail2ban از دسترسی به سرور مجازی Fail2ban مسدود شده است.
روی سرور Fail2ban، میتوانید قوانین جدید مسدودسازی را با استفاده از دستور iptables
مشاهده کنید:
sudo iptables -S
دستور فوق، تمام قوانین فایروال فعلی را نمایش میدهد. اگر از ابزار مدیریت فایروال ufw استفاده میکنید، این قوانین نیز در خروجی نشان داده میشوند:
-P INPUT DROP
-P FORWARD DROP
-P OUTPUT ACCEPT
-N f2b-sshd
-N ufw-after-forward
-N ufw-after-input
-N ufw-after-logging-forward
-N ufw-after-logging-input
-N ufw-after-logging-output
-N ufw-after-output
-N ufw-before-forward
-N ufw-before-input
-N ufw-before-logging-forward
-N ufw-before-logging-input
-N ufw-before-logging-output
برای مشاهده قوانینی که Fail2ban به فایروال اضافه کرده است، میتوانید خروجی دستور iptables -S
را با دستور grep
ترکیب کنید تا بهطور خاص دنبال رشتهی f2b بگردید. این رشته نشاندهنده قوانینی است که Fail2ban برای مسدودسازی تنظیم کرده است:
sudo iptables -S | grep f2b
در خروجی، قطعه کدی شبیه به موارد زیر نمایش داده خواهد شد:
-N f2b-sshd
-A INPUT -p tcp -m multiport --dports 22 -j f2b-sshd
-A f2b-sshd -s 134.209.165.184/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-sshd -j RETURN
خطی که حاوی REJECT --reject-with icmp-port-unreachable
است، توسط Fail2ban اضافه شده است و باید شامل آدرس IP سرور دوم شما باشد. این خط نشاندهنده این است که Fail2ban درخواستهای ورودی از آدرس IP مسدود شده را رد کرده است و به جای پاسخ به درخواست، پیامی با نوع icmp-port-unreachable
ارسال میکند تا از دسترسی غیرمجاز جلوگیری کند.
نتیجهگیری
حالا باید بتوانید سیاستهای مسدودسازی را، برای خدمات خود پیکربندی کنید. Fail2ban ابزاری مفید برای محافظت از هر نوع سرویسی است که از احراز هویت استفاده میکند.
همچنین، شما میتوانید از سرویس VPS (سرور مجازی) لیارا، استفاده کنید. سرور مجازی لیارا، با ارائه زیر ساخت منعطف و مقیاسپذیر، با آخرین بهروزرسانیهای نرمافزاری و سختافزاری، این امکان را به شما میدهد تا در سریعترین زمان ممکن و به سادهترین روشهای موجود، برنامههای خود را توسعه دهید.
همچنین بخوانید: ۵۰ دستور برتر لینوکس Linux که باید بدانید