博客 | NGINX

使用 NGINX Plus 保护 Microsoft Azure 应用服务中的applications

NGINX-F5-horiz-black-type-RGB 的一部分
Cedric Derue 缩略图
塞德里克·德鲁
2018 年 10 月 3 日发布

云计算(尤其是平台即服务 (PaaS) 和容器即服务 (CaaS) 产品)的兴起正在改变公司部署和运营其业务应用的方式。 设计云应用时最重要的挑战之一是选择完全托管的云服务,以在不影响安全性的情况下降低成本和耗时的操作任务。

这篇博文向您展示如何在Microsoft Azure App Service上托管应用并使用NGINX Plus保护它们以防止来自互联网的攻击。

Microsoft Azure 应用服务简介

Microsoft Azure App Service 是一个企业级、完全托管的平台,允许组织在 Microsoft Azure 中部署 Web、API 和移动应用程序,而无需管理底层基础架构,如图 1 所示。 Azure 应用服务提供以下主要功能:

  • Web Apps使您能够使用各种语言和框架(ASP.NET、Node.js、Java、PHP 和 Python)部署和运行 Web 应用程序。 它还使用具有全面应用管理功能(监控、从暂存到生产交换、删除已部署的应用等)的 Internet 信息服务 (IIS) 来管理可扩展且可靠的 Web应用。 它还提供了一个 Docker 运行时,用于使用容器在 Linux 上运行 Web应用。
  • API Apps提供了部署支持 CORS(跨源资源共享)的 REST API 的工具。 Azure API 应用可以轻松通过 Azure Active Directory、社交网络单点登录 (SSO) 或 OAuth 进行保护,无需更改代码。
  • 移动应用程序提供了一种快速部署移动后端服务的方法,该服务支持身份验证、推送通知、用户管理、云存储等基本功能。
图 1: Azure 应用服务

借助 Azure App Service,微软提供了一种在云上运行 Web应用的丰富且快速的方法。 事实上,开发人员可以使用 ASP.NET、Java、Node.js、PHP 和 Python 在本地开发应用,然后使用 Microsoft Visual Studio 或 Azure CLI 轻松将其部署到 Azure 应用服务。DevOps 团队还可以受益于 Azure 应用服务的持续部署功能,在多个环境中快速可靠地部署应用版本。

Azure App Service 上的applications可以访问 Azure 上部署的其他资源,或者可以通过 VPN 建立与本地公司资源的连接。

了解 Azure 应用服务环境

基本上,使用 Azure App Service 创建的应用直接暴露给 Internet 并分配给azurewebsites.net的子域。 为了更加安全,您可以使用 SSL 终止或使用 OAuth2 或 OpenID Connect (OIDC) 等身份验证和授权协议保护您的应用。 但是,不可能使用细粒度的出站和入站安全规则定制网络,也不可能应用诸如 Web应用防火墙 (WAF) 之类的中间件来防止来自 Internet 的恶意攻击或漏洞利用。

如果您在 Azure 应用服务中运行敏感应用并想要保护它们,则可以使用 Azure 应用服务环境 (ASE)。 ASE 是部署到虚拟网络中的隔离环境,专用于单个客户的应用。 因此,您可以更好地控制入站和出站应用网络流量。

使用 ASE,您可以在更安全的环境中以非常高的规模部署 Web、API、移动或功能应用程序,如图 2 所示。

图 2: NGINX ModSecurity WAF 为 Azure ASE 筛选流量

创建新的 ASE v2

ASE 有两个版本: ASE v1 和 ASE v2。 在这篇文章中我们讨论 ASE v2。

您可以使用 Azure 门户手动创建新的 ASE v2,也可以使用 Azure 资源管理器自动创建新的 ASE v2。

创建新的 ASE 时,必须在两种部署类型之间进行选择:

  • 外部 ASE通过公共 IP 地址公开 ASE 托管的应用。
  • ILB ASE在只能在 Azure 虚拟网络内访问的私有 IP 地址上公开 ASE 托管的应用。 内部端点就是 Azure 所称的内部负载均衡器 (ILB)。

在下面的示例中,我们选择 ILB ASE 来阻止来自 Internet 的访问。 因此,我们 ASE 中部署的应用只能从同一网络中运行的虚拟机 (VM) 访问。 以下两个命令使用 Azure 资源管理器和 Azure CLI 来预配新的ILB ASE v2

