分享方式:


鎖定您的資源以保護基礎結構

您可以系統管理員身分來鎖定 Azure 訂用帳戶、資源群組或資源,以防止意外使用者刪除和修改。 鎖定會覆寫使用者的任何權限。

您可以設定鎖定,以防止刪除或修改。 在入口網站中,這些鎖定稱為 [刪除] 和 [唯讀]。 在命令列中,這些鎖定稱為 CanNotDeleteReadOnly

  • CanNotDelete 表示經過授權的使用者可以讀取和修改資源,但無法刪除資源。
  • ReadOnly 表示經過授權的使用者可以讀取資源,但無法刪除或更新資源。 套用這個鎖定類似於限制所有經過授權使用者的權限是由「讀取者」角色所提供。

不同於角色型存取控制 (RBAC),您可以使用管理鎖定來對所有使用者和角色套用限制。 如要了解使用者和角色的設定權限,請參閱 Azure RBAC

鎖定繼承

當您在父範圍套用鎖定時,該範圍內的所有資源都會都繼承相同的鎖定。 甚至您稍後新增的資源都會繼承相同的父項鎖定。 繼承中限制最嚴格的鎖定優先順序最高。

延伸模組資源會從其套用的資源繼承鎖定。 例如,Microsoft.Insights/diagnosticSettings 是延伸模組資源類型。 如果您將診斷設定套用至儲存體 Blob,並鎖定儲存體帳戶,則無法刪除診斷設定。 此繼承很合理,因為診斷設定的完整資源識別碼為:

/subscriptions/{sub-id}/resourceGroups/{rg-name}/providers/Microsoft.Storage/storageAccounts/{storage-name}/blobServices/default/providers/microsoft.insights/diagnosticSettings/{setting-name}"

這符合鎖定資源的資源識別碼範圍:

/subscriptions/{sub-id}/resourceGroups/{rg-name}/providers/Microsoft.Storage/storageAccounts/{storage-name}

如果您的資源上有 [刪除] 鎖定,並嘗試刪除其資源群組,則功能會封鎖整個刪除作業。 即使資源群組中的資源群組或其他資源解除鎖定,也不會發生刪除。 您一律不會有部分刪除。

當您取消 Azure 訂用帳戶時:

  • 資源鎖定不會封鎖訂用帳戶取消作業。
  • Azure 會停用資源而非立即刪除資源,來保留資源。
  • Azure 只會在等待期間後永久刪除您的資源。

了解鎖定的範圍

注意

鎖定僅適用於控制平面 Azure 作業,而不適用於資料平面作業。

Azure 控制平面作業會移至 https://management.azure.com。 Azure 資料平面作業會移至您的服務執行個體,例如 https://myaccount.blob.core.windows.net/。 請參閱 Azure 控制平面和資料平面。 若要探索哪些作業使用控制平面 URL,請參閱 Azure REST API

區別表示鎖定會保護資源免於進行變更,但不會限制資源執行其函式的方式。 例如,SQL Database 邏輯伺服器上的 ReadOnly 鎖定可保護其免於受到刪除或修改。 其可讓您在伺服器資料庫中建立、更新或刪除資料。 資料平面作業允許資料交易。 這些要求不會移至 https://management.azure.com

套用鎖定前的考量

