使用资源锁来保护 Azure Cosmos DB 资源

适用对象: NoSQL MongoDB Cassandra Gremlin

作为管理员,你可能需要锁定 Azure Cosmos DB 帐户、数据库或容器。 锁可防止组织中的其他用户意外删除或修改关键资源。 可以将锁级别设置为 CanNotDeleteReadOnly

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

先决条件

锁的应用方式

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

与 Azure 基于角色的访问控制不同,你可以使用管理锁来对所有用户和角色应用限制。

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

管理锁定

资源锁定对于使用帐户密钥访问 Azure Cosmos DB 的用户所做的更改不起作用,除非首先通过启用 disableKeyBasedMetadataWriteAccess 属性锁定 Azure Cosmos DB 帐户。 确保此属性不会中断使用任何 SDK、Azure 门户或第三方工具对资源进行更改的现有应用程序。 启用此属性会中断通过帐户密钥进行连接以修改资源的应用程序。 这些修改可能包括更改吞吐量、更新索引策略等。

$RESOURCE_GROUP_NAME = "<resource-group>"
$ACCOUNT_NAME = "<account-name>"
$LOCK_NAME = "$ACCOUNT_NAME-lock"

首先,更新帐户,以防止通过帐户密钥连接的任何内容进行更改。

$parameters = @{
    Name = $ACCOUNT_NAME
    ResourceGroupName = $RESOURCE_GROUP_NAME
    DisableKeyBasedMetadataWriteAccess = true
}
Update-AzCosmosDBAccount @parameters

在 Azure Cosmos DB 帐户资源和所有子资源上创建删除锁。

$parameters = @{
    ResourceGroupName = $RESOURCE_GROUP_NAME
    ResourceName = $ACCOUNT_NAME
    LockName = $LOCK_NAME
    ApiVersion = "2020-04-01"
    ResourceType = "Microsoft.DocumentDB/databaseAccounts"
    LockLevel = "CanNotDelete"
}
New-AzResourceLock @parameters

模板

将锁应用到 Azure Cosmos DB 资源时,请使用 Microsoft.Authorization/locks Azure 资源管理器 (ARM) 资源。

{
  "type": "Microsoft.Authorization/locks",
  "apiVersion": "2017-04-01",
  "name": "cosmoslock",
  "dependsOn": [
    "[resourceId('Microsoft.DocumentDB/databaseAccounts', parameters('accountName'))]"
  ],
  "properties": {
    "level": "CanNotDelete",
    "notes": "Do not delete Azure Cosmos DB account."
  },
  "scope": "[resourceId('Microsoft.DocumentDB/databaseAccounts', parameters('accountName'))]"
}

示例

管理 Azure Cosmos DB 的资源锁:

后续步骤