NGINX Plus R10 正式发布

NGINX | 2016年8月23日


[编辑:NGINX ModSecurity WAF模块已于2022年4月1日正式停止销售,并将于2024年3月31日终止生命周期。有关更多详情,请参阅博客文章《F5 NGINX ModSecurity WAF即将终止生命周期》<.htmla>。]

我们很高兴地宣布推出NGINX Plus Release 10 (R10),这是迄今为止一次意义重大的版本发布。NGINX Plus在NGINX Open Source的基础上增加了高级功能和屡获殊荣的支持,为客户提供完整的应用交付解决方案。此版本提供多项新功能,可显著提升NGINX Plus所交付应用的安全性和性能;此外,还提供其他功能,以改进网络集成,并支持通过脚本自定义NGINX Plus。

[编辑注:有关NGINX Plus R10主要新功能的更多详情,请参阅以下相关资源:

]

NGINX Plus R10推出了我们的首个Web应用防火墙(WAF)版本。该防火墙由ModSecurity提供支持,并由NGINX, Inc.提供全面支持。过去一年,Web应用攻击增加了50%,DDoS攻击数量增长了一倍以上,Akamai的数据显示。如今,每个应用都面临遭受攻击的风险。NGINX ModSecurity WAF有助于保护Web应用免受恶意用户攻击,并为客户提供灵活的工具,帮助保障应用和数据的安全。

NGINX ModSecurity WAF 可阻止入侵者

NGINX ModSecurity WAF基于全新的ModSecurity 3软件,可在NGINX Plus中原生运行。该产品作为额外付费选项在我们的动态模块存储库中提供,由NGINX, Inc.提供支持,并已通过NGINX Plus的全面测试。我们正与Trustwave合作,并将在添加功能、提升性能和解决问题的过程中,持续提供经过测试的更新。

另外两项新功能进一步增强了NGINX Plus的安全能力:

  • JSON Web 令牌:许多客户将NGINX Plus用作API网关,并希望在NGINX Plus层采用一种通用的标准方法,对API访问进行身份验证。为满足这一需求,此版本新增了使用JSON Web令牌(JWT)进行身份验证的支持。NGINX Plus现在可以先验证JWT,再允许客户端访问API。借助此功能,应用管理员可以使用开放标准保护API访问,避免受制于专有标准。原生JWT支持还可将身份验证操作(例如验证符合OAuth 2.0规范的OpenID Connect令牌)从应用服务器卸载到NGINX Plus,从而降低应用管理员面临的复杂性。
  • 支持ECC和RSA证书的“双栈”功能,借助NGINX Plus R10,可以使用RSA和ECC证书发布SSL/TLS服务。NGINX Plus会根据每个客户端的能力选择合适的证书,让现代客户端能够使用速度更快的ECC证书,同时仍支持仅兼容RSA的旧版客户端。ECC证书的速度最高可达同等强度RSA证书的3倍,因此每台服务器可建立更多SSL/TLS连接,并加快SSL/TLS握手。

除安全功能外,NGINX Plus R10还包括:

  • 透明代理支持:虽然许多现代HTTP应用可以配置为依赖X-Forwarded-For标头,但一些旧版应用以及其他TCP或UDP服务会使用事务的源IP地址进行日志记录、安全检查或身份验证。NGINX Plus现在可以“伪装”其转发到上游服务器的HTTP和TCP连接及UDP数据报的源IP地址和端口。此功能可用于实现IP透明性。在此配置下,NGINX Plus使用远程客户端的IP地址发送数据包,使上游服务器认为数据包来自该地址,而不是NGINX Plus服务器上的本地IP地址。此功能还可用于为基于UDP的协议启用直接服务器返回。
  • NGINX JavaScript模块支持:NGINX JavaScript模块是面向NGINX和NGINX Plus的新一代配置与控制语言,可让用户深入、精细地控制应用交付和安全防护方式。在此预览版本中,NGINX JavaScript模块进一步增强了对HTTP、TCP和UDP流量的控制,可生成响应并精准确定请求路由,将请求转发至适合的服务器。

NGINX Plus R10详解

NGINX ModSecurity Web 应用防火墙

