قفل کردن سایت یا پوشه با رمز عبور در nginx (Basic Auth)

برای سایت‌های در حال توسعه (staging)، پنل‌های داخلی یا صفحات مدیریتی می‌توانید یک لایهٔ رمز عبور ساده در خود nginx بگذارید؛ حتی قبل از رسیدن درخواست به برنامه.

وب‌سرور و SSLمقدماتی5 دقیقه

۱نصب htpasswd

این ابزار در بستهٔ apache2-utils است. روی RHEL نام بسته httpd-tools است.

bash
sudo apt install -y apache2-utils

۲ساخت فایل رمز و اولین کاربر

گزینهٔ -c فقط اولین بار برای ساخت فایل لازم است؛ برای کاربران بعدی آن را نزنید وگرنه فایل بازنویسی می‌شود. رمز به‌صورت تعاملی پرسیده می‌شود.

bash
sudo htpasswd -c /etc/nginx/.htpasswd admin
sudo htpasswd /etc/nginx/.htpasswd editor
sudo chmod 640 /etc/nginx/.htpasswd
sudo chown root:www-data /etc/nginx/.htpasswd

اگر نمی‌خواهید apache2-utils نصب کنید: printf 'admin:%s\n' "$(openssl passwd -apr1)" | sudo tee -a /etc/nginx/.htpasswd

۳قفل کردن کل سایت (مثلاً staging)

دو خط auth_basic را در بلوک server بگذارید.

nginx
server {
    ...
    auth_basic           "Restricted";
    auth_basic_user_file /etc/nginx/.htpasswd;
}

۴قفل کردن فقط یک مسیر

برای پنل مدیریت. location های دیگر همچنان آزاد می‌مانند.

nginx
    location /admin/ {
        auth_basic           "Admin area";
        auth_basic_user_file /etc/nginx/.htpasswd;
        proxy_pass http://127.0.0.1:3000;
    }

    # مسیر بدون رمز داخل یک قسمت قفل‌شده (مثلاً webhook)
    location /admin/webhook {
        auth_basic off;
        proxy_pass http://127.0.0.1:3000;
    }

۵رمز یا IP مجاز (satisfy any)

با satisfy any کاربری که از IP مجاز است رمز نمی‌خواهد و بقیه باید رمز بدهند.

nginx
    location /admin/ {
        satisfy any;
        allow 203.0.113.5;
        deny all;
        auth_basic           "Admin area";
        auth_basic_user_file /etc/nginx/.htpasswd;
    }

۶اعمال و تست

بدون رمز باید 401 و با رمز درست 200 بگیرید.

bash
sudo nginx -t && sudo systemctl reload nginx
curl -I https://example.com/admin/
curl -I -u admin:PASSWORD https://example.com/admin/

Basic Auth رمز را با base64 (نه رمزنگاری) ارسال می‌کند؛ فقط روی HTTPS استفاده کنید و آن را جایگزین احراز هویت واقعی برنامه ندانید.

پرسش‌های پرتکرار دربارهٔ قفل کردن سایت یا پوشه با رمز عبور در nginx (Basic Auth)

آیا Basic Auth امن است؟

روی HTTPS برای محافظت ساده مناسب است ولی محدودیتی در تعداد تلاش‌ها ندارد. آن را با limit_req و fail2ban ترکیب کنید و برای سیستم‌های حساس از احراز هویت واقعی مثل SSO یا VPN استفاده کنید.