Skip to main content

14.限制访问权限

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

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

创建密码文件

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

  1. 创建密码文件和第一个用户。使用 htpasswd -c 标志运行实用程序(创建新文件),将文件路径名作为第一个参数,将用户名作为第二个参数:

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

    按 Enter 并在出现提示时键入 user1 的密码。

  2. 创建其他用户密码对。省略 -c 标志,因为该文件已存在:

    $ sudo htpasswd /etc/apache2/.htpasswd user2
  3. 您可以确认该文件包含配对的用户名和散列密码:

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

HTTP 基本身份验证配置

  1. 在要保护的location内,指定 auth_basic 指令并为密码保护区域命名。请求输入凭据时,区域的名称将显示在用户名/密码对话框窗口中:
    location /api {
    auth_basic "Administrator’s Area";
    #...
    }
  2. 使用包含用户/密码对的 .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 地址
  1. 使用允许和拒绝指令允许拒绝来自特定 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该地址。请注意,allowdeny指令将按其定义的顺序应用。

  2. 将 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;
}
}
}

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