WIUNIX ACADEMY
محافظت از Nginx با Fail2ban؛ لاگ معتبر، مسدودسازی محدود و بازیابی
صفحهٔ 2 از 6؛ مراحل قبلی و پیشنیازها را پیش از ادامه مرور کن.
آموزش متناسب با محیط تو
کجا اجرا میکنی؟
سیستمعامل و نسخه را انتخاب کن تا مراحل، دستورها و راهحلها برای همان محیط نمایش داده شوند.
آموزش متناسب با مقادیر تو
تنظیمات این آموزش
مقادیر نمونه را برای محیط خودت تنظیم کن؛ متن و دستورهای مرتبط با هم تغییر میکنند. رمز، کلید خصوصی و توکن وارد نکن. مقادیر فقط در همین زبانه نگهداری میشوند و به سرور یا لینک اشتراکگذاری فرستاده نمیشوند. پیش از اجرا، DNS، گواهیها و سیاست شبکهٔ واقعی را بررسی کن.
آیپی، دامنه یا پورت مثالها با محیط تو فرق دارد؟ دکمهٔ زیر را باز کن، مقادیر را تغییر بده و «اعمال در آموزش» را بزن؛ سپس دستورهای بهروزشده را کپی کن.
تنظیم مقادیر برای محیط من11 مقدار قابلتغییر
قدم بعدی
بسته را بدون شروع jail بررسینشده نصب کنید
شرط این مرحله نبود Fail2ban و mask قبلی برای سرویس آن است. mask قبل از نصب، جلوی شروع خودکار jail مربوط به SSH توسط اسکریپت بسته را میگیرد. فقط mask همین آزمایش را پس از بررسی تنظیمات برمیدارید؛ سرویس امنیتی موجود را mask نکنید. نصب nftables در اینجا به معنی فعالکردن سرویس یا بارگذاری ruleset نیست. اگر اوبونتو candidate نداشت، وضعیت مؤلفهٔ رسمی Universe همان نسخه را بررسی کنید؛ مخزن نسخهٔ دیگر را اضافه نکنید.
ترمینال Bash میزبان آزمایشگاهی اختصاصی
set -e
sudo systemctl mask fail2ban.service
sudo apt-get update
apt-cache policy fail2ban nginx nftables
sudo apt-get install --no-install-recommends fail2ban nftables python3 nano
fail2ban-client --version
nginx -v
dpkg-query -W fail2ban nginx nftables
sudo systemctl is-enabled fail2ban.service || true
بستهٔ مخزن امضاشدهٔ همین نسخه نصب شده؛ نسخهٔ واقعی ثبت میشود و Fail2ban هنوز masked و غیرفعال است.
قدم بعدی
قبل از ویرایش Nginx نسخهٔ بازگشت بگیرید
پوشهٔ خصوصی آزمایش باید جدید باشد. قبل از ویرایش، از تنظیمات Nginx نسخهٔ محلی بگیرید؛ ممکن است اطلاعات حساس داشته باشد، پس آن را عمومی نکنید. این پوشه جای بکاپ خارج از سرور را نمیگیرد. نام دقیق فایل سایت و location تغییرکرده را یادداشت کنید؛ موقع بازیابی فقط همان فایل را با توجه به تغییرات همزمان برگردانید.
ترمینال Bash میزبان آزمایشگاهی اختصاصی
set -e
test ! -e "/srv/academy-fail2ban-lab"
test ! -L "/srv/academy-fail2ban-lab"
sudo install -d -m 0700 "/srv/academy-fail2ban-lab"
sudo tar -C /etc -cpf "/srv/academy-fail2ban-lab/nginx-before.tar" nginx
sudo chmod 0600 "/srv/academy-fail2ban-lab/nginx-before.tar"
sudo tar -tf "/srv/academy-fail2ban-lab/nginx-before.tar"
نسخهٔ خصوصی تنظیمات ساخته شده و فایلهای موردنظر در فهرست آرشیو دیده میشوند.
فایل قالب لاگ را باز کنید
در پیکربندی معمول بسته، فایلهای conf.d داخل http خوانده میشوند؛ این را در خروجی مرحلهٔ اول تأیید کنید. قالب فقط زمان سرور، IP اتصال و کد عددی پاسخ را مینویسد. URL، نام کاربری و هدرهای قابل کنترل کاربر در آن وجود ندارند تا IP جعلی وارد الگو شود. escape=none به کار نبرید.
ترمینال Bash میزبان آزمایشگاهی اختصاصی
sudo test ! -e /etc/nginx/conf.d/academy-fail2ban-format.conf && sudo nano /etc/nginx/conf.d/academy-fail2ban-format.conf
قدم بعدی
قالب کوتاه و مشخصی تعریف کنید
تمام محتوای زیر در context نوع http قرار میگیرد. زمان ISO8601 شامل اختلاف منطقهٔ زمانی است و فیلتر دقیقاً همین ساختار را میخواند. نشانهٔ f2b و ترتیب فیلدها باید با الگو و نمونههای آزمون هماهنگ بمانند.
محتوای فایل؛ ویرایش روی میزبان آزمایشگاهی اختصاصی
log_format academy_auth '$time_iso8601 f2b $remote_addr $status';
قالب یکبار داخل http و بیرون server یا location تعریف شده است.
قدم بعدی
لاگ را به همان بخش دارای احراز هویت وصل کنید
فایل واقعی سایت را که در بررسی اولیه یافتید با ویرایشگر محافظتشده باز کنید. فقط خط زیر را داخل همان location دارای Basic Authentication اضافه کنید؛ TLS، auth_basic، فایل رمز، handler محتوا و مسیرهای قبلی را نگه دارید. این یک قطعهٔ یکخطی است و جایگزین فایل سایت نیست. با تعریف access_log در location، لاگهای ارثرسیده از سطح بالاتر کنار میروند؛ هر لاگ حسابرسی لازم را صریحاً در همان location نیز نگه دارید.
کل API با پاسخهای معمول 401 را هدف نگیرید. مرز واقعی احراز هویت، اولویت locationها و internal redirect را بررسی کنید. ساخت فایل رمز موضوع این مسیر نیست؛ رمز و hash را فقط در فرایند و ویرایشگر محافظتشدهٔ موجود نگه دارید، نه در تنظیمات مرورگر.
محتوای فایل؛ ویرایش روی میزبان آزمایشگاهی اختصاصی
access_log /var/log/nginx/academy-auth.log academy_auth;
فقط همان location موردنظر، لاگ کوتاه جداگانه را مینویسد.
قدم بعدی
پیکربندی و بازشدن لاگ را تأیید کنید
reload فقط روی میزبان آزمایشگاهی و بعد از تهیهٔ نسخهٔ قبل انجام شود. اگر تست تنظیمات خطا داد، reload نکنید. برای حل دسترسی، کل پوشهٔ لاگ را قابل نوشتن برای همه نکنید. master در Nginx فایل را زیر پوشهٔ استاندارد میسازد؛ مالک و مجوز واقعی را ببینید. قاعدهٔ logrotate باید فایل .log انتخابی را پوشش دهد و بعد از چرخش، لاگ Nginx را دوباره باز کند.
ترمینال Bash میزبان آزمایشگاهی اختصاصی
set -e
sudo nginx -t && sudo systemctl reload nginx
sudo stat -c "%U:%G %a %n" "/var/log/nginx/academy-auth.log"
sudo cat /etc/logrotate.d/nginx
تست موفق است، سایت قبلی کار میکند و دسترسی نوشتن لاگ فقط در اختیار هویتهای مجاز است.