nginx身份验证

NGINX 能够对客户端进行身份验证。使用 NGINX 对客户端请求进行身份验证可以减
轻服务器的工作负载,并能够阻止未经身份验证的请求到达应用服务器。NGINX 开源
版模块包括基本身份验证和身份验证子请求。NGINX Plus 专有的 JSON Web Tokens
(JWT)验证模块可与使用身份验证标准 OpenID Connect 的第三方身份验证提供商
集成

本例子演示都是NGINX开源版

HTTP 基本身份验证

NGINX可以理解如下的密码格式:

user1:passwd1:comment  #comment为可选的
user2:passwd2
user3:passwd3

使用openssl passwd 对字符串进行加密

1、安装openssl后,在命令行执行如下命令:

openssl passwd 'Test121$'

2、在conf.d目录下创建passwd.txt,将用户名和密码写入,如图:

注:openssl passwd生成的密码是针对当前用户的,我在root下执行,因此用户就是root

3、编辑nginx.conf,给server模块添加认证,如图:

  • auth_basic:类似一个提示作用
  • auth_basic_user_file:指定密码文件位置

4、通过IP访问NGINX,提示输入账号密码,如图:

使用htpasswd来配置用户名和密码

除了openssl passwd外,还可以使用htpasswd来设置用户名和密码

1、安装htpasswd,命令如下:

yum -y install apache2-utils    #centos
apt install apache2-utils       #ubuntu

2、执行htpasswd命令生成用户名和密码文件,testuser是用户名,如图:

3、将/root/passwd.txt内容粘贴到conf.d/passwd.txt中,如图:

4、再次登录NGINX,提示输入用户名和密码,如图:

输入后即可登录到页面

注意:auth_basic认证可使用在http、server、location中,针对不同场景认证

身份验证子请求

通过第三方身份验证来对请求进行身份验证,需要用到的模块为http_auth_request_module,此模块默认不带,需要在编译安装的时候通过如下方式指定:

--with-http_auth_request_module   #with前面是两个横岗

1、在conf.d下定义auth.conf文件,内容如下:

  • auth_request:启用基于子请求结果的授权,设为off表示不启动,可配置在http、server、location中
  • auth_status: 保存认证请求的状态码,那就是/authservice的状态码
  • upstream_status:保存上游代理的返回状态码,也就是http://192.168.49.83:8989/auth返回的状态码
  • internal:只允许NGINX内部请求,不能通过外部请求
  • proxy_pass_request_body off:禁止将请求体传递给上游服务器
  • proxy_set_header Content-Length “”; 不将请求头内容传递给上游服务器
  • proxy_set_header X-Original-URI $request_uri; 自定义的 HTTP 头 X-Original-URI,其值为当前请求的 URI(由变量 $request_uri 表示)。$request_uri 变量包含了原始请求的 URI。通过设置这个头,你可以将原始请求的 URI 信息传递给上游服务器。这在调试或当后端服务需要知道原始请求路径时非常有用

原理:首先请求进来后,先到达子请求/authservice,子请求的认证服务为http://192.168.49.83:8989/auth,如果子请求返回的状态码为2xx,表示请求成功,然后继续后面的root /usr/share/nginx/html,如果返回3xx或者4xx等,则表示请求不成功,认证不通过

2、编辑auth_8989.conf文件,定义路由返回状态码为200,内容如下:

3、通过IP访问,如图:

4、修改第2步,将返回状态码修改为401,再次请求,如图:

从上图看出,当子请求返回状态码不是2xx的时候,认证就会失败

标签