NGINX Plus R10的重点功能是我们首次发布的WAF,该功能基于广为人知且备受信赖的ModSecurity技术构建。自2002年首次以开源形式发布以来,ModSecurity一直帮助保护一些全球大型Web资产免受恶意用户侵害。它通常被称为安全领域的“Swiss Army® knife”。NGINX ModSecurity WAF是需要额外付费的选项,订阅用户可通过我们的动态模块存储库获取。

NGINX ModSecurity WAF是帮助保护关键应用不可或缺的解决方案。与缺乏灵活性且成本高昂的硬件设备(例如F5、Citrix和Imperva提供的设备)相比,它是一种经济高效的替代方案,并凭借软件的灵活性提供更强大的功能。NGINX ModSecurity WAF可部署在任何环境中,包括本地服务器以及公有云、私有云和混合云。

NGINX ModSecurity WAF有助于抵御DDoS攻击

WAF基于“规则”数据库运行,这些规则定义了需要阻止和/或记录的恶意行为。OWASP ModSecurity核心规则集(CRS)是ModSecurity广泛使用的规则集之一。NGINX ModSecurity WAF使用OWASP CRS识别并阻止多种应用攻击,功能包括:

  • 第7层攻击防护:保护应用免受多种攻击,例如HTTP违规、SQL注入、XSS、RFI和LFI攻击等。
  • DDoS缓解:通过缓解复杂的应用层DDoS攻击和僵尸网络攻击并降低其影响,保持持续正常运行。
  • 实时拒绝列表:根据信誉信息拒绝来自已知恶意IP地址的流量,从而自动阻止已知恶意用户。
  • PCI-DSS 6.6 合规性:开始遵循 PCI-DSS 6.6 对安全在线交易的要求。
  • 审计日志:利用详细日志中的信息,更快地响应攻击及其他异常应用流量。

还可从不同供应商处获取其他规则集,例如TrustWave,价格各不相同。此外,还可以使用功能强大的ModSecurity规则语言定义自定义规则,以补充当前使用的规则集。

NGINX ModSecurity WAF 由 NGINX, Inc. 直接提供支持。我们的支持团队可以协助安装和配置 WAF 与 OWASP 核心规则集,并调试相关问题。

NGINX ModSecurity WAF以动态模块形式在NGINX Plus存储库中提供,可使用标准软件包管理工具进行安装。以下命令适用于基于Debian的操作系统:

# apt-get update# apt-get install nginx-plus
# apt-get install nginx-plus-module-modsecurity

请注意,只有已购买NGINX ModSecurity WAF模块的订阅用户,以及已申请访问权限的订阅用户和评估用户,才能下载nginx-plus-module-modsecurity软件包。

要加载NGINX ModSecurity WAF模块,请在NGINX Plus配置文件的顶层“main”上下文中添加load_module指令:

正在加载代码示例…

要在NGINX Plus中启用NGINX ModSecurity WAF,请同时添加modsecurity指令和modsecurity_rules_file指令,以指定规则集:

正在加载代码示例…

然后重新加载NGINX Plus配置:

# nginx -t && nginx -s reload

原生支持用于OAuth 2.0和OpenID Connect的JWT

NGINX Plus R10原生支持JSON Web Token(JWT)身份验证标准,可帮助您轻松为应用和API添加高级身份验证解决方案。

JWT令牌(读作“jot”)在RFC 7519中定义,是OpenID Connect标准中用户信息的底层数据格式。OpenID Connect是构建于OAuth 2.0协议之上的标准身份层。由于JWT标准简单且灵活,API和微服务的部署者也开始采用该标准。

[编辑:有关利用原生JWT支持的用例,请参阅以下博客:

]

NGINX Plus会先验证JWT,再允许客户端访问

作为反向代理和负载均衡器,NGINX Plus部署在应用前端,非常适合通过代为验证每个HTTP请求中提供的JWT来简化应用开发。这带来两项优势。首先,NGINX Plus有助于阻止未经身份验证、格式错误和恶意的请求到达应用,避免应用因处理此类请求而产生额外开销和风险。

