Compartilhar via

了解Azure Blueprints中的资源锁定

重要

2026 年 7 月 11 日,蓝图(预览版)将弃用。 将现有蓝图定义和分配迁移到 模板规格。 蓝图工件将被转换为用于定义部署堆栈的 ARM JSON 模板或 Bicep 文件。 若要了解如何将工件创建为 ARM 资源,请参阅:

仅当有一种维护该一致性的机制时,大规模创建一致的环境才真正有价值。 本文介绍资源锁定在 Azure Blueprints 中的工作原理。 若要查看资源锁定和 拒绝分配应用的示例,请参阅 保护新资源 教程。

注释

由 Azure Blueprints 部署的资源锁仅适用于蓝图分配中部署的非扩展资源。 现有资源(如已存在的资源组中的资源)没有向其添加锁。

锁定模式和状态

锁定模式适用于蓝图分配,它具有三个选项: 不要锁定只读不删除。 锁定模式在蓝图分配中的项目工件部署时配置。 可以通过更新蓝图分配来设置不同的锁定模式。 但是,锁定模式不能在Azure Blueprints之外更改。

蓝图分配中的项目创建的资源有四种状态: “未锁定”、“ 只读”、“ 无法编辑/删除”或 “无法删除”。 每个项目类型都可以处于 “未锁定 ”状态。 下表可用于确定资源的状态:

模式 工件资源类型 说明
请勿锁定 * 未锁定 资源不受Azure Blueprints保护。 这个状态还用于将资源从蓝图分配外部添加到只读不删除资源组构件。
只读 资源组 无法编辑/删除 资源组是只读的,其所有属性(标记除外)都无法修改。 可以在此资源组中添加、移动、更改或删除未锁定的资源。
只读 非资源组 只读 除标记外,资源保持不变,无法删除或修改。
请勿删除 * 无法删除 可以更改资源,但不能删除。 可以在此资源组中添加、移动、更改或删除未锁定的资源。

覆盖锁定状态

通常,允许订阅上具有适当Azure基于角色的访问控制(Azure RBAC)(如“所有者”角色)的人可以更改或删除任何资源。 当 Azure Blueprints 作为已部署任务的一部分应用锁定时,并不存在这种访问情况。 如果使用 “只读 ”或 “不删除” 选项设置分配,则连订阅所有者也不能对受保护资源执行阻止作。

此安全措施可保护定义的蓝图及其一致性,以及蓝图被设计出来的环境不被意外或程序化地删除或更改。

在管理组中分配

阻止订阅所有者删除蓝图分配的唯一选项是将蓝图分配给管理组。 在此方案中,只有管理组的 所有者 具有删除蓝图分配所需的权限。

若要将蓝图分配给管理组而不是订阅,REST API 调用将更改如下所示:

PUT https://management.chinacloudapi.cn/providers/Microsoft.Management/managementGroups/{assignmentMG}/providers/Microsoft.Blueprint/blueprintAssignments/{assignmentName}?api-version=2018-11-01-preview

定义的管理组 {assignmentMG} 必须位于管理组层次结构中,或者是保存蓝图定义的同一管理组。

蓝图分配的请求正文如下所示:

{
    "identity": {
        "type": "SystemAssigned"
    },
    "location": "chinaeast2",
    "properties": {
        "description": "enforce pre-defined simpleBlueprint to this XXXXXXXX subscription.",
        "blueprintId": "/providers/Microsoft.Management/managementGroups/{blueprintMG}/providers/Microsoft.Blueprint/blueprints/simpleBlueprint",
        "scope": "/subscriptions/{targetSubscriptionId}",
        "parameters": {
            "storageAccountType": {
                "value": "Standard_LRS"
            },
            "costCenter": {
                "value": "Contoso/Online/Shopping/Production"
            },
            "owners": {
                "value": [
                    "johnDoe@contoso.com",
                    "johnsteam@contoso.com"
                ]
            }
        },
        "resourceGroups": {
            "storageRG": {
                "name": "defaultRG",
                "location": "chinaeast2"
            }
        }
    }
}

此请求正文与分配给订阅的请求正文之间的主要区别在于 properties.scope 属性。 必须将此必需属性设置为蓝图分配所应用的订阅。 订阅必须是存储蓝图分配的管理组层次结构的直接子级。

