Nginx 页面安全认证
# Nginx 页面安全认证
# 模块介绍
有时候出于权限和安全考虑,我们希望某些页面不允许随便访问,必须通过用户认证才可以访问,如下所示:
(Nginx Http Auth Basic)
该功能用到了 ngx_http_auth_basic_module
这个模块,该模块默认是关闭的。
语法:
- 配置弹框提示:
auth_basic "提示语";
- 配置密码路径:
auth_basic_user_file 密码文件路径;
可以将它配置在 http
,server
,location
,limit_except
中的任一位置。
# htpasswd 创建密码文件
首先需要准备用户文件,用户名密码格式为:用户名:密码
,其中密码不是明文。我们需要借助于 htpasswd 加密工具生成。
查看服务器中是否已经安装了 htpasswd:
whereis htpasswd
1
如果没有安装,需要先进行安装:
# Ubuntu 系统下安装 htpasswd
sudo apt-get install apache2-utils
# CentOS 系统下安装 htpasswd
sudo yum install -y httpd-tools
1
2
3
4
5
2
3
4
5
htpasswd 工具的语法为:
- htpasswd(选项)(参数)
-c
:创建一个加密文件;-n
:不更新加密文件,只将加密后的用户名密码显示在屏幕上;-m
:默认采用 MD5 算法对密码进行加密;-d
:采用 CRYPT 算法对密码进行加密;-p
:不对密码进行进行加密,即明文密码;-s
:采用 SHA 算法对密码进行加密;-b
:在命令行中一并输入用户名和密码而不是根据提示输入密码;-D
:删除指定的用户。
通过 htpasswd 工具生成用户名密码文件给 Nginx 使用:
# 进入 Nginx 文件
cd /usr/local/nginx/
# 如果是首次创建,通过 -c 选项可以在当前目录创建一个加密文件
htpasswd -bc passwd.db admin 123456
# 去掉 -c 选项,即可在第一个用户之后添加第二个用户
htpasswd -b passwd.db test 123456
# 利用 htpasswd 命令删除用户名和密码
htpasswd -D passwd.db test
# 如果要利用 htpasswd 命令修改密码
# 先删除指定用户,再创建用户即可实现修改密码的功能
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
出于安全考虑,我们最好修改一下用户文件 passwd.db
的权限:
# 修改用户文件权限
chmod 400 /usr/local/nginx/passwd.db
# 修改用户文件属主和属组
chown root:root /usr/local/nginx/passwd.db
1
2
3
4
5
2
3
4
5
此时的 Nginx 文件目录结构:
├── nginx
│── html
│── logs
│── sbin
│── ...
│── passwd.db # 用户文件,存储用户认证信息
└── conf
├── ...
├── nginx.conf # 主配置文件
└── vhosts # 子配置文件的目录
├── web.conf # 子配置文件 1
└── api.conf # 子配置文件 2
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 配置案例
前面我们已经通过使用 htpasswd 工具,在 /usr/local/nginx/
目录下生成了用户文件 passwd.db
,接下来在 Nginx 配置文件中进行配置。
假设我们有个网站,要限制外人不能访问下载页面(必须经过用户名/密码登录验证后才能访问)。
server {
listen 80;
server_name wenyuan.github.io;
root /sites/fedbook;
index index.html;
location /download {
autoindex on;
auth_basic "请输入用户名及密码";
auth_basic_user_file /usr/local/nginx/passwd.db;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 常见问题
问题描述:通过上面的配置给 Nginx 增加了 用户认证,但是当进行 Nginx 身份验证时,返回 500 错误。
问题原因:此时检查一下,可能是你的 Nginx 是用普通用户跑的,而不是 root。前面给 passwd.db
设置了普通用户禁止读取权限。
解决方案:chown 该普通用户名:该普通用户所属组 /usr/local/nginx/passwd.db
。
# 参考资料
(完)