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への読み取りアクセス"などです。 特権は特定のロールに割り当てられます。

Role

ロールには1つ以上の特権があります。 ロールはユーザー(0個以上)に割り当てられ、それらの特権で定義されているアクションを実行できるようになります。 ロールは1つのデータベース内に格納されます。

診断ログの監査

userId と呼ばれる追加の列が、Azure portal 診断機能の MongoRequests テーブルに追加されました。 この列は、どのユーザーがどのデータプラン操作を実行したかを識別します。 RBACが有効になっていない場合、この列の値は空です。

使用可能な特権

クエリと書き込み

  • 検索
  • insert
  • remove
  • update

ストリームの変更

  • changeStream

データベースの管理

  • createCollection
  • createIndex
  • dropCollection
  • killCursors
  • killAnyCursor

サーバー管理

  • dropDatabase
  • dropIndex
  • reIndex

診断

  • collStats
  • dbStats
  • listDatabases
  • listCollections
  • listIndexes

組み込みの役割

これらのロールは、すべてのデータベースに既に存在するため、作成する必要はありません。

読み取り

changeStream、collStats、find、killCursors、listIndexes、listCollectionsの特権があります

readWrite

collStats、createCollection、dropCollection、createIndex、dropIndex、find、insert、killCursors、listIndexes、listCollections、remove、updateの特権があります

dbAdmin

collStats、createCollection、createIndex、dbStats、dropCollection、dropDatabase、dropIndex、listCollections、listIndexes、reIndexの特権があります

dbOwner

collStats、createCollection、createIndex、dbStats、dropCollection、dropDatabase、dropIndex、listCollections、listIndexes、reIndex、find、insert、killCursors、listIndexes、listCollections、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 portal の [機能] タブを使用して RBAC を有効にすることもできます。 代わりに新しいデータベース アカウントを使用する場合は、RBAC 機能が true に設定された新しいデータベース アカウントを作成します。
az cosmosdb create -n <account_name> -g <azure_resource_group> --kind MongoDB --capabilities EnableMongoRoleBasedAccessControl
  1. ユーザーがAzure portalで接続するためのデータベースを作成します。
  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"

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"
	}]
}

List users

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 を有効にするときにアクセスできないように、キーをローテーションすることをお勧めします。

よく寄せられる質問 (FAQ)

Azure portal からロールの定義とロールの割り当てを管理することはできますか。

ロール管理の Azure portal サポートは利用できません。 ただし、Azure portal の [機能] タブを使用して RBAC を有効にすることはできます。

ユーザーのパスワードを変更する方法

ユーザー定義を新しいパスワードで更新します。

ロールベースのアクセス制御 (RBAC) はどの Cosmos DB for MongoDB バージョンでサポートされていますか?

RBAC はバージョン 3.6 以降でサポートされています。

次の手順