适用范围: NoSQL
本文逐步介绍了授予标识访问权限以管理 Azure Cosmos DB for NoSQL 帐户及其资源的步骤。
重要
本文中的步骤仅涵盖对控制平面的访问,以便对帐户层次结构中任意资源的帐户本身执行操作。 若要了解如何管理项和执行数据平面的查询,请参阅 授予数据平面基于角色的访问权限。
先决条件
- 拥有有效订阅的 Azure 帐户。 免费创建帐户。
- 现有的 Azure Cosmos DB 帐户。
- Microsoft Entra ID 中的一个或多个现有身份。
在 Azure Cloud Shell 中使用 Bash 环境。 有关详细信息,请参阅 Azure Cloud Shell 入门。
如果想要在本地运行 CLI 引用命令, 请安装 Azure CLI。 如果在 Windows 或 macOS 上运行,请考虑在 Docker 容器中运行 Azure CLI。 有关详细信息,请参阅 如何在 Docker 容器中运行 Azure CLI。
如果使用本地安装,请使用 az login 命令登录到 Azure CLI。 若要完成身份验证过程,请遵循终端中显示的步骤。 有关其他登录选项,请参阅 使用 Azure CLI 向 Azure 进行身份验证。
出现提示时,请在首次使用时安装 Azure CLI 扩展。 有关扩展的详细信息,请参阅 使用和管理 Azure CLI 中的扩展。
运行 az 版本 以查找已安装的版本和依赖库。 若要升级到最新版本,请运行 az upgrade。
- 如果选择在本地使用 Azure PowerShell:
- 安装最新版本的 Az PowerShell 模块。
- 使用 Connect-AzAccount cmdlet 连接到 Azure 帐户。
- 如果选择使用 Azure Cloud Shell:
- 有关详细信息 ,请参阅 Azure Cloud Shell 概述 。
准备角色定义
首先,必须准备包含 actions
列表的角色定义,以授予在 Azure Cosmos DB 中管理帐户资源的权限。
使用 az role definition list
列出与 Azure Cosmos DB 帐户关联的所有角色定义。 查看输出并找到名为 Cosmos DB 运算符的角色定义。 输出包含属性中 id
角色定义的唯一标识符。 记下此值,因为本指南后面的工作分配步骤需要使用此值。
az role definition list \
--name "Cosmos DB Operator"
[
{
"assignableScopes": [
"/"
],
"description": "Lets you manage Azure Cosmos DB accounts, but not access data in them. Prevents access to account keys and connection strings.",
"id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/providers/Microsoft.Authorization/roleDefinitions/230815da-be43-4aae-9cb4-875f7bd000aa",
"name": "230815da-be43-4aae-9cb4-875f7bd000aa",
"permissions": [
{
"actions": [
"Microsoft.DocumentDb/databaseAccounts/*",
"Microsoft.Insights/alertRules/*",
"Microsoft.Authorization/*/read",
"Microsoft.ResourceHealth/availabilityStatuses/read",
"Microsoft.Resources/deployments/*",
"Microsoft.Resources/subscriptions/resourceGroups/read",
"Microsoft.Support/*",
"Microsoft.Network/virtualNetworks/subnets/joinViaServiceEndpoint/action"
],
"condition": null,
"conditionVersion": null,
"dataActions": [],
"notActions": [
"Microsoft.DocumentDB/databaseAccounts/dataTransferJobs/*",
"Microsoft.DocumentDB/databaseAccounts/readonlyKeys/*",
"Microsoft.DocumentDB/databaseAccounts/regenerateKey/*",
"Microsoft.DocumentDB/databaseAccounts/listKeys/*",
"Microsoft.DocumentDB/databaseAccounts/listConnectionStrings/*",
"Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions/write",
"Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions/delete",
"Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments/write",
"Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments/delete",
"Microsoft.DocumentDB/databaseAccounts/mongodbRoleDefinitions/write",
"Microsoft.DocumentDB/databaseAccounts/mongodbRoleDefinitions/delete",
"Microsoft.DocumentDB/databaseAccounts/mongodbUserDefinitions/write",
"Microsoft.DocumentDB/databaseAccounts/mongodbUserDefinitions/delete"
],
"notDataActions": []
}
],
"roleName": "Cosmos DB Operator",
"roleType": "BuiltInRole",
"type": "Microsoft.Authorization/roleDefinitions",
}
]
注释
在此示例中,id
值将为 /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/providers/Microsoft.Authorization/roleDefinitions/230815da-be43-4aae-9cb4-875f7bd000aa
。 此示例使用虚构数据,而你的标识符与此示例不同。 但是,标识符 (230815da-be43-4aae-9cb4-875f7bd000aa
) 在 Azure 中的所有角色定义中都是全局唯一的。
登录到 Azure 门户 (https://portal.azure.com)。
在全局搜索栏中输入资源组。
在“服务”中,选择“资源组”。
在“资源组”窗格,请选择现有资源组。
注释
此示例屏幕截图包括
msdocs-identity-example
资源组。 实际的资源组名称可能有所不同。在资源组的窗格中,在服务菜单中选择“访问控制 (IAM)”。
在“访问控制 (IAM)”窗格中,选择“角色”。
在“角色”部分中,使用 Cosmos DB 搜索短语,找到 Cosmos DB 操作员角色定义。 然后,选择与该定义关联的“视图”选项。
在 Cosmos DB 运维器角色定义对话框中,查看作为此角色定义一部分分配的操作。
关闭 Cosmos DB 操作员角色定义对话框。
使用 Get-AzRoleDefinition
列出与 Azure Cosmos DB 帐户关联的所有角色定义。 查看输出并找到名为 Cosmos DB 内置数据参与者的角色定义。 输出包含属性中 Id
角色定义的唯一标识符。 记下此值,因为本指南后面的工作分配步骤需要使用此值。
$parameters = @{
Name = "Cosmos DB Operator"
}
Get-AzRoleDefinition @parameters
Name : Cosmos DB Operator
Id : 230815da-be43-4aae-9cb4-875f7bd000aa
IsCustom : False
Description : Lets you manage Azure Cosmos DB accounts, but not access data in them. Prevents access to account keys and connection strings.
Actions : {Microsoft.DocumentDb/databaseAccounts/*, Microsoft.Insights/alertRules/*, Microsoft.Authorization/*/read, Microsoft.ResourceHealth/availabilityStatuses/read…}
NotActions : {Microsoft.DocumentDB/databaseAccounts/dataTransferJobs/*, Microsoft.DocumentDB/databaseAccounts/readonlyKeys/*, Microsoft.DocumentDB/databaseAccounts/regenerateKey/*, Microsoft.DocumentDB/databaseAccounts/listKeys/*…}
DataActions : {}
NotDataActions : {}
AssignableScopes : {/}
注释
在此示例中,Id
值将为 230815da-be43-4aae-9cb4-875f7bd000aa
。 标识符在 Azure 中的所有角色定义中都是全局唯一的。
将角色分配给身份
现在,将新定义的角色分配给标识,以便应用程序可以访问 Azure Cosmos DB 中的资源。
重要
此分配任务要求你已拥有要授予基于角色的访问控制权限的身份的唯一标识符。
使用
az group show
重新获取当前资源组的元数据。az group show \ --name "<name-of-existing-resource-group>"
观察上一命令的输出。 记录此资源组的
id
属性的值,因为下一步需要使用此属性。{ "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example", "location": "westus", "name": "msdocs-identity-example", "type": "Microsoft.Resources/resourceGroups" }
注释
在此示例中,
id
值将为/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example
。 此示例使用虚构数据,而你的标识符与此示例不同。 这是截断的输出示例。使用
az role assignment create
分配新角色。 使用资源组的标识符作为--scope
参数,使用角色的标识符作为-role
参数,使用您身份的唯一标识符作为--assignee
参数。az role assignment create \ --assignee "<your-principal-identifier>" \ --role "subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example/providers/Microsoft.Authorization/roleDefinitions/ffffffff-eeee-dddd-cccc-bbbbbbbbbbb0" \ --scope "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example"
注释
在此示例命令中,已将
scope
设置为上一步示例中的虚构示例/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example
。 资源组的标识符与此示例不同。role
也设置为虚构的/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example/providers/Microsoft.Authorization/roleDefinitions/ffffffff-eeee-dddd-cccc-bbbbbbbbbbb0
。 同样,角色标识符将不同。观察 命令的输出。 输出包括
id
属性中分配的唯一标识符。{ "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example/providers/Microsoft.Authorization/roleAssignments/ffffffff-eeee-dddd-cccc-bbbbbbbbbbb0", "name": "ffffffff-5555-6666-7777-aaaaaaaaaaaa", "principalId": "aaaaaaaa-bbbb-cccc-1111-222222222222", "resourceGroup": "msdocs-identity-example", "roleDefinitionId": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example/providers/Microsoft.Authorization/roleDefinitions/ffffffff-eeee-dddd-cccc-bbbbbbbbbbb0", "scope": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example", "type": "Microsoft.Authorization/roleAssignments" }
注释
在此示例中,
id
属性为/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example/providers/Microsoft.Authorization/roleAssignments/ffffffff-eeee-dddd-cccc-bbbbbbbbbbb0
,这是另一个虚构的示例。重复这些步骤,从要使用的任何其他标识授予对帐户的访问权限。
小窍门
你可以为任意数量的身份重复这些步骤。 通常,这些步骤至少重复一次,以允许开发人员使用人工标识访问帐户,并允许应用程序使用托管标识进行访问。
创建新的 Bicep 文件以定义角色分配。 将文件命名为 control-plane-role-assignment.bicep。
metadata description = 'Assign RBAC role for control plane access to Azure Cosmos DB.' @description('Id of the role definition to assign to the targeted principal in the context of the account.') param roleDefinitionId string @description('Id of the identity/principal to assign this role in the context of the account.') param identityId string resource assignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = { name: guid(subscription().id, resourceGroup().id, roleDefinitionId, identityId) scope: resourceGroup() properties: { roleDefinitionId: roleDefinitionId principalId: identityId } }
创建名为 control-plane-role-assignment.
bicepparam
的新 Bicep 参数文件。 在此参数文件中;将以前记录的角色定义标识符分配给roleDefinitionId
参数,将身份的唯一标识符分配给identityId
参数。using './control-plane-role-assignment.bicep' param roleDefinitionId = '<id-of-new-role-definition>' param identityId = '<id-of-existing-identity>'
使用
az deployment group create
部署此 Bicep 模板。az deployment group create \ --resource-group "<name-of-existing-resource-group>" \ --parameters control-plane-role-assignment.bicepparam \ --template-file control-plane-role-assignment.bicep
重复这些步骤,从要使用的任何其他标识授予对帐户的访问权限。
小窍门
你可以为任意数量的身份重复这些步骤。 通常,这些步骤至少重复一次,以允许开发人员使用人工标识访问帐户,并允许应用程序使用托管标识进行访问。
在“访问控制 (IAM)”窗格中,选择“添加”,然后“添加角色分配”。
在“角色”窗格中,搜索
Azure Cosmos DB
,然后选择本指南前面创建的 Azure Cosmos DB 控制平面所有者角色。 然后选择“ 下一步”。小窍门
可以选择筛选角色列表,以仅包含自定义角色。
在“成员”窗格中,选择“选择成员”选项。 在成员对话框中,选择要为 Azure Cosmos DB 帐户授予此级别访问权限的标识,然后使用“选择”选项来确认选择。
注释
此屏幕截图演示了一个名为“Kai Carter”和主体为
kai@adventure-works.com
的示例用户。返回“成员”窗格中,查看所选成员,然后选择“审阅 + 分配”。
在“审阅 + 分配”窗格中,查看新角色分配的指定选项。 最后,选择“查看 + 分配”。
等待门户完成角色分配的创建。
使用
New-AzRoleAssignment
分配新角色。 使用角色名称作为RoleDefinitionName
参数,并将身份的唯一标识符用作ObjectId
参数。$parameters = @{ ResourceGroupName = "<name-of-existing-resource-group>" ObjectId = "<your-principal-identifier>" RoleDefinitionName = "Azure Cosmos DB Control Plane Owner" } New-AzRoleAssignment @parameters
观察 命令的输出。 输出包括
RoleAssignmentId
属性中分配的唯一标识符。RoleAssignmentName : ffffffff-5555-6666-7777-aaaaaaaaaaaa RoleAssignmentId : /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example/providers/Microsoft.Authorization/roleAssignments/ffffffff-eeee-dddd-cccc-bbbbbbbbbbb0 Scope : /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example DisplayName : Kai Carter SignInName : <kai@adventure-works.com> RoleDefinitionName : Azure Cosmos DB Control Plane Owner RoleDefinitionId : e4e4e4e4-ffff-aaaa-bbbb-c5c5c5c5c5c5
注释
在此示例中,
RoleAssignmentId
属性为/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example/providers/Microsoft.Authorization/roleAssignments/ffffffff-eeee-dddd-cccc-bbbbbbbbbbb0
,这是另一个虚构的示例。 为便于理解,这是通常部署输出的一部分子集。重复这些步骤,从要使用的任何其他标识授予对帐户的访问权限。
小窍门
你可以为任意数量的身份重复这些步骤。 通常,这些步骤至少重复一次,以允许开发人员使用人工标识访问帐户,并允许应用程序使用托管标识进行访问。
在代码中验证控制平面访问
最后,使用首选编程语言使用应用程序代码和 Azure 管理 SDK 验证是否已正确授予访问权限。
using Azure.Identity;
using Azure.ResourceManager;
DefaultAzureCredential credential = new();
ArmClient client = new(credential);
重要
此代码示例使用 NuGet 中的 Azure.ResourceManager.CosmosDB
和 Azure.Identity
库。