套用鎖定可能會導致未預期的結果。 某些似乎不會修改資源的作業需要封鎖的動作。 鎖定可防止 POST 方法將資料傳送至 Azure Resource Manager (ARM) API。 受封鎖作業的一些常見範例如下:

  • 儲存體帳戶上的唯讀鎖定會防止使用者列出帳戶金鑰。 POST 要求會處理 Azure 儲存體列出金鑰作業,以保護帳戶金鑰的存取權。 帳戶金鑰可讓您完整存取儲存體帳戶中的資料。 為儲存體帳戶設定唯讀鎖定時,沒有帳戶金鑰的使用者必須使用 Microsoft Entra 認證來存取 Blob 或佇列資料。 唯讀鎖定也會防止 Azure RBAC 角色的指派,而這些角色的範圍限定在儲存體帳戶或資料容器 (Blob 容器或佇列)。

  • 儲存體帳戶上的唯讀鎖定可保護 RBAC 針對儲存體帳戶或資料容器 (Blob 容器或佇列) 範圍的指派。

  • 儲存體帳戶的唯讀鎖定可防止建立 Blob 容器。

  • 儲存體帳戶的唯讀鎖定可防止建立 Blob 容器。 不過,您可以透過控制平面和資料平面,在儲存體帳戶上建立作業。 唯讀鎖定僅封鎖控制平面建立要求,但使用者仍可以透過資料平面在資源上執行有效的建立作業。

  • 儲存體帳戶上的唯讀鎖定或無法刪除鎖定並不會使其資料無法刪除或修改。 此外也不會保護 Blob、佇列、資料表或檔案中的資料。

  • 儲存體帳戶 API 會公開資料平面控制平面作業。 如果要求使用資料平面作業,則儲存體帳戶上的鎖定不會保護該儲存體帳戶內的 Blob、佇列、資料表或檔案資料。 不過,如果要求使用控制平面作業,則鎖定會保護這些資源。

    例如,如果要求使用檔案共用 - 刪除 (這是控制平面作業),則刪除會失敗。 如果要求使用刪除共用 (這是資料平面作業),則刪除會成功。 建議您使用控制平面作業。

  • 網路安全性群組 (NSG) 的唯讀鎖定可防止建立對應的 NSG 流量記錄。 網路安全性群組 (NSG) 的「無法刪除」鎖定不會防止建立或修改對應的 NSG 流量記錄。

  • App Service 資源上的唯讀鎖定會防止 Visual Studio 伺服器總管顯示該資源的檔案,因為該互動需要寫入存取權。

  • 資源群組 (包含 App Service 方案) 上的唯讀鎖定,可防止您擴增方案

  • 包含虛擬機器資源群組上的唯讀鎖定,會防止所有使用者啟動或重新啟動虛擬機器。 這些作業需要 POST 方法要求。

  • 資源群組的唯讀鎖定會使您無法將現有的資源移入或移出資源群組。 但請注意,具有唯讀鎖定的資源可移至另一個資源群組。

  • 資源群組 (包含自動化帳戶) 上的唯讀鎖定,可防止所有 Runbook 啟動。 這些作業需要 POST 方法要求。

  • 資源資源群組的「無法刪除」鎖定會防止刪除 Azure RBAC 指派。

  • 資源群組上的無法刪除鎖定,可防止 Azure Resource Manager 自動刪除歷程記錄中的部署。 如果您在歷程記錄中到達 800 個部署,您的部署會失敗。

  • Azure 備份服務所建立之資源群組上的無法刪除鎖定會導致備份失敗。 服務最多支援 18 個還原點。 當鎖定時,備份服務無法清除還原點。 如需詳細資訊,請參閱常見問題 - 備份 Azure VM

  • 對包含 Azure Machine Learning 工作區的資源群組套用 cannot-delete 鎖定,會使 Azure Machine Learning 計算叢集的自動調整無法正常運作。 使用鎖定時,自動調整無法移除未使用的節點。 您的解決方案耗用的資源會比工作負載所需的還要多。

  • Log Analytics 工作區上的唯讀鎖定可防止使用者與實體行為分析 (UEBA) 啟用。

  • Log Analytics 工作區上的「無法刪除」鎖定不會防止資料清除作業。 請改為移除使用者的資料清除角色。

  • 訂用帳戶上的唯讀鎖定會阻止 Azure Advisor 正常運作。 Advisor 無法儲存其查詢的結果。

  • 應用程式閘道上的唯讀鎖定可防止您取得應用程式閘道的後端健康情況。 該作業會使用 POST 方法,也就是唯讀鎖定區塊。

  • Azure Kubernetes Service (AKS) 叢集上的唯讀鎖定會限制您透過入口網站存取叢集資源的方式。 唯讀鎖定可防止您在 Azure 入口網站中使用「AKS 叢集的 Kubernetes 資源」區段來選擇叢集資源。 這些作業需要 POST 方法要求以進行驗證。

  • Site Recovery 所保護虛擬機器上的無法刪除鎖定,可防止移除保護或停用複寫時,與 Site Recovery 相關的特定資源連結無法正確移除。 如果您稍後打算後續再次保護 VM,則必須在停用保護之前先移除鎖定。 若未移除鎖定,您必須依照特定步驟來清除過時的連結,才能保護 VM。 如需詳細資訊,請參閱針對 Azure VM 複寫進行疑難排解

  • 針對 Postgresql,虛擬網路不應該在虛擬網路或子網路層級設定任何資源鎖定,因為鎖定可能會干擾網路和 DNS 作業。 在虛擬網路中建立伺服器之前,請確定您從虛擬網路和所有子網路中移除任何刪除或唯讀鎖定。 您可以在建立伺服器之後重新套用鎖定。

誰可以建立或刪除鎖定