第二个优势是,NGINX Plus可以访问经过验证的JWT中的所有字段(完成签名验证后),并可利用其配置语法本身的强大功能和灵活性,为微服务和API提供高级身份验证解决方案:

  • 微服务的一个典型用例是,由NGINX Plus验证JWT,并通过HTTP标头将已通过身份验证的用户身份提供给后端应用。这样就无需在每个微服务中重复实现相同的身份验证功能。
  • 对于API,NGINX Plus可以真正按用户限制访问速率,而无需依赖IP地址与最终用户之间的近似映射。

以下NGINX Plus配置示例片段展示了如何使用JWT保护网站。

The auth_jwt指令指示NGINX Plus使用JWT对向某个域发出请求的用户进行身份验证,在本例中,该域为myrealm。auth_jwt_key_file指令指定用于验证令牌签名的JSON Web密钥(JWK);其作用类似于SSL/TLS加密中的公钥。NGINX Plus必须能够访问该文件所在位置。

NGINX Plus在验证和解析令牌时,会自动为JWT中的“声明”创建NGINX变量。这些声明表示与JWT关联的实体,例如其颁发者、令牌颁发给的用户以及预期接收者。所有变量名称均以$jwt_claim_开头。然后,可以使用add_header指令,让NGINX Plus将声明以HTTP标头的形式传递给后端服务器,并将标头值设置为$jwt_claim_变量的值。在本例中,NGINX Plus通过$jwt_claim_sub变量将用户身份传递给后端应用程序。该变量对应JWT中的用户ID(sub声明)。

正在加载代码示例…

在NGINX Plus R8中,我们发布了OAuth2支持的技术预览版。在NGINX Plus R10的实现中,我们采纳了客户反馈,推出了可用于生产环境的实现,满足用户和计算机身份验证这一复杂领域中极具价值的使用场景。

“双栈”RSA和ECC证书支持

如今,有充分理由开始对所有应用流量进行SSL/TLS加密。Google会让采用SSL/TLS加密的网站获得更高的搜索引擎排名。此外,HTTP/2等现代Web标准要求所有网站使用SSL/TLS加密。

借助NGINX Plus R10,可以同时使用RSA和ECC证书发布SSL/TLS服务。在我们的测试中,ECC证书的速度最高可达同等强度RSA证书的3倍,这意味着每台服务器可以建立更多SSL/TLS连接,并更快完成SSL/TLS握手。NGINX Plus会根据每个客户端的能力选择合适的证书,让现代客户端能够使用速度更快的ECC证书,同时继续支持仅兼容RSA的旧版客户端。

要同时支持RSA和ECC证书,只需在虚拟服务器配置中为每种证书类型分别添加一对ssl_certificate和ssl_certificate_key指令,如以下示例所示。

正在加载代码示例…

透明代理

我们不断为NGINX Plus添加新功能,例如TCP和UDP负载均衡,以支持更广泛的应用和部署模式。NGINX Plus R10新增了透明代理功能,使NGINX Plus能够使用任意源IP地址和端口向上游服务器发送数据包。借助此功能,可以实现IP透明和直接服务器返回等配置。

IP 透明是一种配置,其中负载均衡器(NGINX Plus)将远程客户端的 IP 地址用作其发送至上游服务器的数据包的源 IP 地址。这意味着,上游服务器看到的数据包来自远程客户端的 IP 地址,而不是负载均衡器上的本地 IP 地址。当应用程序需要根据源 IP 地址执行日志记录、安全防护、速率限制或身份验证时,这一点非常重要。

IP 透明也是一种名为“直接服务器返回”(DSR)的网络负载均衡技术的基础组成部分。NGINX Plus可对基于UDP的协议(不包括TCP或HTTP)执行DSR,使返回数据包完全绕过负载均衡器,直接发送到远程客户端。

在DSR模式下,后端服务器直接响应客户端

IP 透明和 DSR 可通过以下指令新增的 transparent 参数进行配置:proxy_bind、fastcgi_bind、memcached_bind、scgi_bind 和 uwsgi_bind。以下示例说明如何为 DNS 后端设置 DSR。proxy_responses 指令指定 NGINX Plus 无需接收任何服务器响应(对于 DSR,适当的值为 0)。

正在加载代码示例…

请注意,启用DSR后,被动健康检查将不起作用,因为此类检查需要NGINX Plus验证服务器是否已向客户端发送响应。必须配置主动的应用感知型健康检查,DSR配置才能正常工作。有关示例,请参阅针对负载均衡DNS服务器配置此类检查的详细说明。

