为 Web 应用程序部署零信任网络

简介

本操作指南遵循 Azure 体系结构中心的 Web 应用程序零信任网络参考体系结构。 该参考体系结构旨在指导你通过 Web 应用程序防火墙 (WAF) 和传统的有状态防火墙发布支持安全访问的 Web 应用程序。 在此方案中,WAF 由应用程序网关提供,用于检查 SQL 注入、跨站脚本和其他常见 Open Web Application Security Project (OWASP) 规则集的流量。 Azure 防火墙执行的有状态数据包检查针对恶意数据包提供额外的保护。 服务之间的所有通信都使用受信任的证书通过端到端 TLS 进行保护。

先决条件

若要完成零信任部署,需要:

  • 一个自定义域名
  • 自定义域的受信任通配符证书
  • 具有活动订阅的 Azure 帐户。 创建试用版订阅
  • Visual Studio Code(可选,有助于自动部署)

部署资源

为简化演练,所有资源将部署到单个资源组。 请审查你的管理和治理策略,以便在订阅中使用适当的部署模型。 参考体系结构包含以下资源:

备注

参考体系结构中的 Web 应用程序通过虚拟机可视化。 它也可以是应用服务、Kubernetes 群集或其他容器环境,或虚拟机规模集。 在本演练中,我们将用应用服务替换虚拟机。

要部署并配置的但未在参考体系结构中明确列出的其他 Azure 服务包括:

部署资源组

首先,创建一个资源组来存储创建的所有资源。

重要

你可以使用自己的资源组名称和所需区域。 在本操作指南中,我们将所有资源部署到同一资源组 myResourceGroup,并将所有资源部署到“中国东部”Azure 区域。 请在整篇文章中使用这些位置和你的 Azure 订阅作为默认设置。

在同一资源组中创建所有资源是跟踪所用资源的良好做法,这样还可以更轻松地清理演示或非生产环境。

  1. Azure 门户中,搜索并选择“资源组”。

  2. 在“资源组”页上,选择“创建”。

  3. 使用以下设置或你自己的设置创建资源组:

    设置
    订阅 选择订阅。
    资源组 输入 myResourceGroup
    区域 选择“中国东部”。
  4. 选择“查看 + 创建”,然后选择“创建”。

部署 Azure 密钥保管库

在此步骤中,你将部署 Azure 密钥保管库来存储机密、密钥和证书。 在本操作指南中,我们将使用密钥保管库来存储由应用程序网关和 Azure 防火墙用来建立 TLS 连接的公共受信任证书。

备注

Azure 密钥保管库默认已启用软删除。 这可以防止意外删除存储的凭据。 为了能够在完成本操作指南后及时删除密钥保管库,建议将“已删除保管库的保留天数”设置为 7 天。

  1. 在 Azure 门户菜单或“主页”中,选择“创建资源”。

  2. 搜索框中,输入“密钥保管库”并从结果中选择“密钥保管库”。

  3. 在“密钥保管库”创建页中,选择“创建”。

  4. 在“创建密钥保管库”页中,输入或选择以下设置及默认值:

    设置
    名称 输入密钥保管库的唯一名称。 此示例使用 myKeyVaultZT
    定价层 选择“标准”。
    保留已删除保管库的天数 输入 7
    清除保护 选择“禁用清除保护(允许在保留期内清除密钥保管库和对象)”。
  5. 选择“查看 + 创建”,然后选择“创建”。

向 Key Vault 上传证书

在此任务中,你将为公共域上传受信任的通配符证书。

备注

此任务需要你拥有的公共域的受信任数字证书。 没有该证书,你将无法完整部署此体系结构示例。 在 Azure Key Vault 中,支持的证书格式为 PFX 和 PEM。

  • .pem 文件格式包含一个或多个 X509 证书文件。
  • .pfx 文件格式是一种存档文件格式,用于将多个加密对象存储在单个文件中,这些加密对象是:颁发给你的域的服务器证书、一个匹配的私钥,还可能包括一个中间 CA。
  1. 导航到前面创建的密钥保管库 myKeyVaultZT

  2. 在“密钥保管库”页中,选择“对象”下的“证书”。

  3. 在“证书”页上,选择“+ 生成/导入”

  4. 在“创建证书”页上,输入或选择以下设置及默认值:

    设置
    证书创建方法 选择“导入”。
    证书名称 输入 myTrustedWildCard
    上传证书文件 选择文件夹图标,然后浏览到证书文件所在的位置。
    选择该文件,然后选择“打开”以上传证书。
    密码 输入证书密码。
  5. 选择“创建”。

