htpasswd : Nginx 使用 HTTP 基本身份验证限制 Web 应用程序的访问

在某些情况下,某些开源 Web 应用程序可能没有提供登录功能,为了防止别人可以随意访问页面,我们可以在 Nginx 中配置 HTTP 基本身份验证,需要使用 Apache 提供的 htpasswd 命令管理包含用户名和密码的用户文件,支持创建和更新用户文件。

介绍

您可以通过实现用户名/密码身份验证来限制对网站或其某些部分的访问。用户名和密码取自由密码文件创建工具(例如 apache2-utils)创建和填充的文件。

HTTP 基本身份验证还可以与其他访问限制方法相结合,例如通过 IP 地址或地理位置限制访问。

先决条件

  • NGINX Plus 或 NGINX 开源

  • 密码文件创建实用程序,如 apache2-utils(Debian,Ubuntu)或 httpd-tools (RHEL/CentOS/Oracle Linux)。

创建密码文件

要创建用户名-密码对,请使用密码文件创建实用程序,例如 apache2-utils  或httpd-tools

  • 验证是否安装了 apache2-utils(Debian、Ubuntu)或 httpd-tools(RHEL/CentOS/Oracle Linux)。

  • 创建密码文件和第一个用户。运行 htpasswd 工具并使用 -c 参数(创建一个新文件)文件路径名作为第一个参数值、用户名作为第二个参数值:

sudo htpasswd -c /etc/apache2/.htpasswd user1

按 Enter 键并在提示下键入 user1 的密码。

  • 创建其他用户密码对。忽略 -c 参数,因为文件已经存在:

sudo htpasswd /etc/apache2/.htpasswd user2
  • 您可以确认文件包含成对的用户名和加密密码:

cat /etc/apache2/.htpasswd
user1:$apr1$/woC1jnP$KAh0SsVn5qeSMjTtn0E9Q0
user2:$apr1$QdR8fNLT$vbCEEzDj7LyqCMyNpSoBh/
user3:$apr1$Mr5A0e.U$0j39Hp5FfxRkneklXaMrr/

为 NGINX 和 NGINX Plus 配置 HTTP 基本身份验证

  • 在要保护的位置内,指定 auth_basic 指令并为密码保护区域命名。请求凭据时,该区域的名称将显示在“用户名/密码”对话框窗口中:

location /api {
    auth_basic “Administrator’s Area”;
    #...
}
  • 使用包含用户/密码对的 .htpasswd 文件的路径指定给 auth_basic_user_file 指令:

location /api {
    auth_basic           “Administrator’s Area”;
    auth_basic_user_file /etc/apache2/.htpasswd; 
}

或者,您可以通过基本身份验证限制对整个网站的访问,但仍可以公开某些网站区域。在这种情况下,请指定 auth_basic 指令的参数为 off,该指令取消从较高配置级别继承:

server {
    ...
    auth_basic           "Administrator’s Area";
    auth_basic_user_file conf/htpasswd;
    location /public/ {
        auth_basic off;
    }
}

基于 IP 地址的基本认证与访问限制的结合

HTTP 基本认证可以有效地结合 IP 地址的访问限制。至少可以实现两种方案:

    • 用户必须同时经过身份验证并具有有效的 IP 地址

    • 用户必须经过身份验证或具有有效的 IP 地址

  • 使用 Allow 和 deny 指令允许或拒绝特定 IP 地址的访问:

location /api {
    #...
    deny  192.168.1.2;
    allow 192.168.1.1/24;
    allow 127.0.0.1;
    deny  all;
}

只允许 192.168.1.1/24 网络访问但是排除 192.168.1.2 地址。注意,allow 和 deny 指令将按定义的顺序应用。

  • 将 IP 和 HTTP 身份验证的限制与 satisfy 指令结合起来。如果将指令设置为  all,则在客户端同时满足这两个条件时授予访问权限。如果将指令设置为 any,则如果客户端至少满足一个条件,则授予访问权限:

location /api {
    #...
    satisfy all;    
    deny  192.168.1.2;
    allow 192.168.1.1/24;
    allow 127.0.0.1;
    deny  all;
    auth_basic           "Administrator’s Area";
    auth_basic_user_file conf/htpasswd;
}

完整示例

此示例显示如何通过简单的身份验证和 IP 地址的访问限制来保护您的状态区域:

http {
    server {
        listen 192.168.1.23:8080;
        root   /usr/share/nginx/html;
        location /api {
            api;
            satisfy all;
            deny  192.168.1.2;
            allow 192.168.1.1/24;
            allow 127.0.0.1;
            deny  all;
            auth_basic           “Administrator’s area;
            auth_basic_user_file /etc/apache2/.htpasswd; 
        }
    }
}

当你访问状态页时,系统会提示您登录:

auth_required

如果提供的名称和密码与密码文件不匹配,则会出现错误 401(Authorization Required)


GitHub + PicUloader + jsDelivr : 通过 web 上传的免费图床和图像访问 CDN 加速