NGINX大全 第六章 验证

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_basicauth_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命令也可以生成密码。opensslhtpasswd命令都可以使用apr1算法生成NGINX也可以理解的密码。密码也可以是加盐的SHA-1格式,该格式被轻量级目录访问协议(LDAP)和Dovecot使用。NGINX支持更多的格式和散列算法; 然而,其中许多被认为是不安全的,因为它们很容易被暴力攻击击破。

您可以使用基本身份验证来保护整个NGINX主机,特定虚拟机,甚至特定location块的上下文。基本身份验证不会取代Web应用程序的用户身份验证,但它可以帮助保护隐私信息的安全。在表面之下,服务器处理基本认证,返回401未授权的HTTP状态码和响应header WWW-Authenticate。这个header的值为'Basic realm ="你的字符串"。此响应导致浏览器提示输入用户名和密码。用户名和密码连接并用冒号分隔,然后用base64编码,然后在名为Authorization的请求header中发送。Authorization请求header将指定Basicuser: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大全 第三章 流量管理
阅读 513

本章介绍NGINX的基于百分比分割客户端请求,利用客户端的地理位置还有以速率,连接和带宽限制的形式控制流量的能力。

NGINX大全 第十二章 高可用性部署模式
阅读 437

本章详细介绍了如何运行多个NGINX服务器以确保负载均衡层中的高可用性的技术。

NGINX大全 第九章 复杂的媒体流
阅读 446

本章介绍使用MPEG-4或Flash视频格式的NGINX的流媒体。NGINX被广泛用于向大众分发和传输内容。NGINX支持行业标准格式和流技术,本章将对其进行介绍。

NGINX大全 第十六章 实用操作提示和结论
阅读 925

在本章中,我将介绍如何确保配置文件简洁明了以及调试配置文件。

NGINX大全 第四章 可大规模扩展的内容缓存
阅读 1185

使用NGINX,您可以在任何可以放置NGINX服务器的地方缓存您的内容,从而有效地创建您自己的CDN。

NGINX大全 第十一章 容器/微服务
阅读 489

本章重点介绍如何构建NGINX和NGINX Plus容器镜像,使容器化环境更容易工作的特性,以及在Kubernetes和OpenShift上部署镜像。

NGINX大全 第七章 安全控制
阅读 514

在本章中,我们将通过许多不同的方式使用NGINX和NGINX Plus来保护您的Web应用程序。您可以将这些安全方法中的许多方法相互结合使用,以帮助加强安全性。

NGINX大全 第八章 HTTP/2
阅读 503

本章详细介绍了在NGINX中启用HTTP/2以及配置gRPC和HTTP/2服务器推送支持的基本配置。