防止 Azure 应用服务中的子域接管

子域接管是定期创建和删除许多资源的组织的常见威胁。 如果 DNS 记录指向已取消预配的 Azure 资源,则可能会发生子域接管。 此类 DNS 记录也称为“悬空 DNS”条目。 子域接管允许恶意参与者将针对组织域的流量重定向到执行恶意活动的站点。

子域接管的风险包括:

  • 失去对子域内容的控制
  • 从毫不知情的网站访客那里收集 Cookie 数据
  • 网络钓鱼活动
  • 经典攻击(如 XSS、CSRF 或 CORS 旁路)的进一步风险

若要了解有关子域接管的详细信息,请参阅 “防止悬空 DNS 条目并避免子域接管”。

Azure 应用服务 提供 名称保留域验证令牌安全的唯一默认主机名,以防止子域名接管。

保护应用服务资源免受子域接管的最有效方法是使用 安全的唯一默认主机名。 此功能通常用于Web 应用、函数应用和逻辑应用(标准)。

启用安全唯一的默认主机名时,应用会收到一个默认主机名,其中包含随机哈希和区域标识符,使其对组织是唯一的。 此格式可确保组织外部的任何人都无法创建具有相同默认主机名的资源,这消除了通过悬空 DNS 条目接管子域的风险。

工作原理

传统应用服务资源使用可全局预测的默认主机名格式:

全局(原始) 独有(新)
默认主机名 <AppName>.chinacloudsites.cn <AppName>-<Hash>.<Region>.chinacloudsites.cn
SCM 终结点 <AppName>.scm.chinacloudsites.cn <AppName>-<Hash>.scm.<Region>.chinacloudsites.cn

例如,部署到中国东部 2 的 contoso Web 应用可能会收到:

contoso-a6gqaeashthkhkeu.chinaeast3-01.chinacloudsites.cn

16 个字符的哈希在可配置的作用域内是确定性的,因此可以在需要时确保跨环境的主机名一致。

哈希范围选项

创建具有唯一默认主机名的资源时,可以选择一个 范围 ,确定哈希的生成方式:

Scope 说明
租户复用 在 Microsoft Entra 租户中的所有订阅中,相同的应用名称具有相同的哈希值。
订阅复用 在同一订阅中,相同的应用名称具有相同的哈希值。
资源组重用 在同一资源组内,相同的应用名称具有相同的哈希值。
不重复使用 每次都会生成唯一的哈希值。 最大程度隔离。

Tip

如果定期跨环境重新部署资源(例如,从测试订阅到同一租户下的生产订阅),请使用 租户重用 来确保主机名在订阅之间保持一致。

部署位置

部署槽位采用与生产站点相同的格式,但每个槽位都有自己独立的哈希值:

默认主机名 插槽主机名
格式 <AppName>-<Hash>.<Region>.chinacloudsites.cn <AppName>-<SlotName>-<Hash>.<Region>.chinacloudsites.cn

始终使用与生产站点相同的范围创建槽。

如何启用

创建资源时,你需要配置安全、唯一、唯一的默认主机名。 你不能追溯性地应用到现有资源上。 启用它们的方式取决于你使用的客户端:

  • Azure 门户:在 Azure 门户中创建的新 Web 应用、Function Apps 和 Logic Apps(标准版)会自动在所有支持的 SKU 上使用安全的唯一默认主机名。 不需要额外的配置。
  • Azure CLI、ARM 模板和 REST API:你必须通过在创建请求中设置主机名范围来明确选择加入。 为每次新部署设置此值,使门户外创建的资源使用与门户内创建资源相同的默认主机名格式。

创建新资源时使用 --domain-name-scope 参数启用安全唯一的默认主机名。

资源类型 命令 Reference
Web 应用 az webapp create --name <AppName> --resource-group <ResourceGroup> --plan <AppServicePlan> --domain-name-scope TenantReuse az webapp create命令用于创建Web应用程序。
函数应用 az functionapp create --name <AppName> --resource-group <ResourceGroup> --storage-account <StorageAccount> --consumption-plan-location <Region> --domain-name-scope TenantReuse az functionapp create
逻辑应用(标准) az logicapp create --name <AppName> --resource-group <ResourceGroup> --storage-account <StorageAccount> --domain-name-scope TenantReuse az logicapp create

--domain-name-scope参数接受以下值:NoReuse、、ResourceGroupReuseSubscriptionReuseTenantReuse

迁移现有资源

由于此功能只能在创建时启用,因此对于现有资源有两个选项:

  • 预先存在的应用克隆到启用了安全唯一默认主机名的新应用。
  • 从备份还原 到启用了安全唯一默认主机名的新应用。

Azure门户中提供了这两个选项。

为什么现在采用此功能

默认情况下,安全唯一的默认主机名提供 保护。 与其他需要持续 DNS 卫生和手动干预的缓解策略不同,此方法直接将安全性构建到主机名结构中。 启用时:

  • 任何外部执行组件都无法重新创建默认主机名。
  • 无法利用悬空 DNS 条目进行子域接管。
  • 除了在创建时启用该功能之外,无需执行其他配置步骤。

每次新的应用服务部署都使用安全且独特的默认主机名。 Azure门户已经会自动为支持SKU的新资源应用此配置。 将你的 Azure CLI、ARM 模板和 REST API 部署与默认主机名格式保持一致,可以让你的配置与推荐的 App Service 配置保持一致。

注意

主机名中的区域标识符(例如, eastus-01)可能会对将来的部署使用不同的数字后缀。 不要对确切的区域编号组合采用硬依赖项。

应用服务如何防止子域接管

删除应用服务应用或应用服务环境(ASE)后,只有属于最初拥有该 DNS 的租户的订阅才可重复使用相应的 DNS。 因此,客户有一段时间来清理与上述 DNS 的关联或指针,或通过在 Azure 中使用同名资源重新创建 DNS 来进行回收。 默认情况下,此行为在 Azure 应用服务*.chinacloudsites.cn*.appserviceenvironment.cn和资源上启用,因此不需要任何客户配置。

示例方案

订阅 A 和订阅 B 是属于租户 AB 的唯一订阅。 订阅 A 包含具有 DNS 名称的应用服务 Web 应用test.chinacloudsites.cn。 删除应用后,只有订阅 AB 才能通过创建名为test.chinacloudsites.cn的 Web 应用来立即重复使用 DNS 名称。 在删除资源后,立即不允许其他订阅声明该名称权。

如何防止子域接管

为 Azure 应用服务创建 DNS 条目时,请创建包含域验证 ID 的 asuid.{子域} TXT 记录。 如果存在此类 TXT 记录,则其他任何 Azure 订阅都无法验证自定义域或接管该记录,除非将令牌验证 ID 添加到 DNS 条目。

这些记录可防止使用你的 CNAME 记录中的相同名称创建另一个 App Service 应用。 如果不能够证明域名的所有权,威胁参与者无法接收流量或控制内容。

在网站删除之前,应更新 DNS 记录,以确保不良执行组件无法在删除和重新创建期间接管域。

若要获取域验证 ID,请参阅 在 Azure 应用服务中设置现有自定义域