部署用户分配的托管标识

你将创建一个托管标识,并授予该标识对 Azure 密钥保管库的访问权限。 然后,应用程序网关和 Azure 防火墙将使用此标识从保管库检索证书。

  1. 在“搜索”框中,输入并选择“托管标识”。
  2. 选择“+ 新建”。
  3. 在“基本信息”选项卡上,为“名称”选择“myManagedIDappGW”。
  4. 选择“查看 + 创建”,然后选择“创建”。

为托管标识分配对密钥保管库的访问权限

  1. 导航到前面创建的密钥保管库 myKeyVaultZT
  2. 在“密钥保管库”页中,从左侧菜单中的“设置”下选择“访问权限配置”。
  3. 在“访问权限配置”页中,保留默认的“保管库访问策略”,然后选择“转到访问权限”
  4. 在“访问策略”页中,选择“+ 创建”。
  5. 在“创建访问策略”页中,选择“机密权限”和“证书权限”下的“获取”。 选择“下一步”。
  6. 在“主体”选项卡上,搜索并选择“myManagedIDappGW”标识。
  7. 选择“下一步”>“下一步”>“创建”。

部署虚拟网络

你将为 Web 应用程序部署中心辐射型体系结构。 中心网络包含一个用于检查应用程序流量的集中式 Azure 防火墙。 分支网络包含两个子网,一个用于应用程序网关,一个用于应用服务。

  1. 在门户的左上角选择“+ 创建资源”。

  2. 在搜索框中,输入“虚拟网络”。 在搜索结果中,选择“虚拟网络”。

  3. 在“虚拟网络”页中选择“创建”。

  4. 在“创建虚拟网络”中的“基本信息”选项卡上,输入 hub-vnet 作为名称

  5. 选择“IP 地址”选项卡或者选择页面底部的“下一步: IP 地址”按钮,然后输入以下设置及默认值:

    设置
    IPv4 地址空间 输入 192.168.0.0/16
    选择“+ 添加子网”
    子网名称 输入 AzureFirewallSubnet
    子网地址范围 输入 192.168.100.0/24
    选择 添加
  6. 选择“查看 + 创建”>“创建”。

  7. 重复此过程以使用以下设置创建第二个虚拟网络:

    设置
    实例详细信息
    名称 spoke-vnet
    IPv4 地址空间 172.16.0.0/16
    选择“+ 添加子网”
    子网名称 输入 AppGwSubnet
    子网地址范围 输入 172.16.0.0/24
    子网名称 App1
    子网地址范围 172.16.1.0/24
    选择 添加
  8. 选择“查看 + 创建”>“创建”。

  9. 导航到前面创建的“hub-vnet”。

  10. 在“中心虚拟网络”页中的“设置”下,选择“对等互连”。

  11. 在“对等互连”页中,选择“+ 添加”。

  12. 在“添加对等互连”页中,输入或选择以下设置及默认值:

    设置
    此虚拟网络
    对等互连链接名称 输入 hub-to-spoke
    到远程虚拟网络的流量 设置为“允许”。
    从远程虚拟网络转接的流量 设置为“允许”
    虚拟网络网关或路由服务器 设置为“无”
    远程虚拟网络
    对等互连链接名称 输入 spoke-to-hub
    虚拟网络部署模型 资源管理器
    我知道我的资源 ID 保留默认值“未选择”
    订阅 选择订阅
    虚拟网络 spoke-vnet
    到远程虚拟网络的流量 允许
    从远程虚拟网络转接的流量 允许
    虚拟网络网关或路由服务器
  13. 选择 添加

部署 Azure DNS 区域

若要安全访问 Web 应用,必须在 DNS 中配置完全限定的 DNS 名称,该名称与应用程序网关上的侦听器上传到密钥保管库的证书匹配。 为此,你将为域创建一个 Azure DNS 区域,稍后将使用该区域为 Web 应用创建 DNS 记录

  1. 在门户的左上角选择“+ 创建资源”。
  2. 在搜索框中,输入“DNS 区域”。
  3. 在结果列表中,选择“DNS 区域”>“创建”。
  4. 在“基本信息”选项卡上,输入你的域名。
  5. 选择“查看 + 创建”>“创建”。

