在 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。
- 请确保已在本地安装最新的 CLI 版本(而不是扩展)。 尝试
az upgrade
命令。 - 连接到订阅
az cloud set -n AzureCloud
az login
az account set --subscription <your subscription ID>
- 在现有的适用于 MongoDB 数据库帐户的 API 上启用 RBAC 功能。 需要将功能“EnableMongoRoleBasedAccessControl”添加到数据库帐户。 也可以通过 Azure 门户中的“功能”选项卡启用 RBAC。 如果首选新数据库帐户,请创建将 RBAC 功能设置为 true 的新数据库帐户。
az cosmosdb create -n <account_name> -g <azure_resource_group> --kind MongoDB --capabilities EnableMongoRoleBasedAccessControl
- 创建一个可供用户在 Azure 门户中连接到的数据库。
- 创建具有内置读取角色的 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。
后续步骤
- 详细了解 Azure Cosmos DB 管理的 RBAC。