了解 Azure 藍圖中的資源鎖定

重要

在 2026 年 7 月 11 日,藍圖 (預覽) 將會淘汰。 將現有的藍圖定義和指派移轉至範本規格部署堆疊。 藍圖成品會轉換成用來定義部署堆疊的 ARM JSON 範本或 Bicep 檔案。 若要了解如何將成品撰寫為 ARM 資源,請參閱:

如果有一種機制可維護環境一致性,那麼大規模建立一貫化的環境才真正有用。 本文說明 Azure 藍圖中資源鎖定的運作方式。 若要查看資源鎖定和拒絕指派應用程式的範例,請參閱保護新資源教學課程。

注意

Azure 藍圖部署的資源鎖定只會套用至藍圖指派所部署的非延伸模組資源。 現有的資源,例如已存在之資源群組中的資源,則不會新增鎖定。

鎖定模式和狀態

鎖定模式適用於藍圖指派,而且有三個選項:[不要鎖定]、[唯讀] 或 [不要刪除]。 鎖定模式會在藍圖指派期間的成品部署過程中進行設定。 您可以藉由更新藍圖指派來設定不同的鎖定模式。 不過,鎖定模式無法變更 Azure 藍圖外部。

藍圖指派中成品所建立的資源有四種狀態:[未鎖定]、[唯讀]、[無法編輯 / 刪除] 或 [無法刪除]。 每個成品類型都可以處於未鎖定狀態。 下表可用來判斷資源的狀態:

[模式] 成品資源類型 State 描述
不要鎖定 * 未鎖定 資源並未受到 Azure 藍圖保護。 此狀態也可用於從藍圖指派外部新增至唯讀不要刪除資源群組成品的資源。
唯讀 資源群組 無法編輯/刪除 資源群組僅限唯讀,除了標籤之外,其所有屬性都無法修改。 未鎖定資源可以在這個資源群組中新增、移動、變更或刪除。
唯讀 非資源群組 唯讀 除了標籤之外,資源仍然無法變更,也無法刪除或修改。
不刪除 * 無法刪除 資源可以改變,但無法刪除。 未鎖定資源可以在這個資源群組中新增、移動、變更或刪除。

覆寫鎖定狀態

訂用帳戶中具有適當 Azure角色型存取控制 (Azure RBAC) 的人 (例如「擁有者」角色) 通常能夠變更或刪除任何資源。 當 Azure 藍圖將鎖定作為已部署指派的一部分套用時,存取權並非如此。 如果指派是使用 [唯讀] 或 [不要刪除] 選項來設定的,則即使是訂用帳戶擁有者也無法在受保護的資源上執行封鎖的動作。

此安全性措施可保護已定義藍圖的一致性,以及設計為透過意外或以程式設計方式刪除或修改而建立的環境。

在管理群組指派

防止訂用帳戶擁有者移除藍圖指派的唯一選項,是將藍圖指派給管理群組。 在此案例中,只有管理群組的擁有者具有移除藍圖指派所需的權限。

若要將藍圖指派給管理群組,而不是訂用帳戶,REST API 呼叫會變更如下所示:

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

{assignmentMG} 所定義的管理群組必須位於管理群組階層中,或是儲存藍圖定義的相同管理群組。

藍圖指派的要求本文如下所示:

{
    "identity": {
        "type": "SystemAssigned"
    },
    "location": "eastus",
    "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": "eastus"
            }
        }
    }
}

此要求本文和指派給訂用帳戶的主要差異在於 properties.scope 屬性。 此必要屬性必須設定為藍圖指派套用的訂用帳戶。 訂用帳戶必須是儲存藍圖指派之管理群組階層的直接子項目。

注意

指派給管理群組範圍的藍圖仍會以訂用帳戶層級藍圖指派的形式運作。 唯一的差異在於藍圖指派會儲存在何處,防止訂用帳戶擁有者移除指派和相關聯的鎖定。

移除鎖定狀態

如果您需要修改或刪除指派所保護的資源,則可執行此動作的方式有兩種。

  • 將藍圖指派更新為未鎖定的鎖定模式
  • 刪除藍圖指派

移除指派後,則會移除 Azure 藍圖所建立的鎖定。 不過,資源會留下來,而需要透過正常方式刪除。

藍圖鎖定的運作方式

如果指派選取了 [唯讀] 或 [不要刪除] 選項,則在藍圖指派期間,會將 Azure RBAC 拒絕指派的拒絕動作套用到成品資源。 拒絕動作會由藍圖指派的受控身分識別來新增,並且只能透過相同的受控身分識別從成品資源中移除。 此安全性措施可強制執行鎖定機制,並防止移除 Azure 藍圖外部的藍圖鎖定。

Screenshot of the Access control (I A M) page and the Deny assignments tab for a resource group.

每個模式的否定性指派屬性如下所示:

[模式] Permissions.Actions Permissions.NotActions Principals[i].Type ExcludePrincipals[i].Id DoNotApplyToChildScopes
唯讀 * */read
Microsoft.Authorization/locks/delete
Microsoft.Network/virtualNetwork/subnets/join/action
SystemDefined (Everyone) excludedPrincipals 中的藍圖指派和使用者定義 資源群組 - true;資源 - false
不刪除 */delete Microsoft.Authorization/locks/delete
Microsoft.Network/virtualNetwork/subnets/join/action
SystemDefined (Everyone) excludedPrincipals 中的藍圖指派和使用者定義 資源群組 - true;資源 - false

重要

Azure Resource Manager 最多可快取 30 分鐘的角色指派詳細資料。 因此,藍圖資源上拒絕指派的拒絕動作可能不會立即完全生效。 在這段時間內,有可能會刪除藍圖鎖定所要保護的資源。

從否定性指派中排除主體

在某些設計或安全性案例中,可能需要從藍圖指派建立的否定性指派中排除主體。 在 REST API 中建立指派時,最多新增五個值至 locks 屬性中的 excludedPrincipals 陣列,即可完成此步驟。 下列指派定義是包含 excludedPrincipals 的要求主體範例:

{
  "identity": {
    "type": "SystemAssigned"
  },
  "location": "eastus",
  "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": "eastus"
      }
    }
  }
}

從否定性指派中排除動作

類似在藍圖指派中否定性指派排除主體,您可以排除特定的 Azure 資源提供者作業。 在 properties.locks 區塊中與 excludedPrincipals 所在的相同位置,可以新增 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 項目可利用資源提供者作業的 * 比對萬用字元。

下一步