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

xiaoxiao2021-02-28  33

原文地址

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 模块的 allow 和 deny 指令可以允许或拒绝来自指定 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 页面相关,首先会弹出输入密码对话框: 如果输入的用户名和密码不匹配密码文件中的任何一条记录,会得到 401 需要授权错误。

转载请注明原文地址: https://www.6miu.com/read-2632352.html

最新回复(0)