چطور با استفاده از 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 در مخازن اوبونتو موجود است، بنابراین ابتدا لیست بستهها را بهروزرسانی کنید و بعد از آن به نصب بپردازید.
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

تغییر تنظیمات پیش فرض
برای این کار ابتدا باید تنظیمات پیشفرض موجود در فایل 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
را بررسی خواهید کرد.

مرحله سوم: بررسی فیلترها برای 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های فعال باشد.
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 یک ابزار حیاتی برای محافظت از سرور شما، در برابر حملات brute force
و تلاشهای ناموفق در ورود است. با پیکربندی درست آن، میتوانید بهطور خودکار دسترسیهای مشکوک را مسدود کنید و از سرور خود در برابر تمامی این تهدیدات محافظت کنید. تنظیماتی مانند bantime
برای تعیین مدت زمان مسدودیت، action
برای انجام اقدامات خودکار و فعالسازی اطلاعرسانی ایمیلی، شما را در مدیریت امنیت سرور یاری میکنند. همچنین با استفاده از ابزارهایی مانند iptables
میتوانید قوانین فایروال را بررسی کرده و مطمئن شوید که سرور شما همیشه امنیت لازم را دارد. این تنظیمات به شما کمک میکند تا با کمترین دخالت دستی، سرور خود را ایمن نگه دارید.