使用NGINX Plus保护Microsoft Azure App Service中的应用

NGINX | 2018年10月03日

云计算的兴起,尤其是平台即服务(PaaS)和容器即服务(CaaS)产品,正在改变企业部署和运行业务应用的方式。设计云应用时,一项重要挑战是选择全托管云服务,在不影响安全性的前提下降低成本,并减少耗时的运维工作。

本博文将介绍如何在Microsoft Azure App Service上托管应用,并使用NGINX Plus保护这些应用,防范来自互联网的攻击。

Microsoft Azure App Service 简介

Microsoft Azure App Service是一个企业级全托管平台,组织无需管理底层基础设施,即可在Microsoft Azure中部署Web、API和移动应用,如图1所示。Azure App Service提供以下主要功能:

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

图 1:Azure App Service

借助Azure App Service,Microsoft提供了一种功能丰富且快捷的云端Web应用运行方式。开发人员可以使用ASP.NET、Java、Node.js、PHP和Python在本地开发应用,并通过Microsoft Visual Studio或Azure CLI轻松将其部署到Azure App Service。DevOps团队还可以利用Azure App Service的持续部署功能,在多个环境中快速、可靠地部署应用版本。

Azure App Service上的应用程序可以访问部署在Azure上的其他资源,也可以通过VPN连接到本地企业资源。

了解Azure App Service环境

通常,使用Azure App Service创建的应用会直接暴露在互联网上,并分配到azurewebsites.net的一个子域。为提高安全性,可以使用SSL终止,或OAuth2、OpenID Connect(OIDC)等身份验证和授权协议来保护应用。但是,无法通过精细的出站和入站安全规则来自定义网络,也无法应用Web应用防火墙(WAF)等中间件来防范来自互联网的恶意攻击或漏洞利用。

如果在Azure App Service中运行敏感应用并希望加以保护,可以使用Azure App Service Environment(ASE)。ASE是部署在虚拟网络中的隔离环境,专用于单个客户的应用。因此,您可以更有效地控制应用的入站和出站网络流量。

借助ASE,您可以在更安全的环境中大规模部署Web、API、移动或函数应用,如图2所示。

图 2:NGINX ModSecurity WAF 为 Azure ASE 过滤流量

创建新的ASE v2

ASE有两个版本:ASE v1和ASE v2。本文将介绍ASE v2。

可以使用Azure Portal手动创建新的ASE v2,也可以使用Azure Resource Manager自动创建。

创建新的ASE时,必须在两种部署类型中选择一种:

  • An 外部ASE通过公共IP地址公开访问托管在ASE上的应用程序。
  • An ILB ASE通过一个仅可从Azure虚拟网络内部访问的专用IP地址公开ASE托管的应用程序。Azure将该内部终结点称为内部负载均衡器(ILB)。

在以下示例中,我们选择ILB ASE来阻止来自互联网的访问。因此,部署在ASE中的应用程序只能由同一网络中运行的虚拟机(VM)访问。以下两条命令使用Azure Resource Manager和Azure CLI预配新的ILB ASE v2:

$ azure config mode arm$ azure group deployment 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],但本文不涵盖该用例。)

解决方案的选择取决于您的安全约束。一方面,Azure Application Gateway 提供开箱即用的安全策略实施方案,无需维护底层基础设施。另一方面,在虚拟机上部署 NGINX Plus 可提供功能强大的技术栈,让您能够更灵活地控制和精细调整安全规则。

要在Azure Application Gateway和NGINX Plus之间进行选择,以便为ASE中创建的应用提供负载均衡和安全保护,需要充分了解每种解决方案提供的功能。Azure Application Gateway适用于简单用例,但在复杂用例中,它并不具备NGINX Plus标配的许多功能。

下表比较了Azure Application Gateway和NGINX Plus对负载均衡和安全功能的支持情况。表格下方提供了有关NGINX Plus功能的更多详细信息。

