鎖定資源以防止非預期的變更

身為系統管理員,您可以鎖定訂用帳戶、資源群組或資源,以防止組織中的其他使用者不小心刪除或修改重要資源。 鎖定會覆寫使用者可能擁有的任何權限。

您可以將鎖定層級設定為 CanNotDeleteReadOnly。 在入口網站中,鎖定分別名為 [刪除] 和 [唯讀]。

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

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

鎖定繼承

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

瞭解鎖定的範圍

注意

請務必瞭解,鎖定並不適用于所有類型的作業。 Azure 作業可分成兩個類別-控制平面和資料平面。 鎖定只適用于控制平面作業

控制平面作業是指傳送至的作業 https://management.azure.com 。 資料平面作業會將作業傳送至您的服務實例,例如 https://myaccount.blob.core.windows.net/ 。 如需詳細資訊,請參閱 Azure 控制平面和資料平面。 若要探索哪些作業使用控制平面 URL,請參閱 Azure REST API

這種差異表示鎖定會防止資源的變更,但不會限制資源執行自己函式的方式。 例如,SQL Database 邏輯伺服器上的 ReadOnly 鎖定可防止您刪除或修改伺服器。 它不會讓您無法在該伺服器上的資料庫中建立、更新或刪除資料。 允許資料交易,因為那些作業並不會傳送到 https://management.azure.com

下一節將說明更多控制項和資料平面作業之間差異的範例。

套用鎖定前的考量

套用鎖可能導致意外的結果,因為某些看來不會修改資源的作業實際上需要執行被鎖定阻止的動作。 鎖定會防止任何需要對 Azure Resource Manager API 進行 POST 要求的作業。 鎖定阻止的動作常見範例像是:

  • 儲存體帳戶 上的唯讀鎖定可防止使用者列出帳戶金鑰。 Azure 儲存體清單金鑰作業是透過 POST 要求進行處理,以保護帳戶金鑰的存取權,以提供儲存體帳戶中資料的完整存取權。 針對儲存體帳戶設定唯讀鎖定時,沒有帳戶金鑰的使用者必須使用 Azure AD 認證來存取 blob 或佇列資料。 唯讀鎖定也會防止將範圍設定為儲存體帳戶的 Azure RBAC 角色或 (blob 容器或佇列) 的資料容器指派給該角色。

  • 無法刪除 儲存體帳戶 的鎖定,無法防止該帳戶中的資料遭到刪除或修改。 這種類型的鎖定只會保護儲存體帳戶本身不會遭到刪除。 如果要求使用 資料平面作業,則儲存體帳戶的鎖定不會保護該儲存體帳戶內的 blob、佇列、資料表或檔案資料。 但是,如果要求使用 控制平面作業,則鎖定會保護這些資源。

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

  • 儲存體帳戶 的唯讀鎖定不會防止該帳戶中的資料遭到刪除或修改。 這種類型的鎖定只會保護儲存體帳戶本身免于遭到刪除或修改,且不會保護該儲存體帳戶內的 blob、佇列、資料表或檔案資料。

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

  • 包含 App Service 方案資源群組 的唯讀鎖定,可防止您 相應增加或相應放大方案

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

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

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

  • 無法在 資源群組 上刪除鎖定,可防止 Azure Machine Learning 自動調整 Azure Machine Learning 計算叢集來移除未使用的節點。

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

  • 應用程式閘道上 的唯讀鎖定可防止您取得應用程式閘道的後端健康情況。 該作業會 使用 POST,這會被唯讀鎖定封鎖。

  • AKS 叢集上的唯讀鎖定可防止所有使用者存取 AZURE 入口網站上 AKS 叢集左邊分頁的 Kubernetes resources 區段中的任何叢集資源。 這些作業需要 POST 要求以進行驗證。

誰可以建立或刪除鎖定

若要建立或刪除管理鎖定,您必須擁有 Microsoft.Authorization/*Microsoft.Authorization/locks/* 動作的存取權。 在內建角色中,只有 擁有者使用者存取管理員 被授與這些動作的存取權。

受控的應用程式和鎖定

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

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

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

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

選取服務

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

顯示受控群組

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

刪除服務

設定鎖定

入口網站

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

    選取 [鎖定]。

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

    加入鎖定。

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

    設定鎖定。

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

    刪除鎖定。

ARM 範本

使用 Azure Resource Manager 範本 (ARM 範本) 部署鎖定時,您必須留意鎖定的範圍和部署的範圍。 若要在部署範圍套用鎖定,例如鎖定資源群組或訂用帳戶,請不要設定 [範圍] 屬性。 鎖定部署範圍內的資源時,請設定 [範圍] 屬性。

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

{
  "$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

REST API

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

若要建立鎖定,請執行:

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

範圍可以是訂用帳戶、資源群組或資源。 lock-name 是您想要命名鎖定的任何名稱。 api-version 請使用 2016-09-01

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

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

後續步驟