Pages

Saturday, 25 January 2020

Nginx添加用户认证

为什么要给nginx添加用户认证?

为了方便,我们有时候可能会放一些监控脚本在默认的域名下,比如放个phpinfo.php,用于查看php的信息等等,但这个又不想被别人直接访问,而且也不想写个什么登录界面,这时,我们就可以直接用nginx的身份认证功能。

添加了认证是什么效果?

开启了身份认证,访问的时候就需要输入账号和密码。
如果不输入点取消,则会显示需要认证。

怎样添加认证?

把以下两句放在nginx配置文件中的server下或者location里面
auth_basic 'Restricted';            # 认证名称,随意填写
auth_basic_user_file /usr/local/nginx/users;     # 认证的密码文件,需要生成。
nginx
其中/usr/local/nginx/users是账号文件,使用htpasswd命令生成,其中最后两个参数是用户名和密码,到时需要登录的时候就是用这个用户名和密码。
htpasswd -cb /usr/local/nginx/users zhangsan 123456
Bash

如果服务器没有htpasswd命令,请先安装httpd-toolshtpasswd是apache的一个工具:
yum install -y httpd-tools
Bash
以下是我服务器放的例子,注意这不是一个完整配置文件,我只是指明身份认证的两句配置可以放在这个地方:
最后,需要重载一下nginx:
首先检查配置文件是否有语法问题:
nginx -t
Bash
如果显示的是ok,successful,则是对的,如果是failed就说明语法有问题,需要检查一下,比如是否少写分号等等。
语法没问题,再重载nginx:
nginx -s reload
Bash


认证原理:

nginx开启密码认证的原理是使用了HTTP authentication认证机制的basic版HTTP basic authentication,只要向客户端发送以下header即可触发浏览器弹出认证窗口(接收输入用户名和密码),其中『My Realm』可以改成任意其他自己喜欢的字符串:
WWW-Authenticate: Basic realm="My Realm"
HTTP/1.0 401 Unauthorized
HTTP
其实HTTP authentication认证机制还有另一种,叫HTTP digest authentication,它比basic版的更安全,因为Basic版的认证方式在传输过程中采用的用户名密码加密方式为BASE-64,即类似『base64_encode(username:password)』这样加密的,其解码过程非常简单,如果被嗅探,密码几乎是透明的。
但nginx默认不支持更安全的digest认证方式,如果要支持,需要安装插件HTTP Digest Authentication

使用编程语言实现HTTP authentication

前面已经说了nginx密码认证的原理是HTTP authentication,只需要发送一个http header即可触发浏览器弹出认证窗口,毫无疑问,随便找一门编程语言都可以发送一个header.

怎样退出呢?

最好的方法是关闭浏览器再打开,注意是关闭整个浏览器而不是只关闭一个标签,其他退出方式具体请参考How to log out user from web site using BASIC authentication?
-------------------

nginx添加用户认证( Basic HTTP authentication)

先生成认证文件:

printf "91linux:$(openssl passwd -crypt 123456)\n" >> /root/htpasswd

  • 91linux 是用户名
  • 123456 是密码
  • /root/htpasswd 是认证文件的地址

以上 3 个大家自行根据实际情况修改,认证文件的地址也没有要求

修改 nginx 的网站配置文件

在 server 块里新增以下代码:

location / {
    auth_basic "nginx basic http test for mydomain.com";
    auth_basic_user_file /root/htpasswd;
    autoindex on;
}

修改 auth_basic_user_file 为你刚才生成的认证文件的地址

重新reload下nginx

systemctl reload nginx

重新访问下就可以看到需要输入密码了