备注

若要利用此 DNS 区域,需要将域名服务器更新为 Azure DNS 提供的名称服务器。 由于名称服务器可能因 Azure 租户而异,因此请使用 Azure DNS 分配给你的名称服务器。 Azure DNS 名称服务器位于所创建的 DNS 区域的“概述”页上。

部署 Azure 应用服务

你将部署 Azure 应用服务来托管受保护的 Web 应用程序。

  1. 在搜索栏中,键入“应用服务”。 在“服务”下,选择“应用服务”。

  2. 在“应用服务”页面中,请选择“+ 创建”。

  3. 在“创建 Web 应用”页中的“基本信息”选项卡上,输入或选择以下设置及默认值:

    设置
    实例详细信息
    名称 为 Web 应用输入全局唯一名称。 例如 myWebAppZT1
    发布 选择“代码”
    运行时堆栈 选择“.NET 6 (LTS)”。
    操作系统 选择“Windows”
    定价计划
    Windows 计划(中国东部) 选择“新建”,并输入“zt-asp”作为名称。
    定价计划 保留默认值“标准 S1”,或从菜单中选择另一个计划。
  4. 选择“查看 + 创建”>“创建”。

  5. 部署完成后,导航到“应用服务”。

  6. 在“应用服务”页中,从“设置”下选择“网络”。

  7. 在“入站流量”部分,选择“专用终结点”。

  8. 在“专用终结点连接”页中,选择“+ 添加”>“快速”。

  9. 在“添加专用终结点”窗格中,输入或选择以下设置及默认值:

    设置
    名称 pe-appservice
    虚拟网络 spoke-vnet
    子网 App1
  10. 选择“确定”。

部署应用程序网关

你将为执行 TLS 终止和 WAF 服务的应用部署应用程序网关和边缘入口解决方案。

  1. 在搜索栏中,键入“应用程序网关”。 在“服务”下,选择“应用程序网关”。

  2. 在“负载均衡 | 应用程序网关”页中,选择“+ 创建”。

  3. 在“基本信息”选项卡上,输入或选择以下设置及默认值:

    设置
    实例详细信息
    应用程序网关名称 输入“myAppGateway”。
    选择“WAF v2”。
    启用自动缩放 请选择“否”。
    实例计数 输入 1
    可用性区域 选择“无”。
    HTTP2 选择“已禁用”。
    WAF 策略 选择“新建”。
    输入“myWAFpolicy”作为 WAF 策略名称,然后选择“确定”。
    配置虚拟网络
    虚拟网络 选择“spoke-vnet”。
    子网 选择“AppGwSubnet (172.16.0.0/24)”。
  4. 选择“下一步: 前端 >”,并使用以下设置配置前端:

    设置
    前端 IP 地址类型 选择“公共”。
    公共 IP 地址 选择“添加新订阅”。
    输入 myAppGWpip 作为公共 IP 名称,然后选择“确定”。
  5. 选择“下一步: 后端 >”

  6. 在“后端”选项卡上,选择“添加后端池” 。

  7. 在“添加后端池”窗格中,输入或选择以下设置:

    设置
    名称 输入“myBackendPool”。
    目标类型 选择“应用服务”。
    目标 选择“myWebAppZT1”。
  8. 选择“添加”,然后选择“下一步: 配置 >”。

  9. 在“配置”选项卡上,选择“添加路由规则”。

  10. 在“添加路由规则”窗格中,输入以下设置:

    设置
    规则名称:输入 myRouteRule1
    优先级:输入 100
  11. 在“侦听器”选项卡下,输入或选择以下设置及默认值:

    设置
    侦听器名称 输入“myListener”。
    前端 IP 选择“公共”。
    协议 选择“HTTPS”
    端口 保留默认值 443
    HTTPS 设置
    选择证书 选择“从密钥保管库选择证书”
    证书名称 输入 myTrustedWildCard
    托管标识 选择“myManagedIDappGW”。
    密钥保管库 选择“myKeyVaultZT”。
    证书 选择“myTrustedWildCard”。
    其他设置
    侦听器类型 选择“多站点”。
    主机类型 选择“单一”
    主机名 输入 Web 应用的外部 DNS 名称。
    错误页 URL 请选择“否”。

    备注

    用于“主机名”的 FQDN 必须与要在后续步骤中创建的 DNS 记录匹配。 如果需要,可以回到“侦听器”配置,并将此设置更改为你创建的 DNS 记录。

  12. 选择“后端目标”选项卡。

  13. 在“后端目标”选项卡上,输入或选择以下设置及默认值:

    设置
    目标类型 选择“后端池”。
    后端目标 输入“myBackendPool”。
    后端设置 选择“添加新订阅”。
    添加后端设置
    后端设置名称 输入 myBackendSetting
    后端协议 选择“HTTPS”
    后端端口 保留默认值 443
    受信任的根证书
    使用已知的 CA 证书 请选择“是”。
    Host Name
    替代为新的主机名 请选择“是”。
    主机名替代 选择“从后端目标中选取主机名”。
  14. 选择“添加”两次,然后选择“下一步: 标记 ”。>

  15. 选择“下一步: 查看 + 创建 >”,然后选择“创建”。 部署过程可能需要 30 分钟才能完成。

