نحوه امن کردن SSH به وسیله Fail2Ban در دبیان 12
۴ فروردین ۱۴۰۴
مقدمه
SSH یک روش علمی قابل توسعه و پایدار برای اتصال به سرور ابری است که از آن برای تولید کلیدهای جدید SSH استفاده میکنیم و مطمئن میشویم که پروتکل اصلی ایمن باقی میماند. با این حال، هیچ پروتکلی کاملاً ایمن نیست و به دلیل استفاده گسترده SSH در اینترنت، این پروتکل تبدیل به هدفی قابل پیشبینی برای حملات شده است که مهاجمان میتوانند از آن برای دسترسی به سیستمها استفاده کنند.
هر سرویسی که به شبکه متصل باشد، میتواند هدف حملات قرار بگیرد. اگر لاگهای سرویس SSH خود را روی هر سرور پربازدید بررسی کنید، معمولاً حملات مکرر ورود به سیستم را مشاهده خواهید کرد که نمایانگر تلاشهای brute force توسط کاربران و رباتها است. اگرچه میتوانید با انجام برخی بهینهسازیها در سرویس SSH خود، شانس موفقیت این حملات را به حداقل برسانید، مانند غیرفعال کردن احراز هویت با رمز عبور و استفاده از کلیدهای SSH، اما این حملات همچنان میتوانند یک خطر کوچک و دائمی باقی بمانند.
در سیستمهایی که امنیت بسیار مهم است، معمولاً یک VPN مثل WireGuard جلوی سرویس SSH قرار میدهند تا هیچکس نتواند به طور مستقیم از اینترنت به پورت 22 SSH وصل شود، مگر اینکه از نرمافزار خاصی استفاده کند. معمولا این VPNها به طور کلی قابل اعتماد هستند، اما ممکن است کمی پیچیدگی اضافه کنند و برخی از خودکارسازیها یا نرمافزارهای کوچک را مختل کنند.
قبل از پیادهسازی یا در کنار راهاندازی یک VPN کامل، میتوانید از ابزاری به نام Fail2ban استفاده کنید. Fail2ban میتواند حملات brute force را به طور قابلتوجهی کاهش دهد، زیرا قوانینی ایجاد میکند که بهطور خودکار پیکربندی فایروال شما را تغییر میدهد. در این آموزش از لیارا، به معرفی ابزار Fail2ban میپردازیم که میتواند حملات brute force را کاهش دهد. این ابزار به شما کمک میکند تا بدون دخالت مستقیم، سرور خود را در برابر تلاشهای دسترسی ایمن کنید.

پیشنیازها
قبل از شروع آموزش نحوه امن کردن SSH با Fail2ban، باید پیش نیازهای نصب Fail2ban که شامل موارد زیر هستند را داشته باشید:
- یک سرور مجازی دبیان 12 و یک کاربر root با دسترسیهای sudo
- یک سرور مجازی دبیان دیگر برای اتصال به سرور دیبان و تست گرفتن (اختیاری)
در ادامه بخوانید:
- مرحله اول: نصب Fail2ban در دبیان 12
- مرحله دوم: پیکربندی Fail2ban
- جمعبندی
- سوالات متداول
مرحله اول: نصب Fail2ban در دبیان 12
سرویس Fail2ban در مخازن نرمافزاری دبیان موجود است. برای شروع، دستورات زیر را بهعنوان یک کاربر غیر root اجرا کنید تا بستههایتان بهروزرسانی شده و Fail2ban نصب شود:
sudo apt update
sudo apt install fail2ban
بعد از نصب، Fail2ban بهطور خودکار یک سرویس پسزمینه راهاندازی میکند، برای بررسی وضعیت آن میتوانید از دستور systemctl
استفاده کنید:
systemctl status fail2ban.service
خروجی نمونه:
● fail2ban.service - Fail2Ban Service
Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enabled
Active: active (running) since Tue 2022-06-28 16:23:14 UTC; 17s ago
Docs: man:fail2ban(1)
Process: 1942 ExecStartPre=/bin/mkdir -p /run/fail2ban (code=exited, status=0/SUCCESS
Main PID: 1943 (fail2ban-server)
Tasks: 5 (limit: 1132)
Memory: 15.8M
CPU: 280ms
CGroup: /system.slice/fail2ban.service
└─1943 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
اکنون، شما میتوانید از Fail2ban با تنظیمات پیشفرض آن استفاده کنید.
همین الان، بدون کمترین پیچیدگی، سرور مجازی خودتون رو در کمتر از ۳۰ ثانیه، راهاندازی کنید.
✅ عملکرد پایدار ✅ ترافیک نامحدود ✅ هزینه بهصرفه
خرید سرور مجازی ابری
مرحله دوم: پیکربندی Fail2ban
در این مرحله برای امن کردن SSH بهوسیله Fail2ban، باید توجه کنید که سرویس Fail2ban فایلهای پیکربندی خود را در پوشه etc/fail2ban/
نگهداری میکند، که یک فایل به نام Jail.conf
در آنجا وجود دارد. حالا برای نمایش ۲۰ خط اول این فایل از دستور زیر استفاده کنید:
cd /etc/fail2ban
head -20 jail.conf
Output
#
# 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.d/
قرار دهید.
۲. یا همه تغییرات را در یک فایل به نام jail.local
ذخیره کنید.
از آن جایی که fail2ban به طور خودکار بهروزرسانی می شود، فایل Jail.conf
هم به صورت دوره ای بهروزرسانی می شود و بدون هیچ گونه تغییری به عنوان منبع تنظیمات پیش فرض به کار گرفته می شود.
در این آموزش، شما فایل jail.local
را ایجاد میکنید. برای این کار، کافی است با دستور زیر یک کپی از jail.conf
بسازید:
sudo cp jail.conf jail.local
اکنون میتوانید پیکربندی خود را تغییر داده و فایل را در ویرایشگر nano
باز کنید:
sudo nano jail.local
در حالی که فایل را پیمایش میکنیم، برخی گزینههایی که ممکن است بخواهیم بهروزرسانی کنیم را نیز در این آموزش بررسی خواهیم کرد. تنظیماتی که در بخش [DEFAULT]
در ابتدای فایل قرار دارند، برای همه سرویسهای پشتیبانیشده توسط Fail2Ban اعمال میشوند.
در جای دیگری از این فایل، تیترهایی برای [sshd]
و سایر سرویسهایی که شامل تنظیمات خاص سرویس هستند، در بالای تنظیمات پیشفرض اعمال میشوند.
[DEFAULT]
. . .
bantime = 10m
. . .
پارامتر bantime
مشخص میکند که یک کلاینت پس از چند بار ورود ناموفق، برای چه مدت مسدود شود. این مقدار بهصورت پیشفرض ۱۰ دقیقه است اما برحسب ثانیه اندازهگیری میشود.
[DEFAULT]
. . .
findtime = 10m
maxretry = 5
. . .
دو پارامتر بعدی findtime
و maxretry
هستند که با یکدیگر کار میکنند تا شرایط شناسایی و مسدود کردن کاربران مشکوک را مشخص کنند.
پارامتر maxretry
تعیین میکند که یک کلاینت چندبار میتواند در بازه زمانی مشخص شده توسط findtime
تلاش ناموفق داشته باشد، قبل از اینکه مسدود شود.
با تنظیمات پیشفرض، سرویس Fail2Ban کلاینتی را که در ۱۰ دقیقه ۵ بار ورود ناموفق داشته باشد، مسدود میکند.
[DEFAULT]
. . .
destemail = root@localhost
sender = root@<fq-hostname>
mta = sendmail
. . .
تنظیمات بالا نشان میدهد که اگر هنگام انجام اقدامات Fail2ban نیاز به دریافت هشدارهای ایمیلی داشته باشید، باید تنظیمات destemail
، sendername
و mta
را بررسی کنید.
- پارامتر
destemail
آدرس ایمیلی را مشخص میکند که باید پیامهای مسدود شدن به آن ارسال شوند. - پارامتر
sendername
مقدار فیلد “From” در ایمیل را تعیین میکند. - پارامتر
mta
برای پیکربندی نوع سرویس ارسال ایمیل استفاده میشود که بهطور پیشفرض رویsendmail
تنظیم شده است، اما ممکن است بخواهیم از سرویس دیگری مانندPostfix
استفاده کنیم.
[DEFAULT]
. . .
action = $(action_)s
. . .
همانطور که در تنظیمات بالا میبینید، پارامتر action عملی را که Fail2Ban باید هنگام مسدود کردن یک IP انجام دهد، پیکربندی میکند. مقدار action_
که قبل از این پارامتر در فایل تعریف شده است، مشخص میکند که عملیات مسدودسازی چگونه انجام شود.
اگر پیکربندی فایروال خود را بهروزرسانی کنید، ترافیک از میزبانهای متخلف تا زمانی که مدت زمان مسدودیت به پایان برسد، بهطور پیشفرض رد میشود.
اسکریپتهای _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
تمامی مراحل فوق را انجام میدهد و علاوه بر آن، یک بهروزرسانی به API کلودفلر ارسال میکند تا آیپی متخلف در آنجا نیز مسدود شود.
این اسکریپتها به شما اجازه میدهند که علاوه بر مسدودسازی IPها، اقدامات اضافی مانند ارسال ایمیل و بهروزرسانی سرویسهای خارجی مانند Cloudflare را نیز انجام دهید.
شاید به دنبال این مطلب باشید: SSH چیست؟ + نحوه استفاده از SSH برای اتصال به سرور مجازی (VPS)
تنظیمات jail
در قدم بعدی، بخشی از فایل پیکربندی مربوط به سرویسهای فردی است که توسط هدرهایی مانند [sshd]
کنترل میشوند.
هر یک از این بخشها باید بصورت جداگانه با افزودن یک خط دستوری enabled = true
در زیر هدر به همراه تنظیمات دیگر آن مانند زیر فعال شود.
[jail_to_enable]
. . .
enabled = true
. . .
بهطور پیشفرض سرویس SSH فعال و سایر سرویسها غیر فعال هستند، تنظیمات دیگری که در این بخش آمده در واقع یک فیلتر تعیین کننده است. یعنی این فیلتر مشخص میکند که آیا گزارش احراز هویت، موفق است یا خیر!
مقدار فیلتر در واقع به فایلی اشاره دارد که در دایرکتوری /etc/fail2ban/filter.d
قرار دارد، فقط پسوند .conf
از آن حذف شده است.این فایلها حاوی Regular Expressions یا به عبارتی تجزیه و تحلیل متن میباشد و تعیین میکند که آیا یک خط در log تلاشی برای احراز هویت موفق است یا خیر؟
برای ادامه مراحل محافظت از SSH با استفاده از Fail2ban، با بررسی دایرکتوری میتوانید انواع فیلترهای موجود را مشاهده کنید:
ls /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
. . .
سپس وقتی ویرایش فایل /etc/fail2ban/jail.local
تمام شد، آنرا ذخیره کرده و ببندید. در آخر با دستور systemctl
سرویس Fail2ban را مجددا راهاندازی کنید:
sudo systemctl restart fail2ban
در این مرحله، پیکربندی Fail2ban با موفقیت به اتمام رسید:)
همچنین بخوانید: نحوه نصب و استفاده از mosh روی سرور مجازی (VPS)
جمعبندی
همانطور که مشاهده کردید، اگر بخواهیم یک روش مؤثر برای محافظت از هر نوع سرویسی که به احراز هویت نیاز دارد معرفی کنیم، بدون شک Fail2ban گزینهای ایدهآل خواهد بود. با توجه به تمامی توضیحاتی که در این آموزش ارائه کردیم، حالا باید بتوانید سیاستهای مسدودسازی مناسبی برای سرویسهای خود تنظیم کنید.علاوه بر این، راهکارها و نکات مطرحشده برای اطمینان از عملکرد صحیح Fail2ban، قطعاً امنیت سرویسهای شما را تضمین خواهد کرد.
از اینکه در مقاله نحوه امن کردن SSH به وسیله Fail2Ban در دبیان 12 از وبلاگ لیارا با ما همراه بودید، متشکریم. در صورت تمایل به دریافت مشاوره یا ارتباط با کارشناسان لیارا، میتوانید از طریق ارسال تیکت با ما تماس بگیرید.
سوالات متداول
1- چگونه میتوانم Fail2ban را بر روی سرور خود فعال کنم؟
برای فعالسازی Fail2ban بر روی سرور خود، ابتدا باید پیکربندی مربوطه را در فایل jail.local
انجام دهید. سپس سرویس Fail2ban را با دستور systemctl restart fail2ban
راهاندازی مجدد کنید. برای اطلاعات دقیقتر، میتوانید مقاله آموزشی ما در این زمینه را مطالعه کنید.
2. چگونه میتوانم آیپیهای مسدود شده را در Fail2ban مشاهده کنم؟
برای مشاهده آیپیهای مسدود شده توسط Fail2ban، میتوانید از دستور زیر استفاده کنید:
sudo fail2ban-client status sshd
این دستور اطلاعاتی از جمله تعداد آیپیهای مسدودشده در سرویس SSH را نمایش میدهد.
3. آیا Fail2ban میتواند سایر سرویسها را نیز محافظت کند؟
بله، Fail2ban میتواند برای محافظت از سرویسهایی مانند Nginx، Apache، FTP و بسیاری دیگر استفاده شود. کافی است فیلترهای مناسب را برای هر سرویس در فایلهای پیکربندی مربوطه فعال کنید.
4. اگر Fail2ban به اشتباه آیپی من را مسدود کند، چه کار باید انجام دهم؟
در صورتی که آیپی شما به اشتباه مسدود شده باشد، میتوانید با استفاده از دستور زیر آن را از لیست مسدود شدهها خارج کنید:
sudo fail2ban-client unban <IP-ADDRESS>
این دستور آیپی شما را از لیست مسدود شدهها خارج میکند.