تغییرات اخیر

در اینجا اطلاعیه‌ها، نسخه‌ها و تغییرات جدید لیارا فهرست می‌شوند.

چطور با استفاده از Fail2Ban در اوبونتو 22.04 از سرور Nginx خود محافظت کنیم!


۱۷ اسفند ۱۴۰۳

وقتی یک وب سرور راه‌اندازی می‌کنید، ممکن است بخواهید دسترسی به برخی بخش‌های سایت را محدود کنید. معمولاً خود سایت روش‌هایی برای تأیید هویت کاربران دارد، اما گاهی لازم است این کار را از طریق وب سرور انجام دهید. بااین‌حال، این روش می‌تواند امنیت سرور را به خطر بیندازد، چون ممکن است هکرها از آن برای نفوذ استفاده کنند.

هر سرویسی که به اینترنت متصل باشد، امکان دارد که مورد حمله قرار بگیرد. اگر گزارش‌های یک وب سرور شلوغ را بررسی کنید، معمولاً تلاش‌های زیادی برای ورود غیرمجاز توسط افراد یا ربات‌ها مشاهده می‌شود.

برای مقابله با این حملات، می‌توان از Fail2ban استفاده کرد. این ابزار تلاش‌های ناموفق ورود را بررسی می‌کند و در صورت مشاهده ورودهای مکرر و مشکوک، IP مهاجم را به‌طور خودکار مسدود می‌کند. این کار بدون نیاز به دخالت شما، امنیت سرور را افزایش می‌دهد و از حملات brute force جلوگیری می‌کند.

در این راهنما از لیارا یاد خواهید گرفت چگونه Fail2ban را روی سرور Ubuntu 22.04 نصب کنید تا مثل یک نگهبان هوشمند، گزارش‌های Nginx را زیر نظر بگیرد و جلوی ورودهای مشکوک را بگیرد. حتی اگر کسی بارها رمز اشتباه وارد کند، Fail2ban او را شناسایی کرده و دسترسی‌اش را مسدود می‌کند، درست مثل یک نگهبان که مزاحمان را از یک مهمانی بیرون می‌اندازد!

آنچه در ادامه خواهید خواند:

  • پیش‌نیازها
  • مرحله اول: نصب و پیکربندی Fail2ban
  • مرحله دوم: پیکربندی Fail2Ban برای نظارت بر لاگ‌های Nginx
  • مرحله سوم: بررسی فیلترها برای Jail‌های Nginx
  • مرحله چهارم: فعال‌سازی Jail‌های Nginx
  • مرحله پنجم: تست سیاست‌های Fail2Ban
  • سوالات متداول
  • جمع بندی

پیش‌نیازها:

  • دسترسی به محیط سرور Ubuntu 22.04 با یک کاربر غیر ریشه‌ای که دسترسی‌های sudo را برای انجام کارهای مدیریتی داشته باشد.
  • نصب Nginx بر روی سیستم، مطابق با مراحل اول و دوم که در ادامه برای نصب Nginx بر روی Ubuntu 22.04 به آن خواهیم پرداخت.
  • نصب و پیکربندی Nginx با احراز هویت رمز عبور.
نصب و پیکربندی Fail2ban

مرحله اول: نصب و پیکربندی Fail2ban

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; disabled; vendor preset: enabled)
     Active: inactive (dead)
       Docs: man:fail2ban(1)

شما می‌توانید Fail2ban را بعد از آن بلافاصله فعال کنید، اما قبل از همه چیز باید ویژگی‌های آن را بشناسید.

سرویس Fail2ban فایل‌های پیکربندی خود را در دایرکتوری /etc/fail2ban نگهداری می‌کند. در این دایرکتوری فایلی با تنظیمات پیش‌فرض به نام jail.conf وجود دارد. برای مشاهده ۲۰ خط اول این فایل از دستور زیر استفاده کنید.

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]

🔷بیشتر بخوانید: نحوه میزبانی وبسایت با استفاده از Cloudflare و Nginx در اوبونتو 22.04