$ azure config mode arm $ azure group deploy create my-resource-group my-deployment-name --template-uri https://raw.githubusercontent.com/azure/azure-quickstart-templates/master/201-web-app-asev2-ilb-create/azuredeploy.json

确保可公开访问的 ASE 中的应用安全访问

另一方面,如果您希望您的应用程序可通过互联网访问,那么您必须保护它免受可能试图窃取存储在您的应用中的敏感信息的恶意攻击者的攻击。

要保护 ASE 中第 7 层的应用,主要有两种选择:

(您可以用 WAF 功能替代自定义应用交付控制器 [ADC],但我们在此不介绍该用例。)

解决方案的选择取决于您的安全限制。 一方面,Azureapplication网关为安全实施提供了交钥匙解决方案,并且不需要您维护底层基础架构。 另一方面,在虚拟机上部署 NGINX Plus 可以为您提供强大的堆栈,具有更好的控制力和灵活性,可以微调您的安全规则。

在 Azure应用网关和 NGINX Plus 之间进行选择以对 ASE 内部创建的应用进行负载平衡和保护,需要很好地理解每个解决方案提供的功能。 虽然 Azure应用网关适用于简单用例,但对于复杂用例,它不提供 NGINX Plus 中的许多标准功能。

下表比较了 Azureapplication网关和 NGINX Plus 对负载平衡和安全功能的支持。 有关 NGINX Plus 功能的更多详细信息请参阅下表。

特征 Azureapplication网关 NGINX Plus
缓解能力 application层(第 7 层) application层(第 7 层)
HTTP 感知
HTTP/2 感知
WebSocket 感知
SSL 卸载
路由功能 根据请求 URL 或基于 cookie 的会话亲和力做出简单决策 高级路由功能
基于 IP 地址的访问控制列表 ❌(必须在 Azure 中的 Web 应用级别定义)
端点 任何 Azure 内部 IP 地址、公共 Internet IP 地址、Azure VM 或 Azure 云服务 任何 Azure 内部 IP 地址、公共 Internet IP 地址、Azure VM 或 Azure 云服务
Azure Vnet 支持 面向 Internet 和内部 (Vnet) 的应用 面向 Internet 和内部 (Vnet) 的应用
网页应用防火墙
容量耗尽攻击 部分的 部分的
协议攻击 部分的 部分的
应用层攻击
HTTP 基本身份验证
JWT 身份验证
OpenID 连接 SSO

如您所见,NGINX Plus 和 Azureapplication网关都充当具有第 7 层负载平衡功能和 WAF 的 ADC,以确保强有力地防御常见的 Web 漏洞和攻击。

NGINX Plus 提供了 Azureapplication网关所缺少的几个附加功能:

  • URL 重写和重定向——使用 NGINX Plus,您可以在将请求传递给后端服务器之前重写其 URL 。 这意味着您可以改变文件的位置或请求路径,而无需修改向客户端公布的 URL。 您还可以重定向请求。 例如,您可以将所有 HTTP 请求重定向到 HTTPS 服务器。
  • 连接和速率限制——您可以配置多个限制来控制往返于 NGINX Plus 实例的流量。 这些包括对入站连接数、入站请求速率、后端节点连接以及从 NGINX Plus 到客户端的数据传输速率的限制。
  • HTTP/2 和 WebSocket 支持 – NGINX Plus 在应用层(第 7 层)支持HTTP/2WebSocket 。 Azure应用网关不支持;相反,Azure 负载均衡器在网络层(第 4 层)支持它们,TCP 和 UDP 在此运行。

为了提高安全性,您可以部署Azure DDoS Protection来缓解第 3 层和第 4 层的威胁,以补充 Azureapplication网关或 NGINX Plus 提供的第 7 层威胁缓解功能。

使用 NGINX Plus 和 Azure 应用服务来保护applications

图 3 展示了如何结合 NGINX Plus 和 Azure App Service 为在生产中运行业务应用提供安全的环境。 该部署策略使用 NGINX Plus 的负载均衡和 WAF 功能。

图 3: NGINX Plus 对 Azure ASE 中的应用进行流量负载均衡