IP 透明和 DSR 配置较为复杂,还涉及额外的路由和数据包重写要求,这些不属于 NGINX Plus 软件的功能范围。有关完整说明,请参阅博客文章《将 NGINX 和 NGINX Plus 用作透明代理,实现 IP 透明和直接服务器返回》。

适用于基于HTTP、TCP和UDP的应用的NGINX JavaScript模块

[编辑注:NGINX JavaScript模块以前称为nginScript。该模块已在NGINX Plus R12(以及NGINX 1.11.10)中正式发布。

有关NGINX JavaScript模块其他用例的详细介绍,请参阅《NGINX JavaScript模块用例》。

本节代码已更新为使用 js_import指令,该指令在js_include及更高版本中取代了NGINX Plus R23指令。有关详细信息,请参阅NGINX JavaScript模块的参考文档,其中“配置示例”部分展示了NGINX配置文件和JavaScript文件的正确语法。]

NGINX Plus R10包含新版NGINX JavaScript配置语言的预览版本。该语言的功能尚不完整,欢迎对目前的开发成果提出反馈。借助NGINX JavaScript,可以使用JavaScript代码对HTTP、TCP和UDP流量执行复杂的自定义操作,从而以一种强大的新方式控制应用交付并保障应用安全。NGINX JavaScript支持:

  • 使用功能强大的JavaScript编程语言,直接在NGINX Plus中编写“无服务器”函数
  • 设置API数据格式、处理并转换API数据
  • 提供简单的TCP服务,例如时间服务器
  • 使用JavaScript设置NGINX变量,创建自定义负载均衡决策、缓存键等

NGINX JavaScript预览版可从我们的动态模块存储库获取。您可以使用标准软件包管理工具进行安装。以下命令适用于基于Debian的操作系统:

# apt-get update
# apt-get install nginx-plus
# apt-get install nginx-plus-module-njs

要加载用于HTTP和TCP/UDP的NGINX JavaScript模块,请在NGINX Plus配置文件的顶层“main”上下文中添加load_module指令:

正在加载代码示例…

然后重新加载NGINX Plus配置,以加载NGINX JavaScript模块:

# nginx -t && nginx -s reload

NGINX Open Source用户可从我们的开源代码仓库获取NGINX JavaScript。

JavaScript代码不会直接包含在NGINX Plus配置中,而是通过js_import指令导入。在此示例中,一个简单的“无服务器”函数的JavaScript代码从/etc/nginx/conf.d/functions.js导入。js_content指令指示NGINX Plus调用该JavaScript函数,并将结果返回给客户端。

正在加载代码示例…

以下 JavaScript 代码位于/etc/nginx/conf.d/functions.js,使用指定的字符集填充字符串:

正在加载代码示例…

其他功能

NGINX Plus R10引入了多项其他改进,帮助您顺畅地交付应用,包括:

  • 在Stream模块中实现的TCP/UDP负载均衡现在与HTTP负载均衡在功能上更加一致。新增支持的模块包括:用于A/B测试的Split Clients、用于根据客户端地理位置执行操作的GeoIP,以及用于根据IP地址定义变量的Geo。通过其他NGINX变量可以获取更多信息,还可以使用变量作为proxy_pass指令的参数来执行路由决策。
  • 高流量应用面临的一个常见问题是临时端口耗尽。当操作系统的可用端口号耗尽时,将无法与上游服务器建立新连接。为解决此问题,NGINX Plus现在会在可用时使用IP_BIND_ADDRESS_NO_PORT套接字选项。只要标准“四元组”(源IP地址、目标IP地址、源端口、目标端口)保持唯一,此选项就允许对上游服务器的出站连接复用源端口。该选项适用于Linux内核4.2及更高版本以及glibc 2.22及更高版本的系统。
  • NGINX Plus 会为每个新的 HTTP 请求自动生成新变量“$request_id”,相当于为该请求分配一个唯一的“事务 ID”。这有助于应用跟踪,并使日志分析工具具备 APM 功能。该事务 ID 会通过代理传递给后端应用和微服务,使系统的各个部分都能为每个事务记录一致的标识符。
  • The proxy_request_buffering、fastcgi_request_buffering、scgi_request_buffering和uwsgi_request_buffering指令现在支持HTTP/2,可用于开启或关闭请求缓冲。
  • 新的http2_body_preread_size指令允许HTTP/2客户端立即开始发送请求正文。该指令用于控制NGINX Plus开始读取客户端请求正文前所用缓冲区的大小。

