Nginx 页面安全认证


# Nginx 页面安全认证

# 模块介绍

有时候出于权限和安全考虑,我们希望某些页面不允许随便访问,必须通过用户认证才可以访问,如下所示:

Nginx Http Auth Basic

(Nginx Http Auth Basic)

该功能用到了 ngx_http_auth_basic_module 这个模块,该模块默认是关闭的。

语法:

  • 配置弹框提示:auth_basic "提示语";
  • 配置密码路径:auth_basic_user_file 密码文件路径;

可以将它配置在 httpserverlocationlimit_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

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

出于安全考虑,我们最好修改一下用户文件 passwd.db 的权限:

# 修改用户文件权限 
chmod 400 /usr/local/nginx/passwd.db

# 修改用户文件属主和属组
chown root:root /usr/local/nginx/passwd.db
1
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

# 配置案例

前面我们已经通过使用 htpasswd 工具,在 /usr/local/nginx/ 目录下生成了用户文件 passwd.db,接下来在 Nginx 配置文件中进行配置。

假设我们有个网站,要限制外人不能访问下载页面(必须经过用户名/密码登录验证后才能访问)。









 
 



server {
    listen 80;
    server_name  www.fedbook.cn;
    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

# 常见问题

问题描述:通过上面的配置给 Nginx 增加了 用户认证,但是当进行 Nginx 身份验证时,返回 500 错误。

问题原因:此时检查一下,可能是你的 Nginx 是用普通用户跑的,而不是 root。前面给 passwd.db 设置了普通用户禁止读取权限。

解决方案:chown 该普通用户名:该普通用户所属组 /usr/local/nginx/passwd.db

# 参考资料

(完)