该部署结合了以下组件:

  • Azure 虚拟网络 (VNet) – 表示 Azure 云中专用于您的组织的虚拟网络。 它提供了逻辑隔离,允许 Azure 资源在虚拟网络中彼此安全地通信。 这里我们定义了两个子网: 内部的 对于不直接暴露在互联网上的网络应用,以及 瓦夫 适用于 NGINX Plus 及其底层基础设施。
  • Azure 应用服务环境- 此示例部署利用两个示例 Web应用- Web 应用程序 1Web 应用程序 2 - 来演示如何使用 NGINX Plus 保护和负载平衡不同的 Web 应用程序。 在 NGINX Plus 中,您可以通过配置不同的上游块将请求分发到不同的 Web应用,并使用位置块根据 URI 进行内容路由。 以下显示了满足此目标的最小 NGINX Plus 配置(此处所有请求都发往同一个上游组):

    上游后端 { 服务器IP 地址-您的 ASE-ILB ; } 服务器 { 位置 / { proxy_set_header 主机 $host; proxy_pass http://backend; } }
    
  • NGINX Plus — 在多个 Web应用之间平衡 HTTP(S) 连接的负载。 与其他 Azure 服务相比,在 VM 中部署 NGINX Plus 可让您更好地控制基础设施。 例如,使用 VM,您可以选择在隔离的虚拟网络内运行的操作系统(Linux 或 Windows)。 事实上,Azure VM 适用于 NGINX Plus 支持的所有 Linux 发行版(出于显而易见的原因,Amazon Linux 除外)。
  • Azure VM 规模集– VM 规模集是一种 Azure 计算资源,可用于部署和管理一组相同的 VM。您可以配置 VM 的大小并将 VM 分配给正确的 VNet。 规模集内运行的所有 VM 均由 Azure 负载均衡器进行负载均衡,该负载均衡器在 VM 实例之间提供 TCP 连接。 此处,规模集中的每个 VM 都基于 Azure 市场提供的 NGINX Plus 映像。 规模集旨在提供真正的自动缩放功能。

Azure 还支持资源组,以便以逻辑方式对应用的 Azure 资源进行分组。 使用资源组不会对基础设施设计和拓扑产生影响,我们不会在这里展示它们。

NGINX Plus 使用 Azure VM 规模集实现高可用性和自动缩放

Azure VM 规模集为您提供虚拟化功能,可随时扩展,而无需购买和维护支持扩展的物理硬件。 但是,您仍然有责任通过执行配置、修补、安全更新和安装在其上运行的软件等任务来维护虚拟机。

在图 4 所示的架构中,NGINX Plus 实例部署在 Azure VM 规模集内,以实现主动-主动高可用性。 主动-主动设置非常棒,因为所有 NGINX Plus VM 都可以处理由 Azure 负载均衡器路由的传入请求,从而为您提供经济高效的容量。

图 4: Azure VM 规模集,使用 Azure 负载均衡器将流量负载均衡到 NGINX Plus

使用 Azure VM 规模集,您还可以根据平均 CPU 使用率轻松设置 NGINX Plus 实例的自动缩放。 在这种情况下,您需要注意同步 NGINX Plus 配置文件。 您可以为此目的使用 NGINX Plus 配置共享功能,如NGINX Plus 管理指南中所述。

概括

通过将 Azure App Service 用于您的云应用并在您的 Web 应用程序、API 和移动后端前面使用 NGINX Plus,您可以在全球范围内对这些应用进行负载平衡和保护。 通过将 NGINX Plus 与 Azure App Service 结合使用,您可以获得完全负载平衡的基础架构,并具有针对来自 Web 的漏洞和攻击的高级别防护。 这确保了强大的设计,能够以安全的方式运行生产中的关键应用。

 

资源

Web 应用概述(微软)
应用服务环境简介(Microsoft)
使用 Azure 门户 (Microsoft) 创建具有 Web应用防火墙的应用程序网关
比较 NGINX Open Source 和 NGINX Plus (NGINX) 的功能
HTTP 负载平衡(NGINX)

客座合著者 Cedric Derue 是 Altran 的解决方案架构师和 Microsoft MVP。 客座合著者 Vincent Thavonekham 是微软区域总监和 VISEO 的 Azure MVP。


“这篇博文可能引用了不再可用和/或不再支持的产品。 有关 F5 NGINX 产品和解决方案的最新信息,请探索我们的NGINX 产品系列。 NGINX 现在是 F5 的一部分。 所有之前的 NGINX.com 链接都将重定向至 F5.com 上的类似 NGINX 内容。”