功能 Azure Application Gateway NGINX Plus缓解能力 应用层(第7层) 应用层(第7层)支持HTTP感知 ✅ ✅支持HTTP/2感知 ❌ ✅支持WebSocket感知 ❌ ✅SSL卸载 ✅ ✅路由功能 根据请求URL或基于Cookie的会话亲和性进行简单决策 高级路由功能基于IP地址的访问控制列表 ❌(必须在Azure中的Web应用级别定义) ✅端点 任意Azure内部IP地址、公共互联网IP地址、Azure VM或Azure Cloud Service 任意Azure内部IP地址、公共互联网IP地址、Azure VM或Azure Cloud ServiceAzure Vnet支持 面向互联网和内部(Vnet)应用 面向互联网和内部(Vnet)应用WAF ✅ ✅大流量攻击 部分支持 部分支持协议攻击 部分支持 部分支持应用层攻击 ✅ ✅HTTP基本身份验证 ❌ ✅JWT身份验证 ❌ ✅OpenID Connect SSO ❌ ✅

可以看出,NGINX Plus和Azure Application Gateway均可充当应用交付控制器(ADC),提供第7层负载均衡功能和Web应用防火墙(WAF),为常见Web漏洞和利用攻击提供有力防护。

NGINX Plus还提供了Azure Application Gateway不具备的多项功能:

  • URL重写和重定向:使用NGINX Plus,可以在将请求传递到后端服务器之前重写请求的URL。这意味着,无需修改向客户端公布的URL,即可更改文件位置或请求路径。还可以重定向请求。例如,可以将所有HTTP请求重定向到HTTPS服务器。
  • 连接和速率限制:您可以配置多项限制来控制流量进出NGINX Plus实例。这些限制包括入站连接数、入站请求速率、与后端节点的连接数,以及从NGINX Plus到客户端的数据传输速率。
  • HTTP/2和WebSocket支持:NGINX Plus支持在HTTP/2和WebSocket应用层(第7层)运行。Azure Application Gateway不支持;Azure Load Balancer则在TCP和UDP运行的网络层(第4层)支持这两种协议。

为进一步增强安全性,可以部署Azure DDoS Protection,以缓解第3层和第4层的威胁,并与Azure Application Gateway或NGINX Plus提供的第7层威胁缓解功能形成互补。

结合使用 NGINX Plus 与 Azure App Service 保护应用程序

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

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

该部署包含以下组件:

  • Azure虚拟网络(VNet),表示Azure云中专供贵组织使用的虚拟网络。它提供逻辑隔离,使Azure资源能够在虚拟网络中相互安全通信。此处定义了两个子网:Internal用于未直接暴露于互联网的Web应用,Waf用于NGINX Plus及其底层基础设施。
  • Azure App Service Environment:此示例部署使用两个示例Web应用,即Web App 1和Web App 2,演示如何使用NGINX Plus保护不同的Web应用并对其进行负载均衡。在NGINX Plus中,可以通过配置不同的upstream块,将请求分发到不同的Web应用,并使用location块根据URI进行内容路由。以下是实现此目标所需的最简NGINX Plus配置(此处所有请求均发送到同一个上游组):
upstream backend {    server IP-address-of-your-ASE-ILB;
}

server {
    location / {
        proxy_set_header Host $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 Load Balancer进行负载均衡,该负载均衡器在VM实例之间提供TCP连接。在此,规模集中的每个VM均基于Azure Marketplace中提供的NGINX Plus映像。规模集旨在实现真正的自动扩缩。

Azure还支持使用资源组,以便按逻辑轻松归组应用程序的Azure资源。使用资源组不会影响基础设施设计和拓扑,因此此处未予显示。

使用Azure虚拟机规模集实现NGINX Plus高可用性和自动扩缩容

Azure VM规模集不仅提供虚拟化能力,还可随时扩展,无需购买和维护支持扩展所需的物理硬件。不过,您仍需负责维护VM,包括配置、修补、安装安全更新,以及安装在VM上运行的软件。

在图 4 所示的架构中,NGINX Plus实例部署在Azure VM规模集中,以实现双活高可用性。双活配置的优势在于,所有NGINX Plus VM都可以处理由Azure Load Balancer路由的传入请求,从而以较低成本提供所需容量。

图4:Azure Load Balancer 将流量负载均衡到 NGINX Plus 的 Azure VM 规模集

借助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 Apps概述(Microsoft)
App Service Environment简介(Microsoft)
使用Azure门户创建带Web应用防火墙的应用程序网关(Microsoft)
比较NGINX Open Source与NGINX Plus的功能(NGINX)
HTTP负载均衡(NGINX)

特邀联合作者Cedric Derue是Altran的解决方案架构师兼Microsoft MVP。特邀联合作者Vincent Thavonekham是VISEO的Microsoft区域总监兼Azure MVP。


分享

相关博客文章

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内容缓存方式的技巧。