分享方式:


在 Azure Cosmos DB for MongoDB 中設定角色型存取控制

適用於: MongoDB

本文說明 Azure Cosmos DB for MongoDB 中資料平面作業的角色型存取控制。

若使用管理平面作業,請參閱適用於您管理平面作業的角色型存取控制文章。

Azure Cosmos DB for MongoDB 會公開內建的角色型存取控制 (RBAC) 系統,能夠以更精細的角色型權限模型來授權資料要求。 使用者和角色位於資料庫內,並且使用 Azure CLI、Azure PowerShell 或 Azure Resource Manager (ARM) 來管理。

概念

資源

資源是套用存取控制規則的集合或資料庫。

權限

權限是可在特定資源上執行的動作。 例如,「集合 xyz 的讀取存取權」。 權限會指派給特定角色。

角色

角色具有一或多個權限。 角色會指派給使用者 (零個或多個),讓他們能夠執行這些權限中定義的動作。 角色會儲存在單一資料庫中。

診斷記錄稽核

另一個稱為 userId 的數據行已新增至 MongoRequests Azure 入口網站 診斷功能中的數據表。 此資料行會識別哪些使用者執行了什麼資料方案作業。 未啟用 RBAC 時,此資料行中的值會是空的。

可用的權限

查詢和寫入

  • find
  • insert
  • remove
  • 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。
  • RBAC 排除的命令:listCollections、listDatabases、killCursors 和 currentOp。
  • 不支援跨資料庫的使用者和角色。
  • 使用者密碼只能透過 Azure CLI / Azure PowerShell 設定/重設。
  • 只有透過 Azure CLI/PowerShell 才支援設定使用者和角色。
  • 不支援停用主要/次要金鑰驗證。 建議您輪替金鑰,以免在啟用 RBAC 後發生存取。
  • Cosmos DB for Mongo DB RU 的 RBAC 原則不會在還原作業完成後自動恢復。 還原程序完成後,必須重新設定原則。

常見問題集 (FAQ)

是否可以從 Azure 入口網站管理角色定義和角色指派?

未提供 Azure 入口網站的角色管理支援。 不過,RBAC 可以透過Azure 入口網站的 [功能] 索引標籤啟用。

我如何變更使用者的密碼?

使用新的密碼更新使用者定義。

哪些 Cosmos DB for MongoDB 版本支援角色型存取控制 (RBAC)?

3\.6 版和更新版本支援 RBAC。

下一步