Nginx配置Basic Auth
Basic Auth模块文档地址:Module ngx_http_auth_basic_module
生成加密的密码
Nginx支持Basic Auth身份认证,当启用此功能时,浏览器会弹出窗口要求用户输入用户名和密码,输入正确才允许访问网页。
注意:用于后台解析验证,只是使用Nginx做权限控制,密码可以不加密
在让Nginx启用Basic Auth身份认证前,首先要生成一个密码文件,格式如下:
1 | username1:password1 |
每一行为一条用户信息,每条用户信息包含3个字段:用户名、密码、注释,其中注释可以省略,字段间使用冒号分隔。其中第二个字段,即密码的部分并不是明文保存的,而是经过hash运算过的字符串,这样可以避免密码以明文方式呈现,对密码的hash运算可以使用openssl passwd
命令生成。
注意:
- 只是使用Nginx做权限控制,不进行后台解析处理的,第二个字段密码可以不加密
- 加密的字符不适用IIS
生成示例
例如要将字符串abc
进行hash运算,使用的命令及输出的结果如下:
1 | openssl passwd abc |
注意:由于在hash运算时自动加入了随机的salt,因此相同的字符串每次进行hash时,产生的结果都是不一样的。
默认的算法为:Standard Unix password algorithm
,此算法最多只支持对8个字符进行hash。可以选择使用其他的算法,通过openssl帮助查看可用的算法:
1 | openssl help passwd |
从上述帮助信息中可以看到还可以选择SHA512、SHA256、MD5等方式进行hash。根据使用的openssl版本的不同,可用的算法也可能会不同。
下面,我们使用一个例子来说明如何用命令行批量对密码信息进行hash。
首先创建一个文件user.txt,包含3条用户信息,每行为一条信息,使用冒号作为字段分隔符,字段分别为用户名、明文密码、注释(只在第1条和第3条信息中包含),注意请不要在用户名、密码或注释中包含冒号:
1 | cat user.txt |
然后使用下面的命令生成密码文件passwd.txt:
1 | cut -d ":" -f 2 user.txt | openssl passwd -6 -stdin | paste -d ":" user.txt - | tr -d '\r' | awk 'BEGIN{FS=":";OFS=":"}{if (NF==4) print $1,$4,$3; else if (NF==3) print $1,$3}' > passwd.txt |
以上命令组合了cut
、openssl
、paste
、tr
、awk
5个命令,作用简单说明如下:
cut
: 取出user.txt的第二个字段(密码明文),将结果输出到stdout;openssl
: 将stdin中输入的数据(3条密码明文)使用SHA512形式进行hash,输出到stdout;paste
: 将user.txt中的原始内容与hash过的密码组合起来,输出到stdout;tr
: 去除可能出现的\r
符号;awk
: 从stdin中提取出用户名、hash过的密码、注释字段,将结果输出到passwd.txt。
生成的密码文件内容如下,可以看到和user.txt
相比,新生成的文件中,密码字段已经被hash:
1 | cat passwd.txt |
Nginx 配置
1 | server { |
auth_basic
指令开启Nginx的Basic Auth
认证功能,并设置了一个字符串,该字符串可能会显示在浏览器的密码输入提示窗口中(根据浏览器的不同,有些会显示,有些不会显示),你可以在HTTP Response header中的WWW-Authenticate
字段看到这个字符串。
auth_basic_user_file
指令设置了密码文件的路径
autoindex
打开了目录浏览功能
重启Nginx服务后,访问localhost:7070
就会要求输入用户名、密码。
备注:一定要注意auth_basic_user_file
路径,如果文件不存在,会不厌其烦的出现403。
如果只想某一个页面支持Basic Auth
,可以将auth_basic
配置到location里:
1 | location /test { |
Nginx配置Basic Auth
https://yuanjianzhang.github.io/2022/11/30/Nginx配置Basic-Auth/