你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
本文提供了有关如何在 Azure 平台上部署可靠且生产就绪的基础结构的综合性指南,以方便 Web 应用程序的托管、保护、缩放和监视。
AWS 上的 Yelb 部署
AWS 上的 Yelb 示例 Web 应用程序是使用 Bash、 AWS CLI、 eksctl、 kubectl 和 Helm 部署的。 随附的sample包含 Bash 脚本和 YAML 清单文件,可用于自动将Yelb应用程序部署到AWS Elastic Kubernetes Service (EKS)上。 此解决方案演示如何使用 AWS WAF 实现 Web 应用程序防火墙,以保护 Amazon Elastic Kubernetes 服务(EKS)上运行的 Web 应用程序。 可以使用 Bash 脚本创建 EKS 群集并部署 Yelb 应用程序。 Yelb Web 应用通过 Amazon 应用程序负载均衡器(ALB)暴露到公网上,并通过 AWS WAF Web 访问控制列表(web ACL)进行保护。 有关详细说明,请参阅将 Web 应用程序从 AWS Elastic Kubernetes 服务(EKS)移植到 Azure Kubernetes 服务 (AKS)。
Yelb 在 Azure 上的部署
以下部分介绍如何在 Azure Kubernetes 服务 (AKS) 群集上部署 Yelb 示例 Web 应用程序,并通过入口控制器(如 NGINX 入口控制器)公开它。 入口控制器服务可通过 内部(或专用)负载均衡器进行访问,该负载均衡器可平衡虚拟网络中容纳 AKS 群集的流量。 在混合方案中,可以从本地网络访问负载均衡器前端。 若要了解有关内部负载均衡的详细信息,请参阅 使用具有 Azure Kubernetes 服务 (AKS) 的内部负载均衡器。
配套的示例支持使用应用程序路由加载项安装托管的 NGINX Ingress 控制器,或使用Helm 图表安装非托管的NGINX Ingress 控制器。 使用 NGINX 入口控制器的应用程序路由加载项提供以下功能:
- 轻松配置基于 Kubernetes NGINX 入口控制器的托管 NGINX 入口控制器。
- 与用于公共和专用区域管理的 Azure DNS 集成。
- SSL 终止,证书存储在 Azure 密钥保管库 中。
对于其他配置,
为了增强安全性,Yelb 应用程序受 Azure 应用程序网关 资源保护。 此资源部署在 AKS 群集所在的虚拟网络或对等互连虚拟网络中的专用子网中。 Azure Web 应用程序防火墙 (WAF) 可保护对托管在 Azure Kubernetes 服务 (AKS) 上并通过 Azure 应用程序网关 公开的 Web 应用程序的访问,使其免受常见攻击和漏洞利用的威胁。
先决条件
- 活动的 Azure 订阅。 如果没有帐户,请在开始前创建一个 free Azure 帐户。
- Azure 帐户中的订阅上的“所有者”Azure 内置角色或“用户访问管理员”和“参与者”内置角色。
- Azure CLI 版本 2.61.0 或更高版本。 有关详细信息,请参阅安装 Azure CLI。
- Azure Kubernetes 服务 (AKS) 预览版扩展。
- jq 版本 1.5 或更高版本。
- Python 3 或更高版本。
- kubectl 1.21.0 或更高版本
- Helm 3.0.0 或更高版本
- 已在某个支持的平台上安装的 Visual Studio Code 以及 Bicep 扩展。
- 一个带有有效 TLS 证书用于 Yelb Web 应用程序的现有Azure 密钥保管库 资源。
- 用于 Yelb 应用程序名称解析的现有 Azure DNS 区域或等效 DNS 服务器。
Architecture
此示例提供一组用于构建 AKS 群集、部署 Yelb 应用程序、使用 NGINX 入口控制器 公开 UI 服务,以及使用 Azure 应用程序网关 和 Azure Web 应用程序防火墙(WAF) 对其进行保护的 Bicep 模板、Bash 脚本和 YAML 清单。
此示例还包括两个单独的Bicep参数文件和两组 Bash 脚本和 YAML 清单,每个清单都旨在部署两个不同的解决方案选项。 有关Bicep的详细信息,请参阅 什么是 Bicep?
在应用程序网关处终止 TLS,并通过 HTTP 调用 Yelb
在此解决方案中,Azure Web 应用程序防火墙 (WAF)通过阻止恶意攻击来确保系统的安全性。
Azure 应用程序网关从客户端应用程序接收传入调用,执行 TLS 终止,并将请求转发到 AKS 托管的 yelb-ui 服务。 此通信是通过使用 HTTP 传输协议的内部负载均衡器和 NGINX 入口控制器实现的。 下图演示了体系结构:
消息流如下所示:
-
Azure 应用程序网关处理 TLS 终止,并通过 HTTP 向 AKS 托管的
yelb-ui服务发送传入调用。 - 应用程序网关侦听器使用从 Azure 密钥保管库 获取的 SSL 证书来确保安全通信。
- 与侦听器关联的Azure WAF 策略将 OWASP 规则和自定义规则应用于传入请求,从而有效防止许多类型的恶意攻击。
- 应用程序网关后端 HTTP 设置使用端口 80 通过 HTTP 调用 Yelb 应用程序。
- 应用程序网关后端池和运行状况探测使用 HTTP 协议通过 AKS 内部负载均衡器调用 NGINX 入口控制器 进行流量管理。
- NGINX 入口控制器使用 AKS 内部负载均衡器来确保群集内的安全通信。
- Kubernetes 入口对象使用 NGINX 入口控制器通过内部负载均衡器通过 HTTP 公开应用程序。
-
yelb-ui服务属于ClusterIP类型,其调用被限制在集群内部,或只能通过 NGINX Ingress 控制器进行。
使用 Azure 应用程序网关 实现端到端 TLS
TLS 终止
Azure 应用程序网关支持网关级别的 TLS 终止,这意味着在发送到后端服务器之前,流量在网关上解密。 若要配置 TLS 终止,需要向侦听器添加 TLS/SSL 证书。 证书应采用个人信息Exchange(PFX)格式,其中包含私钥和公钥。 可以将证书从Azure 密钥保管库导入应用程序网关。 有关详细信息,请参阅使用 密钥保管库 证书实现 TLS 终止。
零信任安全模型
如果采用 零信任 安全模型,则应阻止服务代理(如 Azure 应用程序网关 和后端服务器)之间的未加密通信。 使用零信任安全模型时,不会向尝试访问网络内资源的任何用户或设备自动授予信任。 相反,无论用户的位置或网络如何,它都需要对每个请求的标识和授权进行持续验证。 在我们的方案中,实现零信任安全模型涉及使用Azure 应用程序网关作为服务代理,该代理充当传入请求的前端。 然后,这些请求会以加密格式发送到Azure Kubernetes 服务 (AKS)上的 NGINX 入口控制器。
使用应用程序网关的端到端 TLS
可以通过将 Azure 应用程序网关配置为与后端服务器之间使用端到端 TLS 加密,来实施零信任策略。 端到端 TLS 加密 允许你安全地将敏感数据传输到后端,同时利用应用程序网关的第 7 层负载均衡功能,包括基于 Cookie 的会话相关性、基于 URL 的路由、基于站点的路由,以及重写或注入 X-Forwarded-* 标头的功能。
使用端到端 TLS 通信模式配置应用程序网关时,它会终止网关上的 TLS 会话并解密用户流量。 然后,应用配置的规则以选择适当的后端池实例以将流量路由到该实例。 接下来,应用程序网关启动与后端服务器的新 TLS 连接,并在将请求传输到后端之前使用后端服务器的公钥证书重新加密数据。 在到达最终用户之前,来自 Web 服务器的响应遵循相同的过程。 若要启用端到端 TLS,需要在后端 HTTP 设置中将协议设置设置为 HTTPS 并将其应用到后端池。 此方法可确保与后端服务器的通信安全且符合要求。
有关详细信息,请参阅 应用程序网关端到端 TLS 加密 以及 保护应用程序网关的最佳做法。
在此解决方案中,Azure Web 应用程序防火墙 (WAF)通过阻止恶意攻击来确保系统的安全性。
Azure 应用程序网关处理来自客户端应用程序的传入请求,执行 TLS 终止,并通过内部负载均衡器和 NGINX Ingress 控制器,使用 HTTPS 传输协议调用底层 AKS 托管的 yelb-ui 服务,从而实现 端到端 TLS。 下图演示了体系结构:
消息流如下所示:
- Azure 应用程序网关处理 TLS 终止并通过 HTTPS 与后端应用程序通信。
- 应用程序网关侦听器使用从 Azure 密钥保管库 获取的 SSL 证书。
- 与侦听器关联的Azure WAF 策略针对传入请求运行 OWASP 规则和自定义规则,以阻止恶意攻击。
- 应用程序网关后端 HTTP 设置配置为通过端口 443 上的 HTTPS 调用 AKS 托管服务
yelb-ui。 - 应用程序网关后端池和运行状况探测使用 HTTPS 通过 AKS 内部负载均衡器调用 NGINX 入口控制器。
- NGINX 入口控制器已部署为使用 AKS 内部负载均衡器。
- SAKS 群集配置了用于机密存储 CSI 驱动程序加载项的 Azure 密钥保管库 提供程序,以便通过 CSI 卷从 Azure 密钥保管库 检索机密、证书和密钥。
- SecretProviderClass用于从密钥保管库检索应用程序网关使用的证书。
- Kubernetes 入口对象使用 NGINX 入口控制器通过 AKS 内部负载均衡器通过 HTTPS 公开应用程序。
- 该服务
yelb-ui具有一种ClusterIP类型,用于限制其调用在群集中或通过 NGINX 入口控制器。
若要帮助确保系统的安全性和稳定性,请考虑以下建议:
- 定期使用最新规则更新 Azure WAF 策略,以确保最佳安全性。
- 实现监视和日志记录机制来跟踪和分析传入的请求和潜在攻击。
- 定期执行 AKS 群集、NGINX 入口控制器和应用程序网关的维护和更新,以解决任何安全漏洞并维护安全基础结构。
- 实现监视和日志记录机制来跟踪和分析传入的请求和潜在攻击。
- 定期执行 AKS 群集、NGINX 入口控制器和应用程序网关的维护和更新,以解决任何安全漏洞并维护安全基础结构。
主机名
应用程序网关侦听器和 Kubernetes 入口 配置为使用相同的主机名。 出于以下原因,请务必对服务代理和后端 Web 应用程序使用相同的主机名:
- 保留会话状态:对代理和后端应用程序使用不同的主机名时,会话状态可能会丢失。 这意味着用户会话可能无法正确保存,从而导致用户体验不佳,并可能丢失数据。
- 身份验证失败:如果代理和后端应用程序之间的主机名不同,身份验证机制可能会失败。 此方法可能导致用户无法登录或访问应用程序内的安全资源。
- 无意中暴露 URL:如果未保留主机名,则可能会向最终用户公开后端 URL。 这可能会导致潜在的安全漏洞和未经授权的敏感信息访问。
- Cookie 问题:Cookie 在维护用户会话并在客户端和服务器之间传递信息方面发挥了关键作用。 当主机名不同时,Cookie 可能无法按预期工作,从而导致身份验证失败、会话处理不当和重定向错误等问题。
- 端到端 TLS/SSL 要求:如果代理与后端服务之间的安全通信需要端到端 TLS/SSL,则需要原始主机名的匹配 TLS 证书。 使用相同的主机名可以简化证书管理过程,并确保无缝建立安全通信。
可以通过对服务代理和后端 Web 应用程序使用相同的主机名来避免这些问题。 后端应用程序看到与 Web 浏览器相同的域,确保会话状态、身份验证和 URL 处理功能正常。
消息流
下图显示了部署和运行时的消息流步骤。
部署工作流
以下步骤介绍了部署过程。 此工作流对应于上图中的绿色数字。
- 安全工程师为工作负荷使用的自定义域生成证书,并将其保存在Azure密钥保管库中。 可以从已知 证书颁发机构(CA)获取有效的证书。
- 平台工程师在 main.bicepparams Bicep 参数文件中指定必要的信息,并部署Bicep模板来创建Azure资源。 必要的信息包括:
- Azure资源的命名前缀。
- 为工作负荷主机名和应用程序网关侦听器自定义域保存 TLS 证书的现有 Azure 密钥保管库的名称和资源组。
- 可以将 部署脚本 配置为将以下包安装到 AKS 群集。 有关更多信息,请参阅 Bicep 模块的参数部分。
- 使用 Prometheus 社区 Kubernetes Helm 图表的 Prometheus 和 Grafana:默认情况下,此示例配置不会将 Prometheus 和 Grafana 安装到 AKS 群集。 而是安装 Azure Managed Prometheus 和 Azure 托管 Grafana。
- cert-manager:此示例中不需要证书管理器,因为应用程序网关和 NGINX 入口控制器都使用来自Azure 密钥保管库的预上传 TLS 证书。
- NGINX 入口控制器 通过 Helm 图表:如果将 托管 NGINX 入口控制器与应用程序路由加载项一起使用,则无需通过 Helm 安装 NGINX 入口控制器的另一个实例。
- 应用程序网关侦听器从Azure 密钥保管库检索 TLS 证书。
- Kubernetes Ingress 对象使用从 Secrets Store CSI Driver 的 Azure 密钥保管库 提供程序 获取的证书,通过 HTTPS 公开 Yelb UI 服务。
- 应用程序网关侦听器从 Azure Key Vault 检索 TLS 证书。
Kubernetes Ingress 对象使用从Azure 密钥保管库 provider for Secrets Store CSI Driver 获取的证书,通过 HTTPS 公开 Yelb UI 服务。
运行时工作流
- 客户端应用程序使用其主机名调用示例 Web 应用程序。 与应用程序网关侦听器的自定义域关联的 DNS 区域使用
A记录,通过应用程序网关前端 IP 配置所用的 Azure 公共 IP 地址来解析 DNS 查询。 - 该请求会发送到由应用程序网关的前端 IP 配置使用的 Azure 公共 IP 地址。
- 应用程序网关执行以下操作:
- 应用程序网关处理 TLS 终止并通过 HTTPS 与后端应用程序通信。
- 应用程序网关侦听器使用从 Azure 密钥保管库 获取的 SSL 证书。
- 与侦听器关联的Azure WAF 策略针对传入请求运行 OWASP 规则和自定义规则,并阻止恶意攻击。
- 应用程序网关后端 HTTP 设置配置为通过端口 443 上的 HTTPS 调用示例 Web 应用程序。
- 应用程序网关后端池使用 HTTPS 通过 AKS 内部负载均衡器调用 NGINX 入口控制器。
- 请求将发送到托管 NGINX 入口控制器 Pod 的代理节点之一。
- NGINX 入口控制器副本之一处理请求并将请求发送到服务的服务终结点
yelb-ui之一。 -
yelb-ui调用yelb-appserver服务。 -
yelb-appserver调用yelb-db和yelb-cache服务。 -
yelb-ui调用yelb-appserver服务。 -
yelb-appserver调用yelb-db和yelb-cache服务。
Deployment
默认情况下,Bicep 模板使用 Azure CNI 叠加网络 网络插件和 Cilium 数据平面部署 AKS 群集。 可以使用备用网络插件。 此外,项目还演示如何使用以下扩展和功能部署 AKS 群集:
- Microsoft Entra Workload ID
- 基于 Istio 的服务网格附加组件
- API Server VNET 集成
- Azure NAT 网关
- 事件驱动自动伸缩(KEDA)插件
- Dapr 扩展
- Flux V2 扩展
- 垂直 Pod 自动缩放
- 适用于机密存储 CSI 驱动程序的 Azure 密钥保管库提供程序
- 图像清理器
- Azure Kubernetes 服务 (AKS)网络可观测性
- 具有应用程序路由附加产品的托管 NGINX 流入量
在生产环境中,强烈建议使用运行时间 SLA 部署专用 AKS 群集。 有关详细信息,请参阅 具有公共 DNS 地址的专用 AKS 群集。
或者,可以使用 授权的 IP 地址范围部署公共 AKS 群集并安全访问 API 服务器。 有关如何使用 Bicep 模板在 Azure 上部署基础结构的详细信息和说明,请参阅 companion Azure 代码示例。
在生产环境中,强烈建议使用运行时间 SLA 部署专用 AKS 群集。 有关详细信息,请参阅 具有公共 DNS 地址的专用 AKS 群集。 或者,可以使用 授权的 IP 地址范围部署公共 AKS 群集并安全访问 API 服务器。 有关如何使用Bicep模板在Azure上部署基础结构的详细信息和说明,请参阅 companion Azure 代码示例。
后续步骤
供稿人
Microsoft维护本文。 本系列文章为以下参与者的原创作品:
主要作者:
- Paolo Salvatori | 首席客户工程师
其他参与者:
- Ken Kilty | 首席 TPM
- 罗素·德皮纳 | 首席技术项目经理
- Erin Schaffer | 内容开发人员 2