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大全 第三章 流量管理
阅读 3182本章介绍NGINX的基于百分比分割客户端请求,利用客户端的地理位置还有以速率,连接和带宽限制的形式控制流量的能力。
NGINX大全 第七章 安全控制
阅读 2128在本章中,我们将通过许多不同的方式使用NGINX和NGINX Plus来保护您的Web应用程序。您可以将这些安全方法中的许多方法相互结合使用,以帮助加强安全性。
NGINX大全 第八章 HTTP/2
阅读 3035本章详细介绍了在NGINX中启用HTTP/2以及配置gRPC和HTTP/2服务器推送支持的基本配置。
NGINX大全 第十三章 高级活动监控
阅读 2537本章详细介绍了NGINX Plus仪表板,NGINX Plus API和开源存根状态模块的功能。
NGINX大全 第一章 基础
阅读 2575在本章中,您将学习如何安装主要配置文件所在的NGINX以及管理命令。 您还将学习如何验证安装并向默认服务器发出请求。
NGINX大全 第十一章 容器/微服务
阅读 1969本章重点介绍如何构建NGINX和NGINX Plus容器镜像,使容器化环境更容易工作的特性,以及在Kubernetes和OpenShift上部署镜像。
NGINX大全 第九章 复杂的媒体流
阅读 2075本章介绍使用MPEG-4或Flash视频格式的NGINX的流媒体。NGINX被广泛用于向大众分发和传输内容。NGINX支持行业标准格式和流技术,本章将对其进行介绍。
NGINX大全 第十二章 高可用性部署模式
阅读 2392本章详细介绍了如何运行多个NGINX服务器以确保负载均衡层中的高可用性的技术。