همانطور که مشاهده می‌کنید، خط‌های اولیه این فایل به‌صورت کامنت هستند و با علامت # مشخص شده‌اند که این قسمت‌ها برای راهنمایی و مستندسازی است و نباید هیچ‌گونه تغییری کنند. همچنین، این کامنت‌ها به شما می‌گویند که نباید فایل jail.conf را مستقیماً تغییر دهید.

در عوض، دو گزینه را پیش روی خود دارید: می‌توانید پروفایل‌های جداگانه برای Fail2ban که در چندین فایل دایرکتوری jail.d/ است را ایجاد کنید، یا تمام تنظیمات محلی خود را در یک فایل jail.local جمع‌آوری کنید.

فایل jail.conf به‌طور مداوم به‌روزرسانی می‌شود و تنظیمات پیش‌فرض را برای مواردی که شما تغییر نداده‌اید، نگه می‌دارد.

در این مطلب شما باید فایل jail.local را بسازید. برای این کار ابتدا آن را از فایل jail.conf کپی کنید.

sudo cp jail.conf jail.local

در این مرحله می‌توانید تغییرات پیکربندی را آغاز کنید. برای ویرایش فایل، از ویرایشگر nano یا ویرایشگر دلخواه خود استفاده کنید.

sudo nano jail.local
روفایل‌های جداگانه برای Fail2ban

تغییر تنظیمات پیش‌ فرض

برای این کار ابتدا باید تنظیمات پیش‌فرض موجود در فایل jail.local را بررسی کنید. این تنظیمات در بخش [DEFAULT] قرار دارند و وظیفه اصلی آن تعیین قوانین است. اما این امکان وجود دارد که تمامی مقادیر را می‌توانید برای هر برنامه به صورت جداگانه تغییر دهید. اگر از ویرایشگر nano استفاده می‌کنید، می‌توانید با فشار دادن Ctrl+W جستجو خود را انجام دهید.

یکی از ابتدایی ترین مواردی که باید به آن توجه داشته باشید و آن را بررسی کنید، لیست آی‌پی‌هایی است که از قوانین Fail2ban مستثنی هستند است. تمامی این تنظیمات با دستور ignoreip مشخص می‌شوند.

پیشنهاد ما به شما این است که آدرس آی‌پی یا شبکه خود را به این لیست اضافه کنید تا از مسدود شدن دسترسی‌تان جلوگیری کند.

این مشکل در ورود به وب سرور کمتر از SSH پیش می‌آید، زیرا اگر به شل دسترسی داشته باشید، می‌توانید مسدودیت را لغو کنید. برای اضافه کردن آدرس آی‌پی خود، کافی است خط مورد نظر را از حالت کامنت خارج کرده و آی‌پی‌ها یا شبکه‌های مورد نظر را با فاصله وارد کنید.

/etc/fail2ban/jail.local
[DEFAULT]

. . .
#ignoreip = 127.0.0.1/8 your_home_IP

مورد بعدی که باید تنظیم کنید، bantime است که مدت زمان مسدود شدن یک کاربر را تعیین می‌کند. این زمان باید به‌شکلی تنظیم شود که برای حملات خودکار آزاردهنده باشد، اما به کاربران واقعی فرصت کافی برای اصلاح اشتباهاتشان را بدهد. به‌صورت پیش‌فرض، این زمان 10 دقیقه است که می‌توانید آن را افزایش یا کاهش دهید.

/etc/fail2ban/jail.local
[DEFAULT]

. . .
bantime = 10m

دو تنظیم بعدی که باید به آن بپردازید، findtime , maxretry است.

  • findtime مدت زمان در ثانیه را مشخص می‌کند.
  • maxretry تعداد تلاش‌های مجاز در آن زمان را تعیین می‌کند.

اگر یک کاربر بیش از تعداد مجازش تلاش کند، مسدود خواهد شد.

/etc/fail2ban/jail.local
[DEFAULT]

