WIUNIX ACADEMY
محافظت از Nginx با Fail2ban؛ لاگ معتبر، مسدودسازی محدود و بازیابی
صفحهٔ 5 از 6؛ مراحل قبلی و پیشنیازها را پیش از ادامه مرور کن.
آموزش متناسب با محیط تو
کجا اجرا میکنی؟
سیستمعامل و نسخه را انتخاب کن تا مراحل، دستورها و راهحلها برای همان محیط نمایش داده شوند.
آموزش متناسب با مقادیر تو
تنظیمات این آموزش
مقادیر نمونه را برای محیط خودت تنظیم کن؛ متن و دستورهای مرتبط با هم تغییر میکنند. رمز، کلید خصوصی و توکن وارد نکن. مقادیر فقط در همین زبانه نگهداری میشوند و به سرور یا لینک اشتراکگذاری فرستاده نمیشوند. پیش از اجرا، DNS، گواهیها و سیاست شبکهٔ واقعی را بررسی کن.
آیپی، دامنه یا پورت مثالها با محیط تو فرق دارد؟ دکمهٔ زیر را باز کن، مقادیر را تغییر بده و «اعمال در آموزش» را بزن؛ سپس دستورهای بهروزشده را کپی کن.
تنظیم مقادیر برای محیط من11 مقدار قابلتغییر
قدم بعدی
فقط ban آزمایشی و daemon مستقل را متوقف کنید
در تمام دستورات این آزمایش، socket اختصاصی را صریح بنویسید. ثبت UNBAN را ببینید و سپس همان instance را متوقف کنید. مدارک در پوشهٔ خصوصی میمانند. PID یا socket ناشناس را حذف نکنید و صرفاً بر اساس شباهت نام، فرایندی را نکشید.
ترمینال Bash میزبان آزمایشگاهی اختصاصی
set -e
sudo fail2ban-client -c "/srv/academy-fail2ban-lab/conf" -s "/srv/academy-fail2ban-lab/fail2ban.sock" set academy-nginx-lab unbanip 192.0.2.60
sudo cat "/srv/academy-fail2ban-lab/actions.log"
sudo fail2ban-client -c "/srv/academy-fail2ban-lab/conf" -s "/srv/academy-fail2ban-lab/fail2ban.sock" stop
UNBAN مربوط به IP آزمایش ثبت میشود؛ socket مستقل بسته شده و سرویس اصلی هنوز masked است.
محل واقعی اجرای مسدودسازی را انتخاب کنید
فعالسازی اختیاری بعدی فایروال میزبان آزمایشگاهی را تغییر میدهد. nftables[type=multiport] جدول inet و مجموعههای جدا برای IPv4 و IPv6 میسازد و روی input فقط TCP 443 را رد میکند. قواعد قبلی همچنان میتوانند کاربر مجاز را ببندند. Fail2ban جای فایروال با سیاست پیشفرض deny نیست؛ موفقیت action هم به معنی آزمون دسترسی شبکه نیست. نام iptables-legacy، iptables-nft، nftables، UFW و firewalld را به جای یکدیگر به کار نبرید؛ hook، اولویت و مالک قواعد را ببینید.
خروجی UFW تمام قواعد مستقل nftables را نشان نمیدهد. reload یک مدیر یا flush کل ruleset ممکن است قواعد مدیر دیگر را پاک کند. یک مدل مالکیت روشن انتخاب و پس از reload یا reboot بررسی کنید. راهکار DOCKER-USER در backend نوع iptables را بیبررسی به backend نوع nftables یا این action ورودی تعمیم ندهید.
override اختصاصی را باز کنید
فقط در نصب تازهٔ آزمایش، پیش از برداشتن mask، jail پیشفرض SSH را صریحاً غیرفعال کنید؛ این آموزش تغییری به jail موجود SSH نمیدهد. فایلهای اصلی jail.conf و فیلتر و action بسته را حفظ کنید. فایلهای local بعد از conf خوانده میشوند و فایل local با ترتیب بعدی میتواند مقدار را عوض کند؛ خروجی نهایی را بررسی کنید.
ترمینال Bash میزبان آزمایشگاهی اختصاصی
sudo test ! -e /etc/fail2ban/jail.d/90-academy-nginx.local && sudo nano /etc/fail2ban/jail.d/90-academy-nginx.local
قدم بعدی
یک jail محدود به پورت وب تنظیم کنید
این دو بخش فقط برای استقرار تازهٔ آزمایشگاهیاند و پس از تأیید IP مستقیم و دسترسی مدیر استفاده میشوند. ignoreip پورتی را در فایروال باز نمیکند؛ فقط از تصمیم ban معاف میکند. اگر مدیریت از IPv6 است، پیش از شروع IP دقیق آن را در همین فایل اضافه کنید. مجازکردن کل رنج CDN، مشکل نبود مسدودسازی کاربر در لبه را حل نمیکند.
محتوای فایل؛ ویرایش روی میزبان آزمایشگاهی اختصاصی
[sshd]
enabled = false
[academy-nginx]
enabled = true
filter = academy-nginx-401
backend = polling
logpath = /var/log/nginx/academy-auth.log
usedns = no
ignoreip = 127.0.0.1/8 ::1 198.51.100.10
findtime = 600
maxretry = 5
bantime = 600
port = 443
protocol = tcp
banaction = nftables[type=multiport]
action = %(action_)s
jail مؤثر، فایل و پورت TCP درست را هدف گرفته و SSH پیشفرض این نصب تازه غیرفعال است.
قدم بعدی
پیکربندی نهایی را پیش از شروع بخوانید
فقط وقتی به فعالسازی بروید که academy-nginx تنها jail فعال باشد، آزمایش بیخطر موفق شده باشد و action مربوط به TCP و IP مجاز با میزبان مستقیم شما هماهنگ باشد. این دو دستور jail را شروع نمیکنند.
ترمینال Bash میزبان آزمایشگاهی اختصاصی
sudo fail2ban-client -t && sudo fail2ban-client -d
فقط jail بررسیشده و action مربوط به TCP در nftables دیده میشود.
قدم بعدی
فقط jail بررسیشده را فعال کنید
پیش از اجرای بخش دوم، dump را بخوانید: فقط academy-nginx فعال باشد؛ action ایمیل یا API ابری نداشته باشد و IP مجاز و پورت TCP درست باشد. اگر jail دیگری فعال بود، اول علت را پیدا کنید. روی میزبان آزمایشگاهی مجاز فقط mask ساختهشدهٔ همین مسیر را بردارید. برای نمایش نتیجه، خط مصنوعی به لاگ واقعی نریزید و IP واقعی را دستی ban نکنید. action میتواند هنگام اولین ban آغاز شود؛ پس نبود جدول قبل از آن بهتنهایی خطا نیست.
ترمینال Bash میزبان آزمایشگاهی اختصاصی
set -e
sudo systemctl unmask fail2ban.service
sudo systemctl enable --now fail2ban.service
sudo fail2ban-client status
sudo fail2ban-client status academy-nginx
sudo fail2ban-client get academy-nginx ignoreip
sudo nft list ruleset
فقط jail موردنظر فعال است؛ IP واقعی عمداً ban نشده و نشست دوم SSH همچنان کار میکند.