Nginx 限制访问 - 通过 HTTP 基本认证限制访问

原文地址

1. 概述

可以通过 用户名加密码 授权机制,限制对整个网站或网站的某些部分的访问。用户名和密码从一个文件获取,这个文件可以通过密码文件创建工具创建和填充,例如 apache2-utils。
HTTP 基本认证可以和其他的访问限制方法结合使用,例如通过 IP 地址或地理位置限制访问。

2. 先决条件 Prerequisites

  • NGINX Plus or NGINX Open Source
  • 密码文件创建工具,例如 apache2-utils

3. 创建密码文件

3.1 安装 apache2-utils

确保已经安装了 apache2-utils。

3.2 创建密码文件和第一个用户

用 -c 标志运行 htpasswd 工具,输入文件的路径作为第一个参数,用户名作为第二个参数:

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

按下回车后,需要两次输入这个用户的密码。

3.3 创建另外一组用户密码对

此时,不需要 -c 标志:

$ sudo htpasswd /etc/apache2/.htpasswd user2

3.4 查看文件内容

$ cat /etc/apache2/.htpasswd

文件中包含每个用户的用户名和加密后的密码:

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

4. 为 HTTP 基本认证配置 Nginx

在要保护的 location 中,指定 auth_basic 指令并用需要密码保护的区域名称作为参数。这个区域名称会在需要认证时的用户名/密码对话框中显示:

location /status {                                       
    auth_basic “Administrator’s Area”;
    ....
}

用包含用户名密码对的 .htpasswd 文件的路径作为 auth_basic_user_file 指令的参数:

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

另外,可以对整个网站设置为需要 HTTP 基本认证,而部分页面可以不需认证。通过为 auth_basic 指令设置 off 参数,可以在对应的上下文中(location 等) 从上级配置取消继承:

server {
    ...
    auth_basic           "Administrator’s Area";
    auth_basic_user_file conf/htpasswd;

    location /public/ {
        auth_basic off;
    }
}

5. 通过 IP 地址将基本认证结合到访问限制

HTTP 基本认证可以有效地与IP地址访问限制相结合。至少可以实现两个场景:

  • 一个用户需要使用有效的 IP 地址且经过认证。
  • 一个用户需要使用有效的 IP 地址或者经过认证。

使用 nignx access 模块的 allowdeny 指令可以允许或拒绝来自指定 IP 地址的访问:

location /status {
    ...
    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 指令会按照定义的顺序执行。

satisfy 指令可以把 IP 和 HTTP 认证两个限制结合起来。如果参数设置为 all,则客户端需要同时满足两个条件。如果设置为 any,则客户端至少满足一个条件即可:

location /status {
    ...
    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;
}

6. 完整示例

这个例子展示了如何结合 HTTP 认证和 IP 地址来保护 /status 区域:

http {
    server {
        listen 192.168.1.23:8080;
        root   /usr/share/nginx/html;

        location /status {
            status;
            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; 
        }

        location = /status.html {
        }
    }
}

如果用户输入的地址和 /status 页面相关,首先会弹出输入密码对话框:
Nginx 限制访问 - 通过 HTTP 基本认证限制访问_第1张图片
如果输入的用户名和密码不匹配密码文件中的任何一条记录,会得到 401 需要授权错误。

你可能感兴趣的:(Nginx)