. . .
findtime = 10m
maxretry = 5

تنظیم اطلاع‌ رسانی ایمیلی (اختیاری)

شما می‌توانید گزینه دریافت اطلاع‌رسانی ایمیلی را فعال کنید تا هر بار که یک کاربر مسدود می‌شود، ایمیلی دریافت کنید. برای این کار، ابتدا باید یک MTA (Mail Transfer Agent) مانند Postfix را روی سرور خود نصب کنید.

پس از راه‌اندازی MTA، باید تنظیمات اضافی را در فایل /etc/fail2ban/jail.local انجام دهید. ابتدا باید دستور mta را تنظیم کنید. اگر از Postfix به عنوان MTA استفاده کرده‌اید، باید مقدار آن را به mail تغییر دهید.

/etc/fail2ban/jail.local
[DEFAULT]

. . .
mta = mail

سپس، آدرس ایمیلی که می‌خواهید اطلاعیه‌ها را دریافت کنید، در فیلد destemail وارد کنید. گزینه sendername آدرس ارسال‌کننده ایمیل را مشخص می‌کند که باید با پیکربندی Postfix شما کاملا سازگار باشد.

/etc/fail2ban/jail.local
[DEFAULT]

. . .
destemail = youraccount@email.com
sendername = root@<fq-hostname>

در نهایت، پارامتر action مشخص می‌کند که Fail2ban هنگام مسدود کردن یک کاربر چه عملی را انجام می‌دهد. مقدار action_ در فایل پیش از این پارامتر تعریف شده است و به‌طور پیش‌فرض، این عمل باعث به‌روزرسانی تنظیمات فایروال شما برای مسدود کردن ترافیک از آی‌پی تا پایان زمان مسدودیت می‌شود.

/etc/fail2ban/jail.local
[DEFAULT]
. . .
action = $(action_)s
. . .

اسکریپت‌ های عمل action_ پیش‌ فرض

در فایل پیکربندی، اسکریپت‌های action_ دیگری به‌طور پیش‌فرض ارائه شده است که می‌توانید به جای $(action_) از آن‌ها استفاده کنید.

/etc/fail2ban/jail.local
…
# مسدود کردن و ارسال ایمیل با گزارش Whois به آدرس destemail.
action_mw = %(action_)s
            %(mta)s-whois[sender="%(sender)s", dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]

# مسدود کردن و ارسال ایمیل با گزارش Whois و خطوط مرتبط از لاگ به آدرس destemail.
action_mwl = %(action_)s
             %(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]
…

هم action_mw و هم action_mwl به‌طور خودکار ایمیل‌هایی با استفاده از پیکربندی که شما ارائه داده‌اید ارسال می‌کنند. در مرحله بعد، به پیکربندی خاص Nginx خواهید پرداخت.

🔶شاید شما به دنبال این آموزش باشید: راهنمای استفاده از Nessus برای اسکن آسیب‌ پذیری‌ها در Ubuntu 22.04

مرحله دوم: پیکربندی Fail2Ban برای نظارت بر لاگ‌ های Nginx

حالا که تنظیمات عمومی Fail2Ban را انجام داده‌اید، می‌توانید برخی از Jail‌ های خاص Nginx را فعال کنید، این گزینه لاگ‌های سرور وب شما را برای الگوهای خاص نظارت می‌کنند.

در فایل پیکربندی، هر قسمت مربوط به یک Jail است که نام آن داخل براکت‌ها مشخص می‌شود. مثلا، بخش مربوط به ssh داخل براکت‌های [ssh] است. به‌طور پیش‌فرض، فقط قسمت مربوط به ssh فعال است و بقیه غیر فعال خواهند بود.

برای فعال کردن نظارت بر تلاش‌های ورود به سیستم Nginx، باید بخش [nginx-http-auth] را فعال کنید. برای این کار، کافی است دستور enabled = true را در این بخش اضافه کنید.