创建自定义运行状况探测

现在,你将为后端池添加自定义运行状况探测。

  1. 导航到前面创建的应用程序网关。

  2. 在网关中,选择“设置”下的“运行状况探测”。

  3. 在“运行状况探测”中,选择“+ 添加”。

  4. 在“添加运行状况探测”页上,输入或选择以下设置及默认值:

    设置
    名称 输入 myHealthProbe
    协议 选择“HTTPS”
    主机 输入应用服务的 URL。 例如,myWebAppZT1.chinacloudsites.cn
    从后端设置中选取主机名 请选择“否”。
    从后端设置中选取端口 请选择“是”。
    路径 输入 /
    时间间隔 输入“30”。
    超时 输入“30”。
    不正常阈值 输入 3
    使用匹配条件的探测 请选择“否”。
    后端设置 选择“myBackendPool”。
  5. 选择“测试”,然后选择“添加”。

添加应用程序网关的 DNS 记录

  1. 若要检索应用程序网关的公共 IP 地址,请导航到应用程序网关的“概述”页,并复制列出的“前端公共 IP 地址”。

  2. 导航到前面创建的 DNS 区域。

  3. 在“DNS 区域”中,选择“+ 记录集”。

  4. 在“添加记录集”窗格中,输入或选择以下设置及默认值:

    设置
    名称 输入 mywebapp
    类型 选择“A - IPv4 地址的别名记录”。
    别名记录集 请选择“否”。
    TTL 保留默认值“1 小时”。
    IP 地址 输入应用程序网关的公共 IP 地址。

测试初始部署

此时,你应该可以通过应用程序网关连接到应用服务。 导航到创建的 DNS 记录的 URL,验证它是否解析为应用程序网关,以及是否显示默认的应用服务页。 如果加载应用程序网关页时出现网关错误,请检查网关的“后端运行状况”页,查找与后端池相关的任何错误,并检查后端设置。

部署 Azure 防火墙

你将部署 Azure 防火墙,以在应用程序网关和应用服务之间执行数据包检查。 存储在密钥保管库中的数字证书用于保护流量。

备注

基本层和标准层防火墙不支持 SSL 终止。

  1. 在 Azure 门户中,搜索并选择“防火墙”。

  2. 在“防火墙”页上,选择“+ 创建”。

  3. 在“创建防火墙”页上,输入或选择以下设置及默认值:

    设置
    名称 输入“myFirewall”。
    可用性区域 选择“无”。
    防火墙层 选择“高级”。
    防火墙策略 选择“添加新订阅”。
    创建新的防火墙策略
    策略名称 输入 myFirewallPolicy。
    策略层 选择“高级”,然后选择“确定”。
    选择虚拟网络 选择“使用现有项”。
    虚拟网络 选择“hub-vnet”。
    公共 IP 地址 选择“添加新订阅”。
    输入“myFirewallpip”,然后选择“确定”。
  4. 选择“查看 + 创建”,然后选择“创建”。 部署过程最长可能需要 30 分钟才能完成。

