← شروع آموزش

WIUNIX ACADEMY

محافظت از Nginx با Fail2ban؛ لاگ معتبر، مسدودسازی محدود و بازیابی

صفحهٔ 4 از 6؛ مراحل قبلی و پیش‌نیازها را پیش از ادامه مرور کن.

آموزش متناسب با محیط تو

کجا اجرا می‌کنی؟

سیستم‌عامل و نسخه را انتخاب کن تا مراحل، دستورها و راه‌حل‌ها برای همان محیط نمایش داده شوند.

Debian 12 LTSبررسی‌شده با مستندات رسمی ·

آموزش متناسب با مقادیر تو

تنظیمات این آموزش

مقادیر نمونه را برای محیط خودت تنظیم کن؛ متن و دستورهای مرتبط با هم تغییر می‌کنند. رمز، کلید خصوصی و توکن وارد نکن. مقادیر فقط در همین زبانه نگهداری می‌شوند و به سرور یا لینک اشتراک‌گذاری فرستاده نمی‌شوند. پیش از اجرا، DNS، گواهی‌ها و سیاست شبکهٔ واقعی را بررسی کن.

آی‌پی، دامنه یا پورت مثال‌ها با محیط تو فرق دارد؟ دکمهٔ زیر را باز کن، مقادیر را تغییر بده و «اعمال در آموزش» را بزن؛ سپس دستورهای به‌روز‌شده را کپی کن.

تنظیم مقادیر برای محیط من11 مقدار قابل‌تغییر
11

قدم بعدی

تمام وضعیت daemon را داخل آزمایش نگه دارید

این فایل کامل و حداقلی است. دیتابیس ماندگار ban ساخته نمی‌شود. daemon به systemd وصل نیست و فقط از socket اختصاصی کنترل می‌شود.

INI · /srv/academy-fail2ban-lab/conf/fail2ban.conf

محتوای فایل؛ ویرایش روی میزبان آزمایشگاهی اختصاصی

[Definition]
loglevel = INFO
logtarget = /srv/academy-fail2ban-lab/daemon.log
socket = /srv/academy-fail2ban-lab/fail2ban.sock
pidfile = /srv/academy-fail2ban-lab/fail2ban.pid
dbfile = None
از کجا بدانم درست انجام شد؟

همهٔ مسیرها داخل پوشهٔ آزمایش‌اند؛ socket و دیتابیس اصلی استفاده نمی‌شوند.

فایل اقدام بی‌خطر را باز کنید

این action فقط در تنظیمات آزمایش ساخته می‌شود.

Bash

ترمینال Bash میزبان آزمایشگاهی اختصاصی

sudo nano "/srv/academy-fail2ban-lab/conf/action.d/academy-audit.conf"
12

قدم بعدی

فقط تصمیم ban و unban را ثبت کنید

برای شروع، توقف یا بررسی action هیچ دستور شبکه‌ای وجود ندارد. درصد تکراری مربوط به interpolation فایل INI است. فقط IP بررسی‌شده توسط Fail2ban وارد رشتهٔ نقل‌قول‌شده می‌شود؛ tag مربوط به درخواست یا قطعه‌کد shell اضافه نکنید.

INI · /srv/academy-fail2ban-lab/conf/action.d/academy-audit.conf

محتوای فایل؛ ویرایش روی میزبان آزمایشگاهی اختصاصی

[Definition]
actionban = printf '%%s\n' 'BAN <ip>' >> '/srv/academy-fail2ban-lab/actions.log'
actionunban = printf '%%s\n' 'UNBAN <ip>' >> '/srv/academy-fail2ban-lab/actions.log'
از کجا بدانم درست انجام شد؟

تنها اثر جانبی، اضافه‌شدن یک خط به فایل محلی آزمایش است.

jail آزمایشی را باز کنید

این فایل فقط یک jail فعال دارد و تنظیمات jailهای بسته را include نمی‌کند.

Bash

ترمینال Bash میزبان آزمایشگاهی اختصاصی

sudo nano "/srv/academy-fail2ban-lab/conf/jail.conf"
13

قدم بعدی

پنجرهٔ زمانی، آستانه و IP مجاز را تعیین کنید

در findtime برابر 600 ثانیه، هر IP با رسیدن به 5 خطا برای 600 ثانیه ban می‌شود. یک IP پشت NAT ممکن است متعلق به چند کاربر سالم باشد. آستانه را پس از مشاهدهٔ رفتار عادی تنظیم کنید؛ عدد عمومی و تضمین‌شده‌ای وجود ندارد. loopback و IPv4 دقیق مدیر نادیده گرفته می‌شوند. IPهای رزروشدهٔ آزمایش نباید عضو این فهرست باشند.

INI · /srv/academy-fail2ban-lab/conf/jail.conf

محتوای فایل؛ ویرایش روی میزبان آزمایشگاهی اختصاصی

[academy-nginx-lab]
enabled = true
filter = academy-nginx-401
backend = polling
logpath = /srv/academy-fail2ban-lab/events.log
usedns = no
ignoreip = 127.0.0.1/8 ::1 198.51.100.10
findtime = 600
maxretry = 5
bantime = 600
action = academy-audit
از کجا بدانم درست انجام شد؟

یک jail مستقل با action ثبت متنی و آستانه‌های مشخص آماده است.

14

قدم بعدی

تصمیم مسدودسازی را بدون تغییر فایروال بیازمایید

فقط daemon مستقل را شروع کنید. تاریخ فعلی باعث می‌شود پنجرهٔ زمانی واقعاً وارد آزمون شود. باید تصمیم ban برای IPv4 و IPv6 رزروشده ثبت شود؛ 198.51.100.10 و IP با پاسخ 200 نباید ban شوند. polling هم‌زمان با نوشتن فایل تمام نمی‌شود؛ اگر سه ثانیه کافی نبود، وضعیت را دوباره ببینید و خطاهای بیشتری تزریق نکنید. ترافیک واقعی تولید نمی‌شود و این نتیجه، حفاظت اینترنتی را ثابت نمی‌کند.

Bash

ترمینال Bash میزبان آزمایشگاهی اختصاصی

set -e
sudo fail2ban-client -c "/srv/academy-fail2ban-lab/conf" -t
sudo fail2ban-client -c "/srv/academy-fail2ban-lab/conf" -s "/srv/academy-fail2ban-lab/fail2ban.sock" -p "/srv/academy-fail2ban-lab/fail2ban.pid" start
sudo python3 - <<'PY'
from datetime import datetime
from pathlib import Path
stamp = datetime.now().astimezone().isoformat(timespec='seconds')
with Path('/srv/academy-fail2ban-lab/events.log').open('a') as f:
    for address in ('192.0.2.60', '2001:db8::60', '198.51.100.10'):
        for _ in range(5):
            f.write(f'{stamp} f2b {address} 401\n')
    f.write(f'{stamp} f2b 192.0.2.61 200\n')
PY
sleep 3
sudo fail2ban-client -c "/srv/academy-fail2ban-lab/conf" -s "/srv/academy-fail2ban-lab/fail2ban.sock" status academy-nginx-lab
sudo cat "/srv/academy-fail2ban-lab/actions.log"
از کجا بدانم درست انجام شد؟

فقط دو IP رزروشده در ban list و فایل ثبت دیده می‌شوند؛ مدیر و پاسخ موفق وارد فهرست نمی‌شوند.

همهٔ آموزش‌های آکادمی ↗