/etc/fail2ban/jail.local
…
enabled = true port = http,https logpath = %(nginx_error_log)s . . .

بعد از انجام تغییرات، فایل را ذخیره کرده و ببندید. اگر از ویرایشگر nano استفاده می‌کنید، کلیدهای Ctrl+X را فشار دهید، سپس وقتی از شما خواسته شد، کلید Y را وارد کنید و سپس Enter را بزنید.

در مرحله بعد، پیکربندی فیلتر برای nginx-http-auth را بررسی خواهید کرد.

 نظارت بر لاگ‌ های Nginx

مرحله سوم: بررسی فیلترها برای Jail‌های Nginx

ممکن است متوجه شده باشید که بخش [nginx-http-auth] در فایل jail.local هیچ قانونی خاصی برای Nginx ندارد. این قوانین به‌طور خودکار در Fail2ban تعریف نشده‌اند. در واقع، نام [nginx-http-auth] به یک فایل در دایرکتوری filter.d اشاره دارد که فیلترهای آماده Fail2ban در آنجا قرار دارند. برای دیدن فیلترهای دیگر که از قبل تنظیم شده‌اند، می‌توانید محتویات این دایرکتوری را بررسی کنید.

ls /etc/fail2ban/filter.d
3proxy.conf                freeswitch.conf         proftpd.conf
apache-auth.conf           froxlor-auth.conf       pure-ftpd.conf
apache-badbots.conf        gitlab.conf             qmail.conf
apache-botsearch.conf      grafana.conf            recidive.conf
apache-common.conf         groupoffice.conf        roundcube-auth.conf
apache-fakegooglebot.conf  gssftpd.conf            scanlogd.conf
apache-modsecurity.conf    guacamole.conf          screensharingd.conf
apache-nohome.conf         haproxy-http-auth.conf  selinux-common.conf
apache-noscript.conf       horde.conf              selinux-ssh.conf
apache-overflows.conf      ignorecommands          sendmail-auth.conf
apache-pass.conf           kerio.conf              sendmail-reject.conf
apache-shellshock.conf     lighttpd-auth.conf      sieve.conf
assp.conf                  mongodb-auth.conf       slapd.conf
asterisk.conf              monit.conf              softethervpn.conf
bitwarden.conf             murmur.conf             sogo-auth.conf
…

بررسی فایل nginx-http-auth.conf

برای بررسی تنظیمات فیلتر، به فایل nginx-http-auth.conf نگاه کنید.

cat /etc/fail2ban/filter.d/nginx-http-auth.conf
# fail2ban filter configuration for nginx

[Definition]

failregex = ^ \[error\] \d+#\d+: \*\d+ user "(?:[^"]+|.*?)":? (?:password mismatch|was not found in "[^\"]*"), client: <HOST>, server: \S*, request: "\S+ \S+ HTTP/\d+\.\d+", host: "\S+"(?:, referrer: "\S+")?\s*$

ignoreregex =

datepattern = {^LN-BEG}
…

این فایل‌ها شامل عبارات منظم Regular Expressions هستند که مشخص می‌کنند که آیا یک خط در گزارش نشان‌دهنده تلاش ناموفق برای ورود است یا خیر. اگر نیاز باشد، می‌توانید این عبارات را مستقیماً ویرایش کرده و تغییر دهید.

در مراحل بعدی، Fail2ban را فعال کرده و آن را تست خواهید کرد.

مرحله چهارم: فعال‌سازی Jail‌های Nginx

در این مرحله، می‌توانید سرویس Fail2ban را فعال کنید تا از این پس به‌صورت خودکار اجرا شوند. ابتدا دستور systemctl enable را اجرا کنید.

sudo systemctl enable fail2ban

سپس برای اولین بار آن را به‌صورت دستی با دستور systemctl start راه‌اندازی کنید.

sudo systemctl start fail2ban

برای اطمینان از اینکه سرویس در حال اجرا است، می‌توانید وضعیت آن را با دستور systemctl status بررسی کنید.

