你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

在 Azure Cosmos DB for MongoDB 中配置基于角色的访问控制

适用对象: MongoDB

本文介绍 Azure Cosmos DB for MongoDB 中对数据平面操作的基于角色的访问控制。

如果使用管理平面操作,请参阅适用于管理平面操作的基于角色的访问控制一文。

Azure Cosmos DB for MongoDB 公开了一个内置的基于角色的访问控制 (RBAC) 系统,通过该系统,你可以使用细粒度的、基于角色的权限模型来授权数据请求。 用户和角色驻留在数据库中,并使用 Azure CLI、Azure PowerShell 或 Azure 资源管理器 (ARM) 进行管理。

概念

资源

资源是要向其应用访问控制规则的集合或数据库。

权限

权限是可对特定资源执行的操作。 例如,“对集合 xyz 的读取访问权限”。 权限分配给特定角色。

角色

一个角色具有一个或多个权限。 向用户分配角色(零个或多个),使其能够执行在这些权限中定义的操作。 角色存储在单个数据库中。

诊断日志审核

Azure 门户诊断功能的 MongoRequests 表中添加了另一个名为 userId 的列。 此列标识哪些用户执行了哪些数据计划操作。 如果未启用 RBAC,此列中的值为空。

可用权限

查询和写入

  • find
  • insert
  • 删除
  • update

更改流

  • changeStream

数据库管理

  • createCollection
  • createIndex
  • dropCollection
  • killCursors
  • killAnyCursor

服务器管理

  • dropDatabase
  • dropIndex
  • reIndex

诊断

  • collStats
  • dbStats
  • listDatabases
  • listCollections
  • listIndexes

内置角色

这些角色已存在于每个数据库上,无需创建。

read readWrite dbAdmin dbOwner
changeStream ✅ 是 ✅ 是 ✅ 是 ✅ 是
collStats ✅ 是 ✅ 是 ✅ 是 ✅ 是
listCollections ✅ 是 ✅ 是 ✅ 是 ✅ 是
listIndexes ✅ 是 ✅ 是 ✅ 是 ✅ 是
createCollection ✖️ 否 ✅ 是 ✅ 是 ✅ 是
createIndex ✖️ 否 ✅ 是 ✅ 是 ✅ 是
dropCollection ✖️ 否 ✅ 是 ✅ 是 ✅ 是
dbStats ✖️ 否 ✖️ 否 ✅ 是 ✅ 是
dropDatabase ✖️ 否 ✖️ 否 ✅ 是 ✅ 是
reIndex ✖️ 否 ✖️ 否 ✅ 是 ✅ 是
find ✅ 是 ✅ 是 ✖️ 否 ✅ 是
killCursors ✅ 是 ✅ 是 ✖️ 否 ✅ 是
dropIndex ✖️ 否 ✅ 是 ✅ 是 ✅ 是
insert ✖️ 否 ✅ 是 ✖️ 否 ✅ 是
remove ✖️ 否 ✅ 是 ✖️ 否 ✅ 是
update ✖️ 否 ✅ 是 ✖️ 否 ✅ 是

Azure CLI 设置(快速入门)

建议在使用 Windows 时使用 cmd。

  1. 请确保已在本地安装最新的 CLI 版本(而不是扩展)。 尝试 az upgrade 命令。
  2. 连接到订阅
az cloud set -n  AzureCloud
az login
az account set --subscription <your subscription ID>
  1. 在现有的适用于 MongoDB 数据库帐户的 API 上启用 RBAC 功能。 需要将功能“EnableMongoRoleBasedAccessControl”添加到数据库帐户。 也可以通过 Azure 门户中的“功能”选项卡启用 RBAC。 如果首选新数据库帐户,请创建将 RBAC 功能设置为 true 的新数据库帐户。
az cosmosdb create -n <account_name> -g <azure_resource_group> --kind MongoDB --capabilities EnableMongoRoleBasedAccessControl
  1. 创建一个可供用户在 Azure 门户中连接到的数据库。
  2. 创建具有内置读取角色的 RBAC 用户。
