锁定资源,以防止意外更改

管理员可能需要锁定订阅、资源组或资源,以防止组织中的其他用户意外删除或修改关键资源。 可以将锁定级别设置为 CanNotDeleteReadOnly。 在门户中,锁定分别称为删除只读

  • CanNotDelete 味着经授权的用户仍可读取和修改资源,但不能删除资源。
  • ReadOnly 意味着经授权的用户可以读取资源,但不能删除或更新资源。 应用此锁类似于将所有经授权的用户限制于“读者”角色授予的权限。

锁的应用方式

在父范围应用锁时,该范围内所有资源都会继承相同的锁。 即使是之后添加的资源也会从父作用域继承该锁。 继承中限制性最强的锁优先执行。

与基于角色的访问控制不同,可以使用管理锁来对所有用户和角色应用限制。 若要了解如何为用户和角色设置权限,请参阅 Azure 基于角色的访问控制

Resource Manager 锁仅适用于管理平面内发生的操作,包括发送到 https://management.chinacloudapi.cn的操作。 锁不会限制资源如何执行各自的函数。 资源更改将受到限制,但资源操作不受限制。 例如,SQL 数据库上的 ReadOnly 锁将阻止删除或修改该数据库,但不会阻止创建、更新或删除该数据库中的数据。 允许数据事务,因为这些操作不会发送到 https://management.chinacloudapi.cn

应用 ReadOnly 可能会导致意外结果,因为看起来好像读取操作的某些操作实际上需要其他操作。 例如,在存储帐户上放置 ReadOnly 锁会阻止所有用户列出密钥。 列出密钥操作通过 POST 请求进行处理,因为返回的密钥可用于写入操作。 另举一例,在应用服务资源上放置 ReadOnly 锁将阻止 Visual Studio 服务器资源管理器显示资源文件,因为该交互需要写访问权限。

谁可以在组织中创建或删除锁

若要创建或删除管理锁,必须有权执行 Microsoft.Authorization/*Microsoft.Authorization/locks/* 操作。 在内置角色中,只有“所有者”和“用户访问管理员”有权执行这些操作。

门户

  1. 在要锁定的资源、资源组或订阅的“设置”边栏选项卡中,选择“锁定”。

    选择锁

  2. 若要添加锁,请选择“添加”。 如果要在父级别创建锁,请选择父级。 当前选定的资源将从父级继承锁。 例如,可以锁定资源组,以便向其所有资源应用锁。

    添加锁

  3. 为该锁提供名称和锁级别。 (可选)可以添加注释来描述该锁。

    设置锁

  4. 若要删除锁,请从可用选项中选择省略号和“删除”。

    删除锁

模板

以下示例演示可创建应用服务计划、网站和网站上的锁的模板。 锁的资源类型是要锁定的资源的资源类型和 /providers/locks。 锁名是通过将包含 /Microsoft.Authorization/ 的资源名称与锁名连接起来创建的。

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

要使用 PowerShell 部署此示例模板,请使用:

New-AzureRmResourceGroup -Name sitegroup -Location chinaeast
New-AzureRmResourceGroupDeployment -ResourceGroupName sitegroup -TemplateUri https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/lock.json -hostingPlanName plan0103

要使用 Azure CLI 部署此示例模板,请使用:

az group create --name sitegroup --location chinaeast
az group deployment create --resource-group sitegroup --template-uri https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/lock.json --parameters hostingPlanName=plan0103

PowerShell

可以通过 Azure PowerShell 使用 New-AzureRmResourceLock 命令锁定已部署的资源。

若要锁定某个资源,请提供该资源的名称、其资源类型及其资源组名称。

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

若要锁定某个资源组,请提供该资源组的名称。

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

若要获取有关某个锁的信息,请使用 Get-AzureRmResourceLock。 若要获取订阅中的所有锁,请使用:

Get-AzureRmResourceLock

若要获取某个资源的所有锁,请使用:

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

若要获取某个资源组的所有锁,请使用:

Get-AzureRmResourceLock -ResourceGroupName exampleresourcegroup

若要删除锁,请使用:

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

Azure CLI

可以通过 Azure CLI 使用 az lock create 命令锁定已部署的资源。

若要锁定某个资源,请提供该资源的名称、其资源类型及其资源组名称。

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

REST API

可以使用 管理锁的 REST API锁定已部署的资源。 REST API 可用于创建和删除锁,并且检索有关现有锁的信息。

若要创建一个锁,请运行:

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

作用域可能是订阅、资源组或资源。 锁名称可以是想要对该锁使用的任何称谓。 对于 api 版本,请使用 2015-01-01

在请求中,包括指定锁属性的 JSON 对象。

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

后续步骤