sudo systemctl status fail2ban
● fail2ban.service - Fail2Ban Service
     Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enabled
     Active: active (running) since Fri 2022-07-08 17:19:38 UTC; 7s ago
       Docs: man:fail2ban(1)
   Main PID: 5962 (fail2ban-server)
      Tasks: 7 (limit: 2327)
     Memory: 12.6M
        CPU: 195ms
     CGroup: /system.slice/fail2ban.service
             └─5962 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
  • 💡نکته: برای اعمال هرگونه تغییرات پیکربندی دیگر، باید سرویس Fail2ban را مجدداً راه‌اندازی کنید. این کار را می‌توانید با دستور زیر انجام دهید.
sudo systemctl restart fail2ban

دریافت اطلاعات درباره Jail‌های فعال

برای مشاهده تمامی Jail‌های فعال خود، از دستور fail2ban-client استفاده کنید.

sudo fail2ban-client status
دریافت اطلاعات درباره Jail‌های فعال

خروجی باید شامل لیستی از Jail‌های فعال باشد.

Status
|- Number of jail:      2
`- Jail list:           nginx-http-auth, sshd

برای مشاهده جزئیات درباره محدودیت‌های اعمال شده توسط هر Jail، دوباره از دستور fail2ban-client استفاده کنید.

sudo fail2ban-client status nginx-http-auth
Status for the jail: nginx-http-auth
|- filter
|  |- File list:        /var/log/nginx/error.log 
|  |- Currently failed: 0
|  `- Total failed:     0
`- action
   |- Currently banned: 0
   |  `- IP list:
   `- Total banned:     0

مرحله پنجم: تست سیاست‌های Fail2Ban

برای اطمینان از اینکه سیاست‌های Fail2Ban به درستی کار می‌کنند، لازم است آن‌ها را تست کنید. برای این کار، به سرور خود در یک مرورگر محلی بروید. در پنجره احراز هویت Nginx، چندین بار اطلاعات اشتباه را وارد کنید. بعد از چند تلاش ناموفق، سرور باید به طور کامل از پاسخ دادن به شما خودداری کند.

اگر وضعیت پیکربندی nginx-http-auth را با استفاده از دستور fail2ban-client بررسی کنید، مشاهده خواهید کرد که آدرس IP شما از سایت مسدود شده است.

sudo fail2ban-client status nginx-http-auth
Status for the jail: nginx-http-auth
|- Filter
|  |- Currently failed: 0
|  |- Total failed:     5
|  `- File list:        /var/log/nginx/error.log
`- Actions
   |- Currently banned: 1
   |- Total banned:     1
   `- Banned IP list:   108.172.85.62

همچنین می‌توانید این قانون را با بررسی خروجی iptables مشاهده کنید. iptables ابزاری برای مدیریت قوانین پورت و فایروال سطح پایین در سرور شما است. اجرای دستور iptables -S تمامی قوانین فایروال ایجاد شده توسط ufw را نمایش می‌دهد.

sudo iptables -S
-P INPUT DROP
-P FORWARD DROP
-P OUTPUT ACCEPT
-N f2b-nginx-http-auth
-N ufw-after-forward
-N ufw-after-input
...

اگر خروجی iptables -S را به grep ارسال کنید و به دنبال رشته f2b بگردید، می‌توانید قوانینی که توسط fail2ban اضافه شده است را مشاهده کنید.

sudo iptables -S | grep f2b
-N f2b-nginx-http-auth
-A INPUT -p tcp -m multiport --dports 80,443 -j f2b-nginx-http-auth
-A f2b-nginx-http-auth -s 108.172.85.62/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-nginx-http-auth -j RETURN

خطی که شامل REJECT --reject-with icmp-port-unreachable است، توسط Fail2ban اضافه شده و باید با آدرس IP دستگاه شما منعطف باشد. زمانی که از عملکرد قوانین خود مطمئن شدید، می‌توانید آدرس IP خود را به صورت دستی از مسدودیت خارج کنید. برای این‌کار می‌توانید از دستور زیر استفاده کنید.