配置防火墙策略

在此任务中,你将配置用于数据包检查的防火墙策略。

  1. 导航到前面创建的 Azure 防火墙。

  2. 在“概述”页中,找到并选择“myFirewallPolicy”防火墙策略的链接。

  3. 在“防火墙策略”页中,选择“设置”下的“IDPS”。

  4. 在“IDPS”页上,选择“发出警报并拒绝”,然后选择“应用”。 等待防火墙策略完成更新,然后继续执行下一步。

  5. 在“设置”下选择“TLS 检查”

  6. 在“TLS 检查”页上,选择“已启用”。 然后输入或选择以下设置及默认值:

    设置
    托管标识 输入 myManagedIDappGW
    密钥保管库 选择“myKeyVaultZT”。
    证书 选择“myTrustedWildCard”。

备注

在此示例中,我们将重用通配符证书和同一托管标识。 在生产环境中,你可能会使用不同的证书,因此有一个可访问密钥保管库的不同托管标识。

  1. 选择“保存”。

  2. 在“设置”下选择“DNS”页。

  3. 在“DNS”页中,选择“已启用”。

  4. 在“DNS 代理”部分,选择“已启用”。

  5. 选择“应用”。

  6. 在防火墙策略中,选择“网络规则”。

  7. 在“网络规则”页中,选择“添加规则集合”。

  8. 在“添加规则集合”页中,输入或选择以下设置及默认值:

    设置
    名称 输入 myRuleCollection
    规则集合类型 选择“网络”。
    优先级 输入 500
    规则集合操作 选择“允许”
    规则集合组 选择“DefaultNetworkRuleCollectionGroup”。
    规则 创建两个规则
    名称 输入 appgw-to-as
    源类型 选择“IP 地址”。
    输入 172.16.0.0/24
    协议 选择“TCP”。
    目标端口 输入 443
    目标类型 选择“IP 地址”。
    目标 输入 172.16.1.0/24
    名称 输入 as-to-appgw
    源类型 选择“IP 地址”。
    172.16.1.0/24
    协议 选择“TCP”。
    目标端口 输入 443
    目标类型 选择“IP 地址”。
    目标 输入 172.16.0.0/24
  9. 选择 添加

部署路由表

你将创建一个路由表,其中用户定义的路由强制所有应用服务流量通过 Azure 防火墙。

  1. 在搜索框中键入“应用服务”。 在“服务”下,选择“路由表”。

  2. 在“路由表”页中,选择“+ 创建”。

  3. 在“创建路由表”页上,输入或选择以下设置及默认值:

    设置
    名称 输入 myRTspoke2hub
    传播网关路由 选择“是”
  4. 选择“查看 + 创建”,然后选择“创建”。

  5. 导航回“路由表”页,然后选择“+ 创建”。

  6. 在“创建路由表”页上,输入或选择以下设置及默认值:

    设置
    名称 输入 myRTapp2web
    传播网关路由 选择“是”
  7. 选择“查看 + 创建”,然后选择“创建”。

配置路由表

  1. 导航到“myRTspoke2hub”路由表。

  2. 在“路由表”中,选择“设置”下的“路由”页,然后选择“+ 添加”。

  3. 在“添加路由”窗格中,输入或选择以下设置及默认值:

    设置
    路由名称 输入 ToAppService
    地址前缀目标 选择“IP 地址”。
    目标 IP 地址/CIDR 范围 输入 172.16.1.0/24
    下一跃点类型 选择“虚拟设备”。
    下一跃点地址 Azure 防火墙的专用 IP 地址。 例如 192.168.100.4
  4. 选择 添加

  5. 在“路由”表中,选择“设置”下的“子网”,然后选择“+ 关联”。

  6. 在“关联子网”窗格中选择“spoke-vnet”虚拟网络,然后选择“AppGwSubnet”子网。

  7. 选择“确定”。

  8. 显示关联后,选择指向“AppGwSubnet”关联的链接。

  9. 在“专用终结点的网络策略”部分,选择“路由表”,然后选择“保存”。

  10. 导航到“myRTapp2web”路由表。

  11. 在“路由表”页中,选择“设置”下的“路由”。

  12. 在“添加路由”窗格中,输入或选择以下设置及默认值:

    设置
    路由名称 输入 ToAppGW
    地址前缀目标 选择“IP 地址”。
    目标 IP 地址/CIDR 范围 输入 172.16.0.0/24
    下一跃点类型 选择“虚拟设备”。
    下一跃点地址 输入 Azure 防火墙的专用 IP 地址。 例如 192.168.100.4
  13. 选择 添加

  14. 在“设置”下选择“子网”页,然后选择“+ 关联”。

  15. 在“关联子网”窗格中选择“spoke-vnet”虚拟网络,然后选择“App1”子网。

  16. 选择“确定”。

  17. 选择“+ 关联”,对另一个子网重复此过程。

  18. 选择“spoke-vnet”虚拟网络,然后选择“AppGwSubnet”子网。 选择“确定”。

  19. 显示关联后,选择指向“App1”关联的链接。

  20. 在“专用终结点的网络策略”部分中,选择“网络安全组”和“路由表”,然后选择“保存”。

重新测试

此时,你应该可以通过应用程序网关连接到应用服务。 导航到创建的 DNS 记录的 URL,验证它是否解析为应用程序网关,以及是否显示默认的应用服务页。 如果加载页面时出现错误,请检查网关的“后端运行状况”页,查找与后端池相关的任何错误,然后检查后端设置。 另请验证是否已正确配置路由。

应用程序网关应将流量发送到防火墙的专用 IP 地址。 防火墙可以通过虚拟网络对等互连连接来与专用终结点通信。 专用终结点连接到的子网上的路由表指向回防火墙,以返回到应用程序网关。

如果你要测试防火墙是否确实检查或筛选流量,请将防火墙策略中创建的网络规则从 TCP 修改为 ICMP。 这样就会隐式阻止来自应用程序网关的 TCP 流量,并拒绝进行网站访问。

部署网络安全组 - 可选

你将部署网络安全组,以防止其他子网访问应用服务使用的专用终结点。

备注

在此部署中,不显式要求使用网络安全组。 我们已将路由表配置为强制要求来自定义的子网的流量流经 Azure 防火墙。 但是,在生产环境中,大多数组织的其他子网可能位于同一虚拟网络中,或者与未定义用户定义的路由的网络对等互连。 网络安全组有助于确保其他子网无法访问应用服务的专用终结点。 详细了解网络安全组

  1. 在 Azure 门户中,搜索并选择“网络安全组”。

  2. 在“网络安全组”页中,选择“创建”。

  3. 在“基本信息”选项卡上的“名称”中,输入 nsg-app1

  4. 选择“查看 + 创建”,然后选择“创建”。

  5. 导航到新部署的网络安全组。

  6. 在“网络安全组”页中,选择“设置”下的“入站安全规则”。

  7. 在“入站安全规则”页中,选择“添加”。

  8. 在“添加入站安全规则”窗格中,输入或选择以下设置及默认值:

    设置
    选择“IP 地址”。
    源 IP 地址/CIDR 范围 输入 192.168.100.0/24
    源端口范围 输入 *
    目标 选择“任何”
    服务 选择“HTTPS”
    操作 选择“允许”
    优先级 输入 300
    名称 输入 Allow_HTTPS_From_Firewall
  9. 选择 添加

  10. 在“入站安全规则”页中,选择“添加”。

  11. 在“添加入站安全规则”窗格中,输入或选择以下设置及默认值:

    设置
    选择“任何”
    源端口范围 输入 *
    目标 选择“任何”
    服务 选择“自定义”。
    目标端口范围 输入 *
    协议 选择“任何”
    操作 选择“拒绝”
    优先级 输入 310
    名称 输入 Deny_All_Traffic
  12. 选择 添加

  13. 在“网络安全组”页中,选择“设置”下的“子网”。

  14. 在“子网”页上,选择“关联”。

  15. 在“关联子网”窗格中,选择“spoke-vnet”虚拟网络。

  16. 在“子网”下拉列表中,选择“App1”子网。

  17. 选择“确定”。

清理

你将通过删除包含所有资源的资源组 myResourceGroup 来清理环境。

后续步骤

为 Web 应用程序创建零信任网络后,请查看以下附加学习资源以进一步了解零信任安全性: