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

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

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

Note

本文进行了更新,以便使用新的 Azure PowerShell Az 模块。 若要详细了解新的 Az 模块和 AzureRM 兼容性,请参阅新 Azure Powershell Az 模块简介。 有关安装说明,请参阅安装 Azure PowerShell

锁的应用方式

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

与基于角色的访问控制不同,可以使用管理锁来对所有用户和角色应用限制。 若要了解如何为用户和角色设置权限,请参阅 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. 若要删除锁,请从可用选项中选择省略号和“删除”。

    删除锁

模板

使用资源管理器模板来部署某个锁定时,请根据锁定范围对名称和类型使用不同的值。

资源应用锁定时,请使用以下格式:

  • name - {resourceName}/Microsoft.Authorization/{lockName}
  • type - {resourceProviderNamespace}/{resourceType}/providers/locks

资源组订阅应用锁定时,请使用以下格式:

  • name - {lockName}
  • type - Microsoft.Authorization/locks

以下示例演示可创建应用服务计划、网站和网站上的锁的模板。 锁的资源类型是要锁定的资源的资源类型和 /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

可以通过 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

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 版本,请使用 2016-09-01

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

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

后续步骤