sudo fail2ban-client set nginx-http-auth unbanip 108.172.85.62

حال می‌توانید دوباره اقدام به احراز هویت کنید.

شما می‌توانید از سرویس VPS (سرور مجازی) لیارا استفاده کنید. سرور مجازی لیارا با زیرساختی منعطف و مقیاس‌پذیر، به‌روزترین نرم‌افزارها و سخت‌افزارها را ارائه می‌دهد تا بتوانید به راحتی و در سریع‌ترین زمان ممکن، برنامه‌های خود را راه‌اندازی و توسعه دهید.

سوالات متداول:

در ادامه به چند سوال کوتاه و مرتبط با Fail2ban و امنیت سرور پاسخ خواهیم داد که می‌توانید از آن‌ها بهره‌برداری کنید.

Fail2ban چیست و چگونه کار می‌کند؟

Fail2ban یک ابزار امنیتی است که با مسدود کردن IP های مشکوک و جلوگیری از تلاش‌های ورود ناموفق، از سرور شما در برابر حملات brute force محافظت می‌کند.

چگونه Fail2ban را روی سرور Ubuntu نصب کنم؟

در این مقاله مراحل نصب و پیکربندی Fail2ban را بروی Ubuntu شرح داده‌ایم تا با استفاده از آن سرور خود را در برابر حملات محفوظ نگه‌دارید.

چگونه می‌توانم فیلترهای Fail2ban را برای Nginx فعال کنم؟

برای فعال کردن نظارت بر تلاش‌های ورود به سیستم Nginx در Fail2ban، باید بخش [nginx-http-auth] را در فایل پیکربندی فعال کنید.

چگونه مدت زمان مسدودیت یک کاربر را در Fail2ban تنظیم کنم؟

می‌توانید مدت زمان مسدودیت را با تنظیم bantime در فایل پیکربندی jail.local تغییر دهید تا برای کاربران واقعی فرصت اصلاح اشتباهات فراهم شود.

چگونه می‌توانم اطلاع‌رسانی ایمیلی برای مسدودیت‌ها در Fail2ban فعال کنم؟

برای فعال کردن اطلاع‌رسانی ایمیلی در Fail2ban، باید یک MTA مانند Postfix را نصب کرده و تنظیمات مربوطه را در فایل پیکربندی jail.local انجام دهید.

آیا می‌توانم قوانین Fail2ban را به دلخواه تغییر دهم؟

بله، شما می‌توانید قوانین پیش‌فرض Fail2ban را با ویرایش فایل‌های فیلتر در دایرکتوری filter.d تغییر دهید تا دقیقا مطابق نیازهای خود عمل کند.

چگونه می‌توانم ببینم که Fail2ban چه قوانینی را اعمال کرده است؟

با استفاده از دستور iptables -S می‌توانید تمام قوانین فایروال که توسط ufw یا Fail2ban اعمال شده‌اند را مشاهده کنید.

Fail2ban

جمع بندی

Fail2ban یک ابزار حیاتی برای محافظت از سرور شما، در برابر حملات brute force و تلاش‌های ناموفق در ورود است. با پیکربندی درست آن، می‌توانید به‌طور خودکار دسترسی‌های مشکوک را مسدود کنید و از سرور خود در برابر تمامی این تهدیدات محافظت کنید. تنظیماتی مانند bantime برای تعیین مدت زمان مسدودیت، action برای انجام اقدامات خودکار و فعال‌سازی اطلاع‌رسانی ایمیلی، شما را در مدیریت امنیت سرور یاری می‌کنند. همچنین با استفاده از ابزارهایی مانند iptables می‌توانید قوانین فایروال را بررسی کرده و مطمئن شوید که سرور شما همیشه امنیت لازم را دارد. این تنظیمات به شما کمک می‌کند تا با کمترین دخالت دستی، سرور خود را ایمن نگه دارید.

برچسب‌ها: