NGINX大全 第六章 验证
第六章 验证
6.0 介绍
NGINX能够验证客户端。通过NGINX验证客户端请求降低了工作量,并可以阻止未经身份验证的请求到达应用程序服务器。NGINX开源版本中可用的模块包括基本身份验证和身份验证子请求。NGINX Plus专用模块(验证JSON Web Token(JWT))允许与使用验证标准OpenID Connect的第三方验证提供者集成。
6.1 HTTP基本验证
问题
您需要通过HTTP基本身份验证来保护您的应用程序或内容。
解决方案
生成以下格式的文件,其中密码使用一种允许的格式进行加密或散列:
# comment
name1:password1
name2:password2:comment
name3:password3
用户名是第一个字段,密码是第二个字段,分隔符是冒号。有一个可选的第三个字段,您可以使用它来注释每个用户。NGINX可以理解几种不同的密码格式,其中之一是密码是否使用C函数crypt()加密。该函数通过openssl passwd
命令暴露给命令行。安装openssl
后,您可以使用以下命令创建加密的密码字符串:
$ openssl passwd MyPassword1234
输出将是一个字符串,NGINX可以在您的密码文件中使用它。
使用NGINX配置中的auth_basic
和auth_basic_user_file
指令启用基本身份验证:
location / {
auth_basic "Private site";
auth_basic_user_file conf.d/passwd;
}
您可以在HTTP,server或location上下文中使用auth_basic
指令。auth_basic
指令采用字符串作参数,当未经身份验证的用户到达时,该参数会在基本身份验证弹出窗口中显示。auth_basic_user_file
指定用户文件的路径。
讨论
您可以通过几种方式和以几种不同的格式生成基本身份验证密码,格式不同安全性也不同。Apache的htpasswd
命令也可以生成密码。openssl
和htpasswd
命令都可以使用apr1
算法生成NGINX也可以理解的密码。密码也可以是加盐的SHA-1格式,该格式被轻量级目录访问协议(LDAP)和Dovecot使用。NGINX支持更多的格式和散列算法; 然而,其中许多被认为是不安全的,因为它们很容易被暴力攻击击破。
您可以使用基本身份验证来保护整个NGINX主机,特定虚拟机,甚至特定location块的上下文。基本身份验证不会取代Web应用程序的用户身份验证,但它可以帮助保护隐私信息的安全。在表面之下,服务器处理基本认证,返回401未授权的HTTP状态码和响应header WWW-Authenticate
。这个header的值为'Basic realm ="你的字符串"。此响应导致浏览器提示输入用户名和密码。用户名和密码连接并用冒号分隔,然后用base64编码,然后在名为
Authorization的请求header中发送。
Authorization请求header将指定
Basic和
user:password编码的字符串。服务器解码header并与提供的
auth_basic_user_file`做对比验证。由于用户名密码字符串仅为base64编码,因此建议使用HTTPS进行基本身份验证。
6.2 验证子请求
问题
您有一个第三方身份验证系统,您希望用其进行身份验证。
解决方案
在处理请求之前,使用http_auth_request_module
向身份验证服务发出请求以验证身份:
location /private/ {
auth_request /auth;
auth_request_set $auth_status $upstream_status;
}
location = /auth {
internal;
proxy_pass http://auth-server;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Original-URI $request_uri;
}
auth_request
指令采用一个必须是本地内部location的URI参数。auth_request_set
指令允许您从身份验证子请求中设置变量。
讨论
http_auth_request_module
可以对NGINX服务器处理的每个请求进行身份验证。该模块在处理原请求之前发起子请求,以确定该请求是否可以访问其请求的资源。整个原请求会被代理到子请求的location。身份验证location充当子请求的典型代理,并发送原请求,包括原请求body和header。子请求的HTTP状态代码决定是否授予访问权限。如果子请求返回HTTP 200状态码,则验证成功并且请求会被受理。如果子请求返回HTTP 401或403,则原请求将返回相同的状态码。
如果您的身份验证服务未请求请求正文,则可以使用proxy_pass_request_body
指令删除请求正文,如图所示。这种做法将减少请求的大小和时间。因为响应body被丢弃,所以Content-Length
标头必须设置为空字符串。如果您的身份验证服务需要知道请求正在访问的URI,那么您需要将该值放在身份验证服务检查和验证的自定义header中。如果有些东西您确实希望保留在身份验证服务子请求中(如响应header或其他信息),你可以使用auth_request_set
指令从响应数据中创建新变量。
6.3 验证JWT
只能在NGINX Plus中使用。下略。
6.4 生成JWT
只能在NGINX Plus中使用。下略。
6.5 通过现有的OpenID Connect SSO对用户进行验证
只能在NGINX Plus中使用。下略。
6.6 从Google获取JSON Web Key
只能在NGINX Plus中使用。下略。
猜你喜欢
NGINX大全 第十三章 高级活动监控
阅读 2076本章详细介绍了NGINX Plus仪表板,NGINX Plus API和开源存根状态模块的功能。
NGINX大全 第九章 复杂的媒体流
阅读 1684本章介绍使用MPEG-4或Flash视频格式的NGINX的流媒体。NGINX被广泛用于向大众分发和传输内容。NGINX支持行业标准格式和流技术,本章将对其进行介绍。
NGINX大全 第八章 HTTP/2
阅读 2571本章详细介绍了在NGINX中启用HTTP/2以及配置gRPC和HTTP/2服务器推送支持的基本配置。
NGINX大全 第一章 基础
阅读 2192在本章中,您将学习如何安装主要配置文件所在的NGINX以及管理命令。 您还将学习如何验证安装并向默认服务器发出请求。
NGINX大全 第十二章 高可用性部署模式
阅读 1993本章详细介绍了如何运行多个NGINX服务器以确保负载均衡层中的高可用性的技术。
NGINX大全 第四章 可大规模扩展的内容缓存
阅读 4658使用NGINX,您可以在任何可以放置NGINX服务器的地方缓存您的内容,从而有效地创建您自己的CDN。
NGINX大全 第十一章 容器/微服务
阅读 1599本章重点介绍如何构建NGINX和NGINX Plus容器镜像,使容器化环境更容易工作的特性,以及在Kubernetes和OpenShift上部署镜像。
NGINX大全 第十六章 实用操作提示和结论
阅读 3201在本章中,我将介绍如何确保配置文件简洁明了以及调试配置文件。