Microsoft Entra ID を使ってアカウント リソースにアクセスする
Azure Cosmos DB では、以下を実行できる組み込みのロールベースのアクセス制御 (RBAC) システムを公開しています。
- Microsoft Entra ID を使ってデータ要求を認証します。
- きめ細かいロールベースのアクセス許可モデルを使用してデータ要求を認可します。
これらのロールを設定するために、アクセス許可モデル、ロールの定義、ロールの割り当てに関する RBAC の概念について詳しく見ていきます。 Azure portal でのロール管理のサポートはまだ利用できません。
アクセス許可モデル
アクセス許可モデルは、データベースに対するデータの読み取りおよび書き込み操作を対象とします。 データベース、コンテナー、スループット、ストアド プロシージャ、トリガー、ユーザー定義関数の作成、置換、削除などの管理リソース操作は対象になっていません。
アクセス許可モデルでは、次のアクションを許可または拒否できます。
| Name | 対応するデータベース操作 |
|---|---|
Microsoft.DocumentDB/databaseAccounts/readMetadata |
アカウント メタデータの読み取り。 詳細については、「メタデータ要求」を参照してください。 |
Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/items/create |
新しい項目を作成します。 |
Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/items/read |
各項目をその ID とパーティション キーによって読み取ります (ポイント読み取り)。 |
Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/items/replace |
既存のアイテムの置換。 |
Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/items/upsert |
アイテムを "アップサート" します。つまり、アイテムが存在しない場合は作成し、存在する場合は置き換えます。 |
Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/items/delete |
アイテムの削除。 |
Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/executeQuery |
SQL クエリを実行します。 |
Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/readChangeFeed |
コンテナーの変更フィードから読み取ります。 |
Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/executeStoredProcedure |
ストアド プロシージャを実行する。 |
Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/manageConflicts |
マルチリージョン書き込みアカウントの競合を管理します (つまり、競合フィードでアイテムの一覧表示と削除を行います)。 |
コンテナー レベルと項目レベルの両方でワイルドカードもサポートされています。
Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/*Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/items/*
メタデータ要求
メタデータ要求では、Azure Cosmos DB アカウント内に保存されているデータは返されません。 メタデータ要求は、初期化中に読み取り専用の要求として SDK によって発行され、特定のデータ要求を処理します。 これらを使用して、コンテナーのパーティション キー、アカウントが存在するリージョン、コンテナーのパーティションの一覧などの情報を取得できます。
メタデータ要求は、次のアクションによって処理されます。
Microsoft.DocumentDB/databaseAccounts/readMetadata
これらは、アカウント、データベース、またはコンテナー スコープで割り当てることができます。 許可されるアクションは次のとおりです。
| スコープ | アクションによって許可された要求 |
|---|---|
| アカウント | - アカウントの下にデータベースを一覧表示する - アカウントの各データベースについて、データベース スコープで許可されるアクション |
| データベース | - データベース メタデータを読み取る - データベースの下にコンテナーを一覧表示する - データベースの各コンテナーについて、コンテナー スコープで許可されるアクション |
| コンテナー | - コンテナー メタデータを読み取る - コンテナーの下に物理パーティションを一覧表示する - 各物理パーティションのアドレスを解決する |
ロールの定義
ロール定義には、許可されるアクションの一覧が含まれています。 Azure Cosmos DB では、組み込みまたはカスタムのロールの定義を使用できます。 これらの定義をさらに確認してみましょう。
組み込みのロールの定義
Azure Cosmos DB では、次の 2 つの組み込みのロールの定義が公開されています。
| ID | Name | 含まれるアクション |
|---|---|---|
| 00000000-0000-0000-0000-000000000001 | Cosmos DB 組み込みデータ リーダー | - Microsoft.DocumentDB/databaseAccounts/readMetadata - Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/items/read - Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/executeQuery - Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/readChangeFeed |
| 00000000-0000-0000-0000-000000000002 | Cosmos DB 組み込みデータ共同作成者 | - Microsoft.DocumentDB/databaseAccounts/readMetadata - Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/* - Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/items/* |
カスタム ロールの定義
カスタムのロールの定義は、Azure PowerShell、Azure CLI、または Azure Resource Manager テンプレートを使用して定義できます。 カスタム ロールの定義を作成するときは、次の情報を指定する必要があります。
- Azure Cosmos DB アカウントの名前。
- アカウントを含むリソース グループ。
- ロールの定義の種類:
CustomRole。 - ロールの定義名。
- ロールで許可するアクションの一覧。
- ロール定義を割り当てることができる 1 つまたは複数のスコープ。サポートされているスコープは次のとおりです。
-
/(アカウントレベル)、 -
/dbs/<database-name>(データベースレベル)、 -
/dbs/<database-name>/colls/<container-name>(コンテナーレベル)。
-
ロールの割り当て
データ プレーンのロール ベースのアクセス制御を定義する最後のコンポーネントは、ロールの割り当てです。 ロール定義は、ロールの割り当てを通じて特定の Microsoft Entra ID に割り当てられます。 この割り当てにより、ロールの定義が適用されるスコープ (アカウント、データベース、またはコンテナー) も定義されます。 ロールの割り当ては、Azure PowerShell、Azure CLI、または Azure Resource Manager テンプレートを使用して定義できます。 ロールの割り当てを作成するときは、次の情報を指定する必要があります。
Azure Cosmos DB アカウントの名前。
アカウントを含むリソース グループ。
割り当てるロール定義の ID。
ロールの定義を割り当てる必要があるアカウントのプリンシパル ID。
ロールの割り当てのスコープ。サポートされるスコープは次のとおりです。
-
/(アカウントレベル) -
/dbs/<database-name>(データベースレベル) -
/dbs/<database-name>/colls/<container-name>(コンテナーレベル)
スコープは、ロールの定義の割り当て可能なスコープの 1 つと一致するか、そのサブスコープである必要があります。
-
Microsoft Entra ID を使用して SDK を初期化する
Azure Cosmos DB RBAC を使用するにあたって主キーを渡す必要がなくなりました。
TokenCredential クラスのインスタンスを渡します。 このインスタンスでは、Azure Cosmos DB SDK に、使用する ID に必要な Microsoft Entra トークンをフェッチするためのコンテキストが提供されます。
TokenCredential インスタンスは、ロールを割り当てた ID (プリンシパル ID) に解決される必要があります。 この例では、サービス プリンシパルを ClientSecretCredential インスタンスで使用しています。
TokenCredential servicePrincipal = new ClientSecretCredential(
"<azure-ad-tenant-id>",
"<client-application-id>",
"<client-application-secret>");
CosmosClient client = new CosmosClient("<account-endpoint>", servicePrincipal);
データ エクスプローラーを使用する
Azure Cosmos DB ペインのデータ エクスプローラーでは、Azure Cosmos DB RBAC はまだサポートされていません。 データを探索するときに Microsoft Entra ID を使用するには、代わりに Azure Cosmos DB Explorer を使用する必要があります。 RBAC を使用してサインインできるようにするには、Azure Cosmos DB エクスプローラーでプロパティ ?feature.enableAadDataPlane=true を有効にしてください。
監査データの要求
Azure Cosmos DB の RBAC を使用する場合、診断ログで各データ操作の ID と承認情報が取得されます。 この情報を使用すると、対象の Azure Cosmos DB アカウントに送信されたすべての要求の Microsoft Entra ID を取得できます。
ID および承認データも DataPlaneRequest ログに追加されます。 ここで、Microsoft Entra ID のプリンシパル ID と使用されているロールの割り当てに対して、列 aadPrincipalId_g と aadAppliedRoleAssignmentId_g がそれぞれ表示されるはずです。
唯一の認証方法としての RBAC の適用
RBAC を使用するにあたって RBAC を排他的に使用する場合は、Azure Cosmos DB アカウントの主キーとセカンダリ キーを無効にできます。 アカウントを無効にするには、Azure Resource Manager テンプレートを使用して Azure Cosmos DB アカウントを作成または更新するときに、disableLocalAuth を true に設定します。
制限
- Azure Cosmos DB アカウントごとに、最大 100 のロール定義と 2,000 のロール割り当てを作成できます。
- ロール定義は、Azure Cosmos DB アカウントと同じ Microsoft Entra テナントに属する Microsoft Entra ID にのみ割り当てることができます。
- 現在、Microsoft Entra グループの解決は、200 を超えるグループに属する ID ではサポートされていません。
- 現在、Microsoft Entra トークンはヘッダーとして渡され、個々の要求が Azure Cosmos DB サービスに送信され、全体的なペイロード サイズが大きくなります。