az cosmosdb mongodb user definition create --account-name <YOUR_DB_ACCOUNT> --resource-group <YOUR_RG> --body {\"Id\":\"<YOUR_DB_NAME>.<YOUR_USERNAME>\",\"UserName\":\"<YOUR_USERNAME>\",\"Password\":\"<YOUR_PASSWORD>\",\"DatabaseName\":\"<YOUR_DB_NAME>\",\"CustomData\":\"Some_Random_Info\",\"Mechanisms\":\"SCRAM-SHA-256\",\"Roles\":[{\"Role\":\"read\",\"Db\":\"<YOUR_DB_NAME>\"}]}

使用 pymongo 进行身份验证

from pymongo import MongoClient
client = MongoClient("mongodb://<YOUR_HOSTNAME>:10255/?ssl=true&replicaSet=globaldb&retrywrites=false&maxIdleTimeMS=120000", username="<YOUR_USER>", password="<YOUR_PASSWORD>", authSource='<YOUR_DATABASE>', authMechanism='SCRAM-SHA-256', appName="<YOUR appName FROM CONNECTION STRING IN AZURE PORTAL>")

使用 Node.js 驱动程序进行身份验证

connectionString = "mongodb://" + "<YOUR_USER>" + ":" + "<YOUR_PASSWORD>" + "@" + "<YOUR_HOSTNAME>" + ":10255/" + "<YOUR_DATABASE>" +"?ssl=true&retrywrites=false&replicaSet=globaldb&authmechanism=SCRAM-SHA-256&appname=@" + "<YOUR appName FROM CONNECTION STRING IN AZURE PORTAL>" + "@";
var client = await mongodb.MongoClient.connect(connectionString, { useNewUrlParser: true, useUnifiedTopology: true });

使用 Java 驱动程序进行身份验证

connectionString = "mongodb://" + "<YOUR_USER>" + ":" + "<YOUR_PASSWORD>" + "@" + "<YOUR_HOSTNAME>" + ":10255/" + "<YOUR_DATABASE>" +"?ssl=true&retrywrites=false&replicaSet=globaldb&authmechanism=SCRAM-SHA-256&appname=@" + "<YOUR appName FROM CONNECTION STRING IN AZURE PORTAL>" + "@";
MongoClientURI uri = new MongoClientURI(connectionString);
MongoClient client = new MongoClient(uri);

使用 Mongosh 进行身份验证

mongosh --authenticationDatabase <YOUR_DB> --authenticationMechanism SCRAM-SHA-256 "mongodb://<YOUR_USERNAME>:<YOUR_PASSWORD>@<YOUR_HOST>:10255/?ssl=true&replicaSet=globaldb&retrywrites=false&maxIdleTimeMS=120000"

使用 MongoDB Compass/Azure Data Studio 进行身份验证

connectionString = "mongodb://" + "<YOUR_USER>" + ":" + "<YOUR_PASSWORD>" + "@" + "<YOUR_HOSTNAME>" + ":10255/" + "?ssl=true&retrywrites=false&replicaSet=globaldb&authmechanism=SCRAM-SHA-256&appname=@" + "<YOUR appName FROM CONNECTION STRING IN AZURE PORTAL>" + "@"
+"&authSource=" +"<YOUR_DATABASE>";

Azure CLI RBAC 命令

RBAC 管理命令仅适用于已安装的较新版本的 Azure CLI。 请参阅上面的快速入门,了解如何开始操作。

创建角色定义

az cosmosdb mongodb role definition create --account-name <account-name> --resource-group <resource-group-name> --body {\"Id\":\"test.My_Read_Only_Role101\",\"RoleName\":\"My_Read_Only_Role101\",\"Type\":\"CustomRole\",\"DatabaseName\":\"test\",\"Privileges\":[{\"Resource\":{\"Db\":\"test\",\"Collection\":\"test\"},\"Actions\":[\"insert\",\"find\"]}],\"Roles\":[]}

通过传递 JSON 文件正文创建角色

az cosmosdb mongodb role definition create --account-name <account-name> --resource-group <resource-group-name> --body role.json
JSON 文件
{
	"Id": "test.My_Read_Only_Role101",
	"RoleName": "My_Read_Only_Role101",
	"Type": "CustomRole",
	"DatabaseName": "test",
	"Privileges": [{
		"Resource": {
			"Db": "test",
			"Collection": "test"
		},
		"Actions": ["insert", "find"]
	}],
	"Roles": []
}

更新角色定义

az cosmosdb mongodb role definition update --account-name <account-name> --resource-group <resource-group-name> --body {\"Id\":\"test.My_Read_Only_Role101\",\"RoleName\":\"My_Read_Only_Role101\",\"Type\":\"CustomRole\",\"DatabaseName\":\"test\",\"Privileges\":[{\"Resource\":{\"Db\":\"test\",\"Collection\":\"test\"},\"Actions\":[\"insert\",\"find\"]}],\"Roles\":[]}

通过传递 JSON 文件正文更新角色

az cosmosdb mongodb role definition update --account-name <account-name> --resource-group <resource-group-name> --body role.json
JSON 文件
{
	"Id": "test.My_Read_Only_Role101",
	"RoleName": "My_Read_Only_Role101",
	"Type": "CustomRole",
	"DatabaseName": "test",
	"Privileges": [{
		"Resource": {
			"Db": "test",
			"Collection": "test"
		},
		"Actions": ["insert", "find"]
	}],
	"Roles": []
}

列出角色

az cosmosdb mongodb role definition list --account-name <account-name> --resource-group <resource-group-name>

检查角色是否存在

az cosmosdb mongodb role definition exists --account-name <account-name> --resource-group <resource-group-name> --id test.My_Read_Only_Role

删除角色

az cosmosdb mongodb role definition delete --account-name <account-name> --resource-group <resource-group-name> --id test.My_Read_Only_Role

创建用户定义

az cosmosdb mongodb user definition create --account-name <account-name> --resource-group <resource-group-name> --body {\"Id\":\"test.myName\",\"UserName\":\"myName\",\"Password\":\"pass\",\"DatabaseName\":\"test\",\"CustomData\":\"Some_Random_Info\",\"Mechanisms\":\"SCRAM-SHA-256\",\"Roles\":[{\"Role\":\"My_Read_Only_Role101\",\"Db\":\"test\"}]}

通过传递 JSON 文件正文创建用户

az cosmosdb mongodb user definition create --account-name <account-name> --resource-group <resource-group-name> --body user.json
JSON 文件
{
	"Id": "test.myName",
	"UserName": "myName",
	"Password": "pass",
	"DatabaseName": "test",
	"CustomData": "Some_Random_Info",
	"Mechanisms": "SCRAM-SHA-256",
	"Roles": [{
		"Role": "My_Read_Only_Role101",
		"Db": "test"
	}]
}

更新用户定义

若要更新用户的密码,请在密码字段中发送新密码。

az cosmosdb mongodb user definition update --account-name <account-name> --resource-group <resource-group-name> --body {\"Id\":\"test.myName\",\"UserName\":\"myName\",\"Password\":\"pass\",\"DatabaseName\":\"test\",\"CustomData\":\"Some_Random_Info\",\"Mechanisms\":\"SCRAM-SHA-256\",\"Roles\":[{\"Role\":\"My_Read_Only_Role101\",\"Db\":\"test\"}]}

通过传递 JSON 文件正文更新用户

az cosmosdb mongodb user definition update --account-name <account-name> --resource-group <resource-group-name> --body user.json
JSON 文件
{
	"Id": "test.myName",
	"UserName": "myName",
	"Password": "pass",
	"DatabaseName": "test",
	"CustomData": "Some_Random_Info",
	"Mechanisms": "SCRAM-SHA-256",
	"Roles": [{
		"Role": "My_Read_Only_Role101",
		"Db": "test"
	}]
}

列出用户

az cosmosdb mongodb user definition list --account-name <account-name> --resource-group <resource-group-name>

检查用户是否存在

az cosmosdb mongodb user definition exists --account-name <account-name> --resource-group <resource-group-name> --id test.myName

删除用户

az cosmosdb mongodb user definition delete --account-name <account-name> --resource-group <resource-group-name> --id test.myName

限制

  • 可以创建的用户和角色数量必须小于 10,000。
  • 命令 listCollections、listDatabases、killCursors 和 currentOp 已从 RBAC 中排除。
  • 不支持跨数据库的用户和角色。
  • 只能通过 Azure CLI/Azure PowerShell 设置/重置用户密码。
  • 仅支持通过 Azure CLI/PowerShell 配置用户和角色。
  • 不支持禁用主/辅助密钥身份验证。 建议轮换密钥,以在启用 RBAC 时阻止访问。
  • Cosmos DB for Mongo DB RU 的 RBAC 策略在还原操作后不会自动恢复。 还原过程完成后,需要重新配置这些策略。

常见问题 (FAQ)

是否可以从 Azure 门户管理角色定义和角色分配?

Azure 门户的角色管理支持不可用。 但是,可以通过 Azure 门户中的“功能”选项卡启用 RBAC。

如何更改用户的密码?

使用新密码更新用户定义。

哪些 Cosmos DB for MongoDB 版本支持基于角色的访问控制 (RBAC)?

3.6 版及更高版本支持 RBAC。

后续步骤