NGINX Plus Extras 软件包已弃用

正如我们在NGINX Plus R9发布时提前宣布的那样,R10是最后一个包含NGINX Plus Extras软件包的版本。

强烈建议您立即修改安装和配置流程,改用 nginx-plus 软件包,并动态加载 nginx-plus-extras 软件包中实际使用的模块。从 NGINX Plus R11 开始,这是使用未内置于 nginx-plus 软件包中的模块的唯一方式。

要切换到nginx-plus软件包和动态模块,请执行以下步骤:

  1. 删除 nginx-plus-extras 软件包,然后安装 nginx-plus 和要使用的动态模块。对于基于 Debian 的系统,请使用以下命令:
# apt-get update
# apt-get remove nginx-plus-extras
# apt-get install nginx-plus
# apt-get install module-name
  1. 在/etc/nginx/nginx.conf的主(顶层)上下文中,为每个动态加载的模块添加一条load_module指令:

    正在加载代码示例…

  2. 检查新配置的语法是否有效,然后重新加载:
# nginx -t && nginx -s reload

升级或试用NGINX Plus

如果您正在运行NGINX Plus,强烈建议尽快升级到Release 10。升级后可获得多项修复和改进;如果需要提交支持工单,也有助于我们更好地提供帮助。有关安装和升级说明,请访问NGINX Plus客户门户。

注意:NGINX Plus R10是最后一个包含nginx-plus-extras软件包的版本。请参阅上文的“NGINX Plus Extras软件包已弃用”。

如果您尚未试用过NGINX Plus,建议体验其Web加速、负载均衡和应用交付功能,也可将其用作获得全面支持的Web服务器,并使用增强的监控和管理API。立即开始免费试用30天,亲自了解NGINX Plus如何帮助您交付应用并实现横向扩展。

有关NGINX Plus R10的更多信息

有关NGINX Plus R10主要新功能的更多详细信息,请参阅以下相关资源:

[NGINX ModSecurity WAF已于2022年4月1日正式停止销售,并将于2024年3月31日终止生命周期。有关更多详细信息,请参阅我们博客中的《F5 NGINX ModSecurity WAF即将终止生命周期》。]


分享

关于作者

相关博客文章

NGINX Plus R26 正式发布
NGINX | 2022/02/15

NGINX Plus R26 正式发布

NGINX Plus R26通过缓存JSON Web密钥集加快JWT验证,并强化TLS握手,从而提升安全性。NGINX JavaScript的新功能包括增强对异步函数的支持,以及实现WebCrypto API。

使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击
NGINX | 2022/02/10

使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击

gRPC具备开发人员设计和部署现代应用所需的速度与灵活性,但其开放性也使其极易受到第7层DoS攻击。NGINX App Protect DoS可保护gRPC应用免受此类破坏性攻击。

Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划
NGINX | 2021/09/13

Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划

了解选择错误的Ingress控制器可能带来的风险,以及如何从关键方面着手,让您的选择更好地适应未来需求。

NGINX Plus R19 正式发布
NGINX | 2019/09/03

NGINX Plus R19 正式发布

NGINX Plus R19扩展了监控功能,不仅提供更多指标,还新增了指标分析方式;增加试运行模式,用于测试限速效果;增强键值存储,以支持IP地址范围;并使限速更加动态。

NGINX现已正式加入F5
NGINX | 2019/05/09

NGINX现已正式加入F5

NGINX现已正式成为F5的一部分。Gus Robertson现任F5 NGINX业务部门负责人。他阐述了两家公司在人才、文化和愿景方面融合的价值,以及双方将如何携手增强NGINX的开源产品和商业产品。

使用NGINX和NGINX Plus实现高性能缓存
NGINX | 2016/08/24

使用NGINX和NGINX Plus实现高性能缓存

我将介绍NGINX在内容缓存和性能方面的工作原理,并分享一些控制NGINX内容缓存方式的技巧。