若要建立或刪除管理鎖定,您必須存取 Microsoft.Authorization/*Microsoft.Authorization/locks/* 動作。 指派給 [擁有者] 和 [使用者存取管理員] 角色的使用者具有必要的存取權。 某些特製化的內建角色也會授與此存取權。 您可以建立具有必要權限的自訂角色。

受控的應用程式和鎖定

某些 Azure 服務 (例如 Azure Databricks) 使用受控的應用程式來實作服務。 在此情況下,服務將建立兩個資源組。 其中一個是包含服務概觀的解除鎖定資源群組。 另一個是包含服務基礎結構的鎖定資源群組。

如果您嘗試刪除基礎結構資源群組,會收到一個錯誤訊息,指出資源組已鎖定。 如果您嘗試刪除基礎結構資源群組的鎖定,就會收到錯誤,指出無法刪除鎖定,因為系統應用程式擁有該鎖定。

請改為刪除服務,這也會刪除基礎結構資源群組。

針對受控應用程式,選擇您所部署的服務。

Azure 入口網站的螢幕擷取畫面,其中已選取 Azure Databricks 執行個體。

請注意,此服務包含受控資源群組的連結。 該資源群組會保留基礎結構並加以鎖定。 您只能間接將其刪除。

顯示 Azure 入口網站中受控資源群組連結的螢幕擷取畫面。

若要刪除服務的所有資料,包括鎖定的基礎結構資源群組,請選擇服務的 [刪除]

Azure 入口網站的螢幕擷取畫面,其中已選取服務的 [刪除] 選項。

設定鎖定

入口網站

在左側瀏覽面板中,訂用帳戶鎖定功能的名稱是 [資源鎖定],而資源群組鎖定功能的名稱為 [鎖定]

  1. 在您要鎖定之資源、資源群組或訂用帳戶的 [設定] 刀鋒視窗中,選取 [鎖定]

    選取鎖定。

    注意

    您無法將鎖定新增至管理群組。

  2. 若要新增鎖定,選取 [新增]。 如果您想要在父層級建立鎖定,請選取父系。 目前選取的資源會從父系繼承鎖定。 例如,您可以鎖定資源群組以將鎖定套用到其所有資源。

    新增鎖定。

  3. 提供鎖定的名稱和鎖定層級。 您可以視需要新增描述鎖定的附註。

    設定鎖定。

  4. 若要刪除鎖定,請選取 [刪除] 按鈕。

    刪除鎖定。

範本

使用 ARM 範本或 Bicep 檔案來部署鎖定時,最好了解部署範圍和鎖定範圍一起運作的方式。 若要在部署範圍內套用鎖定,例如鎖定資源群組或訂用帳戶,請將範圍屬性保持取消設定。 鎖定部署範圍內的資源時,請設定鎖定上的範圍屬性。

下列範本會將鎖定套用至資源群組。 請注意,鎖定資源上沒有範圍屬性,因為鎖定範圍符合部署範圍。 在資源群組層級部署此範本。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
  },
  "resources": [
    {
      "type": "Microsoft.Authorization/locks",
      "apiVersion": "2016-09-01",
      "name": "rgLock",
      "properties": {
        "level": "CanNotDelete",
        "notes": "Resource group should not be deleted."
      }
    }
  ]
}

若要建立資源群組並加以鎖定,請在訂用帳戶層級部署下列範本。

{
  "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "rgName": {
      "type": "string"
    },
    "rgLocation": {
      "type": "string"
    }
  },
  "variables": {},
  "resources": [
    {
      "type": "Microsoft.Resources/resourceGroups",
      "apiVersion": "2021-04-01",
      "name": "[parameters('rgName')]",
      "location": "[parameters('rgLocation')]",
      "properties": {}
    },
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2021-04-01",
      "name": "lockDeployment",
      "resourceGroup": "[parameters('rgName')]",
      "dependsOn": [
        "[resourceId('Microsoft.Resources/resourceGroups/', parameters('rgName'))]"
      ],
      "properties": {
        "mode": "Incremental",
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "parameters": {},
          "variables": {},
          "resources": [
            {
              "type": "Microsoft.Authorization/locks",
              "apiVersion": "2016-09-01",
              "name": "rgLock",
              "properties": {
                "level": "CanNotDelete",
                "notes": "Resource group and its resources should not be deleted."
              }
            }
          ],
          "outputs": {}
        }
      }
    }
  ],
  "outputs": {}
}

將鎖定套用至資源群組內的資源時,請新增範圍屬性。 將範圍設定為要鎖定的資源名稱。

下列範例說明建立 App Service 方案、網站和網站上鎖定的範本。 鎖定的範圍會設定為網站。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "hostingPlanName": {
      "type": "string"
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]"
    }
  },
  "variables": {
    "siteName": "[concat('ExampleSite', uniqueString(resourceGroup().id))]"
  },
  "resources": [
    {
      "type": "Microsoft.Web/serverfarms",
      "apiVersion": "2020-12-01",
      "name": "[parameters('hostingPlanName')]",
      "location": "[parameters('location')]",
      "sku": {
        "tier": "Free",
        "name": "f1",
        "capacity": 0
      },
      "properties": {
        "targetWorkerCount": 1
      }
    },
    {
      "type": "Microsoft.Web/sites",
      "apiVersion": "2020-12-01",
      "name": "[variables('siteName')]",
      "location": "[parameters('location')]",
      "dependsOn": [
        "[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]"
      ],
      "properties": {
        "serverFarmId": "[parameters('hostingPlanName')]"
      }
    },
    {
      "type": "Microsoft.Authorization/locks",
      "apiVersion": "2016-09-01",
      "name": "siteLock",
      "scope": "[concat('Microsoft.Web/sites/', variables('siteName'))]",
      "dependsOn": [
        "[resourceId('Microsoft.Web/sites', variables('siteName'))]"
      ],
      "properties": {
        "level": "CanNotDelete",
        "notes": "Site should not be deleted."
      }
    }
  ]
}

Azure PowerShell

您可以使用 Azure PowerShell 以 New-AzResourceLock 命令鎖定已部署的資源。

若要鎖定資源,請提供資源的名稱、其資源類型,以及其資源群組名稱。

New-AzResourceLock -LockLevel CanNotDelete -LockName LockSite -ResourceName examplesite -ResourceType Microsoft.Web/sites -ResourceGroupName exampleresourcegroup

若要鎖定資源群組,請提供資源群組的名稱。

New-AzResourceLock -LockName LockGroup -LockLevel CanNotDelete -ResourceGroupName exampleresourcegroup

若要取得鎖定的相關資訊,請使用 Get-AzResourceLock。 若要取得訂用帳戶中的所有鎖定,請使用︰

Get-AzResourceLock

若要取得資源的所有鎖定,請使用︰

Get-AzResourceLock -ResourceName examplesite -ResourceType Microsoft.Web/sites -ResourceGroupName exampleresourcegroup

若要取得資源群組的所有鎖定,請使用︰

Get-AzResourceLock -ResourceGroupName exampleresourcegroup

若要刪除資源的鎖定,請使用:

$lockId = (Get-AzResourceLock -ResourceGroupName exampleresourcegroup -ResourceName examplesite -ResourceType Microsoft.Web/sites).LockId
Remove-AzResourceLock -LockId $lockId

若要刪除資源群組的鎖定,請使用:

$lockId = (Get-AzResourceLock -ResourceGroupName exampleresourcegroup).LockId
Remove-AzResourceLock -LockId $lockId

Azure CLI

您可使用 az lock create 命令,透過 Azure CLI 來鎖定已部署的資源。

若要鎖定資源,請提供資源的名稱、其資源類型,以及其資源群組名稱。

az lock create --name LockSite --lock-type CanNotDelete --resource-group exampleresourcegroup --resource-name examplesite --resource-type Microsoft.Web/sites

若要鎖定資源群組,請提供資源群組的名稱。

az lock create --name LockGroup --lock-type CanNotDelete --resource-group exampleresourcegroup

若要取得鎖定的相關資訊,請使用 az lock list。 若要取得訂用帳戶中的所有鎖定,請使用︰

az lock list

若要取得資源的所有鎖定,請使用︰

az lock list --resource-group exampleresourcegroup --resource-name examplesite --namespace Microsoft.Web --resource-type sites --parent ""

若要取得資源群組的所有鎖定,請使用︰

az lock list --resource-group exampleresourcegroup

若要刪除資源的鎖定,請使用:

lockid=$(az lock show --name LockSite --resource-group exampleresourcegroup --resource-type Microsoft.Web/sites --resource-name examplesite --output tsv --query id)
az lock delete --ids $lockid

若要刪除資源群組的鎖定,請使用:

lockid=$(az lock show --name LockSite --resource-group exampleresourcegroup  --output tsv --query id)
az lock delete --ids $lockid

Python

您可以使用 ManagementLockClient.management_locks.create_or_update_at_resource_group_level 命令鎖定 Python 已部署的資源。

若要鎖定資源,請提供資源的名稱、其資源類型,以及其資源群組名稱。

import os
from azure.identity import AzureCliCredential
from azure.mgmt.resource import ManagementLockClient

credential = AzureCliCredential()
subscription_id = os.environ["AZURE_SUBSCRIPTION_ID"]

lock_client = ManagementLockClient(credential, subscription_id)

lock_result = lock_client.management_locks.create_or_update_at_resource_level(
    "exampleGroup",
    "Microsoft.Web",
    "",
    "sites",
    "examplesite",
    "lockSite",
    {
        "level": "CanNotDelete"
    }
)

若要鎖定資源群組,請提供資源群組的名稱。

import os
from azure.identity import AzureCliCredential
from azure.mgmt.resource import ManagementLockClient

credential = AzureCliCredential()
subscription_id = os.environ["AZURE_SUBSCRIPTION_ID"]

lock_client = ManagementLockClient(credential, subscription_id)

lock_result = lock_client.management_locks.create_or_update_at_resource_group_level(
    "exampleGroup",
    "lockGroup",
    {
        "level": "CanNotDelete"
    }
)

若要取得訂用帳戶中所有鎖定的相關資訊,請使用 ManagementLockClient.management_locks.get。 若要取得訂用帳戶中的所有鎖定,請使用︰

import os
from azure.identity import AzureCliCredential
from azure.mgmt.resource import ManagementLockClient

credential = AzureCliCredential()
subscription_id = os.environ["AZURE_SUBSCRIPTION_ID"]

lock_client = ManagementLockClient(credential, subscription_id)

lock_result = lock_client.management_locks.list_at_subscription_level()

for lock in lock_result:
    print(f"Lock name: {lock.name}")
    print(f"Lock level: {lock.level}")
    print(f"Lock notes: {lock.notes}")

若要取得資源的鎖定,請使用:

import os
from azure.identity import AzureCliCredential
from azure.mgmt.resource import ManagementLockClient

credential = AzureCliCredential()
subscription_id = os.environ["AZURE_SUBSCRIPTION_ID"]

lock_client = ManagementLockClient(credential, subscription_id)

lock_result = lock_client.management_locks.get_at_resource_level(
    "exampleGroup",
    "Microsoft.Web",
    "",
    "sites",
    "examplesite",
    "lockSite"
)

print(f"Lock ID: {lock_result.id}")
print(f"Lock Name: {lock_result.name}")
print(f"Lock Level: {lock_result.level}")

若要取得資源群組的鎖定,請使用:

import os
from azure.identity import AzureCliCredential
from azure.mgmt.resource import ManagementLockClient

credential = AzureCliCredential()
subscription_id = os.environ["AZURE_SUBSCRIPTION_ID"]

lock_client = ManagementLockClient(credential, subscription_id)

lock_result = lock_client.management_locks.get_at_resource_group_level(
    "exampleGroup",
    "lockGroup"
)

print(f"Lock ID: {lock_result.id}")
print(f"Lock Level: {lock_result.level}")

若要刪除資源的鎖定,請使用:

import os
from azure.identity import AzureCliCredential
from azure.mgmt.resource import ManagementLockClient

credential = AzureCliCredential()
subscription_id = os.environ["AZURE_SUBSCRIPTION_ID"]

lock_client = ManagementLockClient(credential, subscription_id)

lock_client.management_locks.delete_at_resource_level(
    "exampleGroup",
    "Microsoft.Web",
    "",
    "sites",
    "examplesite",
    "lockSite"
)

若要刪除資源群組的鎖定,請使用:

import os
from azure.identity import AzureCliCredential
from azure.mgmt.resource import ManagementLockClient

credential = AzureCliCredential()
subscription_id = os.environ["AZURE_SUBSCRIPTION_ID"]

lock_client = ManagementLockClient(credential, subscription_id)

lock_client.management_locks.delete_at_resource_group_level("exampleGroup", "lockGroup")

REST API

您可以使用管理鎖定的 REST API,來鎖定已部署的資源。 此 REST API 可讓您建立及刪除鎖定,以及擷取現有鎖定的相關資訊。

若要建立鎖定,請執行:

PUT https://management.azure.com/{scope}/providers/Microsoft.Authorization/locks/{lock-name}?api-version={api-version}

範圍可以是訂用帳戶、資源群組或資源。 鎖定名稱可以是您想要命名的任何名稱。 對於 API 版本,請使用 2016-09-01

在要求中,包含指定鎖定屬性的 JSON 物件。

{
  "properties": {
  "level": "CanNotDelete",
  "notes": "Optional text notes."
  }
}

下一步