注释

分配给管理组范围的蓝图仍作为订阅级蓝图分配运行。 唯一的区别在于蓝图分配存储的位置,以防止订阅所有者删除分配及其关联的锁定。

删除锁定状态

如果需要修改或删除受分配保护的资源,可通过两种方法执行此作。

  • 将蓝图分配更新为“不锁定”模式
  • 删除蓝图分配

删除分配后,将删除Azure Blueprints创建的锁。 然而,该资源被遗留,需要通过正常手段删除。

蓝图锁的工作原理

如果在分配蓝图期间选择了只读禁止删除选项,则会在项目资源上应用Azure RBAC 拒绝分配的拒绝操作。 拒绝动作由蓝图分配的托管标识添加,只能由同一托管标识从工件资源中删除。 此安全措施强制实施锁定机制,并防止在Azure Blueprints外部删除蓝图锁。

资源组的“访问控制 (IAM)”页和“拒绝分配”选项卡的屏幕截图。

每个模式的 拒绝分配属性 如下所示:

模式 权限.操作 权限.非操作 Principals[i].类型 ExcludePrincipals[i].Id DoNotApplyToChildScopes(不应用于子范围)
只读 * */读
Microsoft.Authorization/锁定/删除
Microsoft.Network/virtualNetwork/subnets/join/action
系统定义(每个人) excludedPrincipals 中的蓝图指定和用户定义内容 资源组 - ;资源 -
请勿删除 */删除 Microsoft.Authorization/锁定/删除
Microsoft.Network/virtualNetwork/subnets/join/action
系统定义(每个人) excludedPrincipals 中的蓝图指定和用户定义内容 资源组 - ;资源 -

重要

Azure Resource Manager最多 30 分钟缓存角色分配详细信息。 因此,拒绝分配对蓝图资源的拒绝操作可能不会立即完全生效。 在此时间段内,可以删除要受蓝图锁保护的资源。

将某主体从拒绝分配政策中排除

在某些设计或安全方案中,可能需要将某个主体排除在蓝图分配创建的拒绝分配之外。 此步骤在 REST API 中完成,在创建分配时,将最多五个值添加到 locks 属性中的 excludedPrincipals 数组。 以下分配定义是包含 excludedPrincipals 的请求正文的示例:

{
  "identity": {
    "type": "SystemAssigned"
  },
  "location": "chinaeast2",
  "properties": {
    "description": "enforce pre-defined simpleBlueprint to this XXXXXXXX subscription.",
    "blueprintId": "/providers/Microsoft.Management/managementGroups/{mgId}/providers/Microsoft.Blueprint/blueprints/simpleBlueprint",
    "locks": {
        "mode": "AllResourcesDoNotDelete",
        "excludedPrincipals": [
            "7be2f100-3af5-4c15-bcb7-27ee43784a1f",
            "38833b56-194d-420b-90ce-cff578296714"
        ]
    },
    "parameters": {
      "storageAccountType": {
        "value": "Standard_LRS"
      },
      "costCenter": {
        "value": "Contoso/Online/Shopping/Production"
      },
      "owners": {
        "value": [
          "johnDoe@contoso.com",
          "johnsteam@contoso.com"
        ]
      }
    },
    "resourceGroups": {
      "storageRG": {
        "name": "defaultRG",
        "location": "chinaeast2"
      }
    }
  }
}

从拒绝分配中排除一个操作

类似于在蓝图分配中排除主体,您可以在拒绝分配中排除特定的Azure资源提供程序操作。 在 properties.locks 块中,在与 排除的主体 相同的位置,可以添加 excludedActions

"locks": {
    "mode": "AllResourcesDoNotDelete",
    "excludedPrincipals": [
        "7be2f100-3af5-4c15-bcb7-27ee43784a1f",
        "38833b56-194d-420b-90ce-cff578296714"
    ],
    "excludedActions": [
        "Microsoft.ContainerRegistry/registries/push/write",
        "Microsoft.Authorization/*/read"
    ]
},

虽然 excludedPrincipals 必须是显式的,但 excludedActions 条目可以使用 * 进行资源提供程序操作的通配符匹配。

后续步骤