[编辑:NGINX ModSecurity WAF模块已于2022年4月1日正式停止销售,并将于2024年3月31日终止生命周期。有关更多详情,请参阅博客文章《F5 NGINX ModSecurity WAF即将终止生命周期》<.htmla>。]
[编辑注:有关NGINX Plus R10主要新功能的更多详情,请参阅以下相关资源:
- 使用JWT和NGINX Plus对API客户端进行身份验证
- NGINX Plus R10 利用 IBM POWER 的强大性能
- 使用OpenID Connect和NGINX Plus对现有应用程序的用户进行身份验证
- 使用NGINX JavaScript模块将客户端逐步迁移到新服务器
- 使用NGINX和NGINX Plus作为透明代理,实现IP透明传输和服务器直接返回
- 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流量的控制,可生成响应并精准确定请求路由,将请求转发至适合的服务器。
- 进一步改进TCP和UDP负载均衡:Stream模块扩展增加了对更多NGINX变量、使用
map指令进行计算、使用split_clients指令进行A/B测试、Geo和GeoIP操作以及选择性路由(为proxy_pass指令指定变量参数)的支持。借助这些扩展,可以利用NGINX配置语言和新的NGINX JavaScript集成,创建更复杂的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 reloadNGINX 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软件包和动态模块,请执行以下步骤:
- 删除 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- 在/etc/nginx/nginx.conf的主(顶层)上下文中,为每个动态加载的模块添加一条
load_module指令:正在加载代码示例…
- 检查新配置的语法是否有效,然后重新加载:
# 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主要新功能的更多详细信息,请参阅以下相关资源:
- 使用JWT和NGINX Plus对API客户端进行身份验证
- NGINX Plus R10 充分利用 IBM POWER
- 使用OpenID Connect和NGINX Plus对现有应用程序的用户进行身份验证
- 使用 NGINX JavaScript 模块将客户端逐步迁移到新服务器
- 将NGINX和NGINX Plus用作透明代理,实现IP透明和直接服务器返回
- NGINX Plus R10 有哪些新功能?(点播网络研讨会)
[NGINX ModSecurity WAF已于2022年4月1日正式停止销售,并将于2024年3月31日终止生命周期。有关更多详细信息,请参阅我们博客中的《F5 NGINX ModSecurity WAF即将终止生命周期》。]
关于作者

相关博客文章
NGINX Plus R26 正式发布
NGINX Plus R26通过缓存JSON Web密钥集加快JWT验证,并强化TLS握手,从而提升安全性。NGINX JavaScript的新功能包括增强对异步函数的支持,以及实现WebCrypto API。
使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击
gRPC具备开发人员设计和部署现代应用所需的速度与灵活性,但其开放性也使其极易受到第7层DoS攻击。NGINX App Protect DoS可保护gRPC应用免受此类破坏性攻击。
Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划
了解选择错误的Ingress控制器可能带来的风险,以及如何从关键方面着手,让您的选择更好地适应未来需求。
NGINX Plus R19 正式发布
NGINX Plus R19扩展了监控功能,不仅提供更多指标,还新增了指标分析方式;增加试运行模式,用于测试限速效果;增强键值存储,以支持IP地址范围;并使限速更加动态。
NGINX现已正式加入F5
NGINX现已正式成为F5的一部分。Gus Robertson现任F5 NGINX业务部门负责人。他阐述了两家公司在人才、文化和愿景方面融合的价值,以及双方将如何携手增强NGINX的开源产品和商业产品。
