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大全 第七章 安全控制
阅读 1563

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

NGINX大全 第二章 高性能负载平衡
阅读 1823

我们需要一个与基础架构一样动态的负载平衡解决方案。 NGINX以多种方式满足了这一需求,例如HTTP,TCP和UDP负载平衡,我们将在本章中介绍。

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

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

NGINX大全 第三章 流量管理
阅读 2104

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

NGINX大全 第十五章 性能调优
阅读 2915

本章还介绍了连接调优,以保持连接对客户端和上游服务器的开放性,并通过调整操作系统来提供更多连接。

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

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

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

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

NGINX大全 第十三章 高级活动监控
阅读 1969

本章详细介绍了NGINX Plus仪表板,NGINX Plus API和开源存根状态模块的功能。