ロールベースのアクセス制御とは、Azure 内のリソースへのアクセスを管理する方法を指します。 この方法は、1 つ以上のリソースに対して必要なアクセス レベルを管理するロールが割り当てられている特定の ID に基づいています。 ロールベースのアクセス制御は、きめ細かいアクセス管理の柔軟なシステムを提供します。これにより、ID がタスクの実行に必要な最小限の特権レベルのアクセス権のみを持つことが保証されます。
詳細については、 ロールベースのアクセス制御に関するページを参照してください。
[前提条件]
アクティブなサブスクリプションを持つ Azure アカウント。 無料でアカウントを作成できます。
既存の Azure Cosmos DB for NoSQL アカウント。
Microsoft Entra ID の 1 つ以上の既存の ID。
Azure Cloud Shell で Bash 環境を使用します。 詳細については、「Azure Cloud Shell の概要」を参照してください。
CLI 参照コマンドをローカルで実行する場合は、Azure CLI を インストール します。 Windows または macOS で実行している場合は、Docker コンテナーで Azure CLI を実行することを検討してください。 詳細については、「Docker コンテナーで Azure CLI を実行する方法」を参照してください。
ローカル インストールを使用する場合は、az login コマンドを使用して Azure CLI にサインインします。 認証プロセスを完了するには、ターミナルに表示される手順に従います。 その他のサインイン オプションについては、「 Azure CLI を使用した Azure への認証」を参照してください。
初回使用時にインストールを求められたら、Azure CLI 拡張機能をインストールします。 拡張機能の詳細については、「Azure CLI で拡張機能を使用および管理する」を参照してください。
az version を実行し、インストールされているバージョンおよび依存ライブラリを検索します。 最新バージョンにアップグレードするには、az upgrade を実行します。
- Azure PowerShell をローカルで使用する場合は、次のようにします。
- Az PowerShell モジュールの最新バージョンをインストールします。
- Connect-AzAccount コマンドレットを使用して、Azure アカウントに接続します。
- Azure Cloud Shell を使用する場合は、次のようにします。
- 詳細については、Azure Cloud Shell の概要に関するページを参照してください。
キーベース認証を無効にする
キーベースの承認を無効にすると、より安全な Microsoft Entra ID 認証方法なしでアカウントが使用されなくなります。 この手順は、セキュリティで保護されたワークロードの新しいアカウントに対して実行する必要がある手順です。 または、セキュリティで保護されたワークロード パターンに移行されている既存のアカウントに対して、この手順を実行します。
まず、アプリケーションで Microsoft Entra ID 認証を使用する必要がないように、既存のアカウントに対するキーベースの認証を無効にします。
az resource updateを使用して、既存のアカウントのproperties.disableLocalAuthを変更します。
az resource update \
--resource-group "<name-of-existing-resource-group>" \
--name "<name-of-existing-account>" \
--resource-type "Microsoft.DocumentDB/databaseAccounts" \
--set properties.disableLocalAuth=true
まず、キーベースの認証が無効になっている新しいアカウントを作成して、アプリケーションで Microsoft Entra 認証を使用する必要があります。
キーベースの認証を無効にして新しいアカウントをデプロイする新しい Bicep ファイルを作成します。 ファイルに deploy-new-account.bicep という名前を付けます。
metadata description = 'Deploys a new Azure Cosmos DB account with key-based auth disabled.' @description('Name of the Azure Cosmos DB account.') param name string = 'csms-${uniqueString(resourceGroup().id)}' @description('Primary ___location for the Azure Cosmos DB account.') param ___location string = resourceGroup().___location resource account 'Microsoft.DocumentDB/databaseAccounts@2024-05-15' = { name: name ___location: ___location kind: 'GlobalDocumentDB' properties: { databaseAccountOfferType: 'Standard' locations: [ { locationName: ___location } ] disableLocalAuth: true } }az deployment group createを使用して、新しいアカウントで Bicep ファイルをデプロイします。az deployment group create \ --resource-group "<name-of-existing-resource-group>" \ --template-file deploy-new-account.bicep
まず、既存のアカウントに対するキーベースの認証を無効にして、アプリケーションで Microsoft Entra 認証を使用する必要がないようにします。
Get-AzResourceとSet-AzResourceを使用して、それぞれ既存のアカウントの読み取りと更新を行います。
$parameters = @{
ResourceGroupName = "<name-of-existing-resource-group>"
ResourceName = "<name-of-existing-account>"
ResourceType = "Microsoft.DocumentDB/databaseAccounts"
}
$resource = Get-AzResource @parameters
$resource.Properties.DisableLocalAuth = $true
$resource | Set-AzResource -Force
次の手順を使用して、キーベースの認証が無効になっている新しい Azure Cosmos DB for NoSQL アカウントを作成し、アプリケーションで Microsoft Entra 認証のみを使用する必要があります。
新しい Azure Cosmos DB for NoSQL アカウントを設定する場合は、アカウント作成プロセスの [セキュリティ ] セクションに移動します。
次に、[キーベースの認証] オプションで [無効] を選択します。
Important
Azure Cosmos DB アカウントを変更するには、少なくとも Microsoft.DocumentDb/databaseAccounts/*/write アクセス許可を持つ Azure ロールが必要です。 詳細については、 Azure Cosmos DB のアクセス許可に関するページを参照してください。
キーベースの認証が無効になっていることを検証する
キーベースのアクセスが無効になっていることを検証するには、Azure SDK を使用して、リソース所有者パスワード資格情報 (ROPC) を使用して Azure Cosmos DB for NoSQL に接続します。 この試行は失敗します。 必要に応じて、一般的なプログラミング言語のコード サンプルをここに示します。
using Microsoft.Azure.Cosmos;
string connectionString = "AccountEndpoint=<nosql-endpoint>;AccountKey=<key>;";
CosmosClient client = new(connectionString);
const { CosmosClient } = require('@azure/cosmos');
const connectionString = 'AccountEndpoint=<nosql-endpoint>;AccountKey=<key>;';
const client = new CosmosClient(connectionString);
import { CosmosClient } from '@azure/cosmos'
let connectionString: string = 'AccountEndpoint=<nosql-endpoint>;AccountKey=<key>;';
const client: CosmosClient = new CosmosClient(connectionString);
from azure.cosmos import CosmosClient
connection_string = "AccountEndpoint=<nosql-endpoint>;AccountKey=<key>;"
client = CosmosClient(connection_string)
package main
import (
"github.com/Azure/azure-sdk-for-go/sdk/data/azcosmos"
)
const connectionString = "AccountEndpoint=<nosql-endpoint>;AccountKey=<key>;"
func main() {
client, _ := azcosmos.NewClientFromConnectionString(connectionString, nil)
}
import com.azure.cosmos.CosmosClient;
import com.azure.cosmos.CosmosClientBuilder;
public class NoSQL{
public static void main(String[] args){
CosmosClient client = new CosmosClientBuilder()
.endpoint("<nosql-endpoint>")
.key("<key>")
.buildClient();
}
}
use azure_data_cosmos::CosmosClient;
fn main() {
let client = CosmosClient::new_with_access_key(
"<account-endpoint>",
"<account-key>",
None,
).unwrap();
let container = client.database_client("<database-name>").container_client("<container-name>");
let response = container.read_item("<partition-key>", "<item-id>", None);
tokio::runtime::Runtime::new().unwrap().block_on(response).unwrap();
}
コントロール プレーンに対してロールベースのアクセスを付与する
コントロール プレーン アクセスとは、データを管理せずに Azure サービスのリソースを管理する機能を指します。 たとえば、Azure Cosmos DB コントロール プレーンへのアクセスには、次の機能が含まれる場合があります。
- すべてのアカウントとリソースのメタデータを読み取る
- アカウント キーと接続文字列の読み取りと再生成
- アカウントのバックアップと復元を実行する
- データ転送ジョブを開始し、追跡する
- データベースとコンテナーを管理する
- アカウントのプロパティを変更する
Important
Azure Cosmos DB では、ネイティブ データ プレーンロールベースのアクセス制御の定義と割り当てを管理するには、コントロール プレーン アクセスが必要です。 Azure Cosmos DB のデータ プレーンロールベースのアクセス制御メカニズムはネイティブであるため、定義と割り当てを作成し、それらを Azure Cosmos DB アカウント内のリソースとして格納するには、コントロール プレーン アクセスが必要です。
まず、Azure Cosmos DB のアカウント リソースを管理するためのアクセス権を付与するための actions の一覧を含むロール定義を準備する必要があります。 このガイドでは、組み込みロールとカスタム ロールを準備します。 次に、アプリケーションが Azure Cosmos DB のリソースにアクセスできるように、新しく定義されたロールを ID に割り当てます。
az role definition listを使用して、Azure Cosmos DB アカウントに関連付けられているすべてのロール定義を一覧表示します。az role definition list \ --name "Cosmos DB Operator"出力を確認し、 Cosmos DB Operator という名前のロール定義を見つけます。 出力の
idプロパティには、ロールの定義の一意識別子が含まれます。 このガイドの後半の割り当て手順で使用する必要があるため、この値を記録します。[ { "assignableScopes": [ "/" ], "description": "Lets you manage Azure Cosmos DB accounts, but not access data in them. Prevents access to account keys and connection strings.", "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/providers/Microsoft.Authorization/roleDefinitions/230815da-be43-4aae-9cb4-875f7bd000aa", "name": "230815da-be43-4aae-9cb4-875f7bd000aa", "permissions": [ { "actions": [ "Microsoft.DocumentDb/databaseAccounts/*", "Microsoft.Insights/alertRules/*", "Microsoft.Authorization/*/read", "Microsoft.ResourceHealth/availabilityStatuses/read", "Microsoft.Resources/deployments/*", "Microsoft.Resources/subscriptions/resourceGroups/read", "Microsoft.Support/*", "Microsoft.Network/virtualNetworks/subnets/joinViaServiceEndpoint/action" ], "condition": null, "conditionVersion": null, "dataActions": [], "notActions": [ "Microsoft.DocumentDB/databaseAccounts/dataTransferJobs/*", "Microsoft.DocumentDB/databaseAccounts/readonlyKeys/*", "Microsoft.DocumentDB/databaseAccounts/regenerateKey/*", "Microsoft.DocumentDB/databaseAccounts/listKeys/*", "Microsoft.DocumentDB/databaseAccounts/listConnectionStrings/*", "Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions/write", "Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions/delete", "Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments/write", "Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments/delete", "Microsoft.DocumentDB/databaseAccounts/mongodbRoleDefinitions/write", "Microsoft.DocumentDB/databaseAccounts/mongodbRoleDefinitions/delete", "Microsoft.DocumentDB/databaseAccounts/mongodbUserDefinitions/write", "Microsoft.DocumentDB/databaseAccounts/mongodbUserDefinitions/delete" ], "notDataActions": [] } ], "roleName": "Cosmos DB Operator", "roleType": "BuiltInRole", "type": "Microsoft.Authorization/roleDefinitions", } ]注
この例では、
id値が/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/providers/Microsoft.Authorization/roleDefinitions/230815da-be43-4aae-9cb4-875f7bd000aaされます。 この例では架空のデータを使用します。識別子はこの例とは異なります。 ただし、識別子 (230815da-be43-4aae-9cb4-875f7bd000aa) は、Azure のすべてのロール定義でグローバルに一意です。az group showを使用して、現在のリソース グループのメタデータを取得します。az group show \ --name "<name-of-existing-resource-group>"前のコマンドの出力を確認します。 次の手順で使用する必要があるため、このリソース グループの
idプロパティの値を記録します。{ "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example", "___location": "westus", "name": "msdocs-identity-example", "type": "Microsoft.Resources/resourceGroups" }注
この例では、
id値が/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-exampleされます。 この例では架空のデータを使用します。識別子はこの例とは異なります。 この文字列は、出力の省略された例です。role-definition.jsonという名前の新しい JSON ファイル を作成します 。 ファイルで、ここに記載されている値を指定して、このリソース定義を作成します。
AssignableScopesリストに、前の手順で記録したリソース グループのidプロパティを追加します。{ "Name": "Azure Cosmos DB Control Plane Owner", "IsCustom": true, "Description": "Can perform all control plane actions for an Azure Cosmos DB account.", "Actions": [ "Microsoft.DocumentDb/*" ], "AssignableScopes": [ "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example" ] }注
この例では、前の手順で記録した
/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example値を使用します。 実際のリソース識別子は異なる場合があります。az role definition createを使用して新しいロール定義を作成します。 引数の入力として、role-definition.jsonファイルを使用します。az role definition create \ --role-definition role-definition.json定義作成コマンドからの出力を確認します。 出力の
idプロパティには、ロールの定義の一意識別子が含まれます。 このガイドの後半の割り当て手順で使用する必要があるため、この値を記録します。{ "assignableScopes": [ "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example" ], "description": "Can perform all control plane actions for an Azure Cosmos DB account.", "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example/providers/Microsoft.Authorization/roleDefinitions/a0a0a0a0-bbbb-cccc-dddd-e1e1e1e1e1e1", "name": "e4e4e4e4-ffff-aaaa-bbbb-c5c5c5c5c5c5", "permissions": [ { "actions": [ "Microsoft.DocumentDb/*" ] } ], "roleName": "Azure Cosmos DB Control Plane Owner", "roleType": "CustomRole" }注
この例では、
id値が/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example/providers/Microsoft.Authorization/roleDefinitions/a0a0a0a0-bbbb-cccc-dddd-e1e1e1e1e1e1されます。 この例では架空のデータを使用します。識別子はこの例とは異なります。 この例は、わかりやすくするためにデプロイから出力される一般的な JSON のサブセットです。az group showを使用して、現在のリソース グループのメタデータをもう一度取得します。az group show \ --name "<name-of-existing-resource-group>"前のコマンドの出力を確認します。 次の手順で使用する必要があるため、このリソース グループの
idプロパティの値を記録します。{ "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example", "___location": "westus", "name": "msdocs-identity-example", "type": "Microsoft.Resources/resourceGroups" }注
この例では、
id値が/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-exampleされます。 この例では架空のデータを使用します。識別子はこの例とは異なります。 この文字列は、出力の省略された例です。az role assignment createを使用して新しいロールを割り当てます。--scope引数にはリソース グループの識別子、-role引数にはロールの識別子、--assignee引数には ID の一意識別子を使用します。az role assignment create \ --assignee "<your-principal-identifier>" \ --role "subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example/providers/Microsoft.Authorization/roleDefinitions/a0a0a0a0-bbbb-cccc-dddd-e1e1e1e1e1e1" \ --scope "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example"注
このコマンド例では、
scopeは前の手順の例から/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example架空の例に設定されています。 リソース グループの識別子は、この例とは異なります。roleも架空の/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example/providers/Microsoft.Authorization/roleDefinitions/a0a0a0a0-bbbb-cccc-dddd-e1e1e1e1e1e1に設定されました。 ここでも、ロール識別子は異なります。コマンドからの出力を確認します。 出力には、
idプロパティに関する割り当ての一意な識別子が含まれます。{ "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example/providers/Microsoft.Authorization/roleAssignments/a0a0a0a0-bbbb-cccc-dddd-e1e1e1e1e1e1", "name": "ffffffff-5555-6666-7777-aaaaaaaaaaaa", "principalId": "aaaaaaaa-bbbb-cccc-1111-222222222222", "resourceGroup": "msdocs-identity-example", "roleDefinitionId": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example/providers/Microsoft.Authorization/roleDefinitions/a0a0a0a0-bbbb-cccc-dddd-e1e1e1e1e1e1", "scope": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example", "type": "Microsoft.Authorization/roleAssignments" }注
この例では、
idプロパティは/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example/providers/Microsoft.Authorization/roleAssignments/a0a0a0a0-bbbb-cccc-dddd-e1e1e1e1e1e1です。これはもう 1 つの架空の例です。使用する他の ID からアカウントへのアクセスを許可するには、次の手順を繰り返します。
ヒント
必要な数の ID に対して、これらの手順を繰り返すことができます。 通常、これらの手順は少なくとも繰り返され、開発者は自分の人間の ID を使用してアカウントにアクセスでき、アプリケーションはマネージド ID を使用してデータにアクセスできます。
az role definition listを使用して、Azure Cosmos DB アカウントに関連付けられているすべてのロール定義を一覧表示します。az role definition list \ --name "Cosmos DB Operator"出力を確認し、 Cosmos DB Operator という名前のロール定義を見つけます。 出力の
idプロパティには、ロールの定義の一意識別子が含まれます。 このガイドの後半の割り当て手順で使用する必要があるため、この値を記録します。[ { "assignableScopes": [ "/" ], "description": "Lets you manage Azure Cosmos DB accounts, but not access data in them. Prevents access to account keys and connection strings.", "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/providers/Microsoft.Authorization/roleDefinitions/230815da-be43-4aae-9cb4-875f7bd000aa", "name": "230815da-be43-4aae-9cb4-875f7bd000aa", "permissions": [ { "actions": [ "Microsoft.DocumentDb/databaseAccounts/*", "Microsoft.Insights/alertRules/*", "Microsoft.Authorization/*/read", "Microsoft.ResourceHealth/availabilityStatuses/read", "Microsoft.Resources/deployments/*", "Microsoft.Resources/subscriptions/resourceGroups/read", "Microsoft.Support/*", "Microsoft.Network/virtualNetworks/subnets/joinViaServiceEndpoint/action" ], "condition": null, "conditionVersion": null, "dataActions": [], "notActions": [ "Microsoft.DocumentDB/databaseAccounts/dataTransferJobs/*", "Microsoft.DocumentDB/databaseAccounts/readonlyKeys/*", "Microsoft.DocumentDB/databaseAccounts/regenerateKey/*", "Microsoft.DocumentDB/databaseAccounts/listKeys/*", "Microsoft.DocumentDB/databaseAccounts/listConnectionStrings/*", "Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions/write", "Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions/delete", "Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments/write", "Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments/delete", "Microsoft.DocumentDB/databaseAccounts/mongodbRoleDefinitions/write", "Microsoft.DocumentDB/databaseAccounts/mongodbRoleDefinitions/delete", "Microsoft.DocumentDB/databaseAccounts/mongodbUserDefinitions/write", "Microsoft.DocumentDB/databaseAccounts/mongodbUserDefinitions/delete" ], "notDataActions": [] } ], "roleName": "Cosmos DB Operator", "roleType": "BuiltInRole", "type": "Microsoft.Authorization/roleDefinitions", } ]注
この例では、
id値が/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/providers/Microsoft.Authorization/roleDefinitions/230815da-be43-4aae-9cb4-875f7bd000aaされます。 この例では架空のデータを使用します。識別子はこの例とは異なります。 ただし、識別子 (230815da-be43-4aae-9cb4-875f7bd000aa) は、Azure のすべてのロール定義でグローバルに一意です。ロール定義を定義する新しい Bicep ファイルを作成します。 ファイル に control-plane-role-definition.bicep という名前を付けます。 次の
actionsを定義に追加します。Description Microsoft.DocumentDb/*考えられるすべてのアクションを有効にします。 metadata description = 'Create RBAC definition for control plane access to Azure Cosmos DB.' @description('Name of the role definition.') param roleDefinitionName string = 'Azure Cosmos DB Control Plane Owner' @description('Description of the role definition.') param roleDefinitionDescription string = 'Can perform all control plane actions for an Azure Cosmos DB account.' resource definition 'Microsoft.Authorization/roleDefinitions@2022-04-01' = { name: guid(subscription().id, resourceGroup().id, roleDefinitionName) scope: resourceGroup() properties: { roleName: roleDefinitionName description: roleDefinitionDescription type: 'CustomRole' permissions: [ { actions: [ 'Microsoft.DocumentDb/*' ] } ] assignableScopes: [ resourceGroup().id ] } } output definitionId string = definition.idaz deployment group createを使用して Bicep テンプレートをデプロイします。 Bicep テンプレートと Azure リソース グループの名前を指定します。az deployment group create \ --resource-group "<name-of-existing-resource-group>" \ --template-file control-plane-role-definition.bicepデプロイメントからの出力を評価します。 出力の
properties.outputs.definitionId.valueプロパティには、ロールの定義の一意識別子が含まれます。 このガイドの後半の割り当て手順で使用する必要があるため、この値を記録します。{ "properties": { "outputs": { "definitionId": { "type": "String", "value": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example/providers/Microsoft.Authorization/roleDefinitions/a0a0a0a0-bbbb-cccc-dddd-e1e1e1e1e1e1" } } } }注
この例では、
id値が/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example/providers/Microsoft.Authorization/roleDefinitions/a0a0a0a0-bbbb-cccc-dddd-e1e1e1e1e1e1されます。 この例では架空のデータを使用します。識別子はこの例とは異なります。 この例は、わかりやすくするためにデプロイから出力される一般的な JSON のサブセットです。ロールの割り当てを定義する新しい Bicep ファイルを作成します。 ファイル に control-plane-role-assignment.bicep という名前を付けます。
metadata description = 'Assign RBAC role for control plane access to Azure Cosmos DB.' @description('Id of the role definition to assign to the targeted principal in the context of the account.') param roleDefinitionId string @description('Id of the identity/principal to assign this role in the context of the account.') param identityId string resource assignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = { name: guid(subscription().id, resourceGroup().id, roleDefinitionId, identityId) scope: resourceGroup() properties: { roleDefinitionId: roleDefinitionId principalId: identityId } }control-plane-role-assignment.
bicepparamという名前の新しい Bicep パラメーター ファイルを作成します。 このパラメーター ファイルで、先ほどメモしたロールの定義識別子をroleDefinitionIdパラメーターに割り当て、自分の ID の一意識別子をidentityIdパラメーターに割り当てます。using './control-plane-role-assignment.bicep' param roleDefinitionId = '<id-of-new-role-definition>' param identityId = '<id-of-existing-identity>'az deployment group createを使用して、この Bicep テンプレートをデプロイします。az deployment group create \ --resource-group "<name-of-existing-resource-group>" \ --parameters control-plane-role-assignment.bicepparam \ --template-file control-plane-role-assignment.bicep使用する他の ID からアカウントへのアクセスを許可するには、次の手順を繰り返します。
ヒント
必要な数の ID に対して、これらの手順を繰り返すことができます。 通常、これらの手順は少なくとも繰り返され、開発者は自分の人間の ID を使用してアカウントにアクセスでき、アプリケーションはマネージド ID を使用してデータにアクセスできます。
Azure portal (https://portal.azure.com) にサインインします。
グローバル検索バーに 「リソース グループ 」と入力します。
サービス内で、[リソース グループ] を選択します。
[ リソース グループ ] ウィンドウで、既存のリソース グループを選択します。
注
この例のスクリーンショットには、
msdocs-identity-exampleリソース グループが含まれています。 実際のリソース グループ名は異なる場合があります。リソース グループのウィンドウ内で、サービス メニューで [アクセス制御 (IAM)] を選択します。
[アクセス制御 (IAM)] ウィンドウで、[ロール] を選択します。
[ ロール ] セクションで、 検索語句 Cosmos DB を使用し、 Cosmos DB オペレーター ロール定義を見つけます。 次に、その定義に関連付けられている [表示 ] オプションを選択します。
[Cosmos DB オペレーター ロール定義] ダイアログで、このロール定義の一部として割り当てられているアクションを確認します。
Cosmos DB オペレーター ロール定義ダイアログを閉じます。
[アクセス制御 (IAM)] ペインに戻り、[追加] を選択します。 次に、[ カスタム ロールの追加] を選択します。
[ 基本 ] ウィンドウで、次のオプションを構成し、[ 次へ] を選択します。
価値 カスタム ロール名 Azure Cosmos DB Control Plane Owner説明 Can perform all control plane actions for an Azure Cosmos DB account.ベースラインのアクセス許可 最初から行う
[ アクセス許可 ] ウィンドウで、[ アクセス許可の追加] を選択します。 次に、アクセス許可ダイアログで
DocumentDBを検索します。 最後に、 Microsoft.DocumentDB オプションを選択します。
[アクセス許可] ダイアログで、のすべての
Microsoft.DocumentDBを選択します。 次に、[ 追加 ] を選択して [*アクセス許可 ] ウィンドウに戻ります。
[アクセス許可] ウィンドウに戻り、アクセス許可の一覧を確認します。 次に、[ 確認と作成] を選択します。
[ 確認と作成 ] ウィンドウで、新しいロール定義の指定されたオプションを確認します。 最後に、[ 作成] を選択します。
ポータルがロール定義の作成を完了するまで待ちます。
[アクセス制御 (IAM)] ウィンドウで、[追加] を選択し、[ロールの割り当ての追加] を選択します。
[ ロール ] ウィンドウで、
Azure Cosmos DBを検索し、このガイドで先ほど作成した Azure Cosmos DB コントロール プレーン所有者 ロールを選択します。 次に、 [次へ] を選択します。
ヒント
必要に応じて、ロールの一覧をフィルター処理して、カスタム ロールのみを含めることができます。
[ メンバー ] ウィンドウで、[ メンバーの選択 ] オプションを選択します。 [メンバー] ダイアログで、Azure Cosmos DB アカウントに対してこのレベルのアクセス権を付与する ID を選択し、[ 選択 ] オプションを使用して選択を確定します。
注
このスクリーンショットは、のプリンシパルを持つ
kai@adventure-works.comという名前のユーザーの例を示しています。[メンバー] ウィンドウに戻り、選択したメンバーを確認し、[確認と割り当て] を選択します。
[ 確認と割り当て ] ウィンドウで、新しいロールの割り当ての指定されたオプションを確認します。 最後に、[ 確認と割り当て] を選択します。
ポータルがロールの割り当ての作成を完了するまで待ちます。
Get-AzRoleDefinitionを使用して、Azure Cosmos DB アカウントに関連付けられているすべてのロール定義を一覧表示します。$parameters = @{ Name = "Cosmos DB Operator" } Get-AzRoleDefinition @parameters出力を確認し、 Cosmos DB 組み込みデータ共同作成者という名前のロール定義を見つけます。 出力の
Idプロパティには、ロールの定義の一意識別子が含まれます。 このガイドの後半の割り当て手順で使用する必要があるため、この値を記録します。Name : Cosmos DB Operator Id : 230815da-be43-4aae-9cb4-875f7bd000aa IsCustom : False Description : Lets you manage Azure Cosmos DB accounts, but not access data in them. Prevents access to account keys and connection strings. Actions : {Microsoft.DocumentDb/databaseAccounts/*, Microsoft.Insights/alertRules/*, Microsoft.Authorization/*/read, Microsoft.ResourceHealth/availabilityStatuses/read…} NotActions : {Microsoft.DocumentDB/databaseAccounts/dataTransferJobs/*, Microsoft.DocumentDB/databaseAccounts/readonlyKeys/*, Microsoft.DocumentDB/databaseAccounts/regenerateKey/*, Microsoft.DocumentDB/databaseAccounts/listKeys/*…} DataActions : {} NotDataActions : {} AssignableScopes : {/}注
この例では、
Id値が230815da-be43-4aae-9cb4-875f7bd000aaされます。 識別子は、Azure のすべてのロール定義でグローバルに一意です。Get-AzResourceGroupを使用して、現在のリソース グループのメタデータを取得します。$parameters = @{ Name = "<name-of-existing-resource-group>" } Get-AzResourceGroup @parameters前のコマンドの出力を確認します。 次の手順で使用する必要があるため、このリソース グループの
ResourceIdプロパティの値を記録します。ResourceGroupName : msdocs-identity-example Location : westus ProvisioningState : Succeeded ResourceId : /subscriptions/a0a0a0a0-bbbb-cccc-dddd-e1e1e1e1e1e1/resourcegroups/msdocs-identity-example注
この例では、
ResourceId値が/subscriptions/a0a0a0a0-bbbb-cccc-dddd-e1e1e1e1e1e1/resourcegroups/msdocs-identity-exampleされます。 この例では架空のデータを使用します。識別子はこの例とは異なります。 この文字列は、通常の出力を簡略化した例です。まず、
Az.Resourcesモジュールをインポートします。 次に、新しいMicrosoft.Azure.Commands.Resources.Models.Authorization.PSRoleDefinitionオブジェクトを作成します。 オブジェクトで、ここに示されている値を指定して、このリソース定義を作成します。AssignableScopesリストに、前の手順で記録したリソース グループのResourceIdプロパティを追加します。 最後に、ロール定義オブジェクトを、-RoleのNew-AzRoleDefinitionパラメーターの入力として使用します。Import-Module Az.Resources $parameters = @{ TypeName = "Microsoft.Azure.Commands.Resources.Models.Authorization.PSRoleDefinition" Property = @{ Name = "Azure Cosmos DB Control Plane Owner" Description = "Can perform all control plane actions for an Azure Cosmos DB account." IsCustom = $true Actions = @( "Microsoft.DocumentDb/*" ) AssignableScopes = @( "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example" ) } } $role = New-Object @parameters New-AzRoleDefinition -Role $role注
この例では、前の手順で記録した
/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example値を使用します。 実際のリソース識別子は異なる場合があります。定義作成コマンドからの出力を確認します。 出力の
Nameプロパティには、ロールの定義の一意識別子が含まれます。 このガイドの後半の割り当て手順で使用する必要があるため、この値を記録します。Name : Azure Cosmos DB Control Plane Owner Id : e4e4e4e4-ffff-aaaa-bbbb-c5c5c5c5c5c5 IsCustom : True Description : Can perform all control plane actions for an Azure Cosmos DB account. Actions : {Microsoft.DocumentDb/*} AssignableScopes : {/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example}注
この例では、
Name値がAzure Cosmos DB Control Plane Ownerされます。 この例は、わかりやすくするために、デプロイの一般的な出力のサブセットです。New-AzRoleAssignmentを使用して新しいロールを割り当てます。RoleDefinitionNameパラメーターにはロールの名前、ObjectIdパラメーターには ID の一意識別子を使用します。$parameters = @{ ResourceGroupName = "<name-of-existing-resource-group>" ObjectId = "<your-principal-identifier>" RoleDefinitionName = "Azure Cosmos DB Control Plane Owner" } New-AzRoleAssignment @parametersコマンドからの出力を確認します。 出力には、
RoleAssignmentIdプロパティに関する割り当ての一意な識別子が含まれます。RoleAssignmentName : ffffffff-5555-6666-7777-aaaaaaaaaaaa RoleAssignmentId : /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example/providers/Microsoft.Authorization/roleAssignments/a0a0a0a0-bbbb-cccc-dddd-e1e1e1e1e1e1 Scope : /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example DisplayName : Kai Carter SignInName : <kai@adventure-works.com> RoleDefinitionName : Azure Cosmos DB Control Plane Owner RoleDefinitionId : e4e4e4e4-ffff-aaaa-bbbb-c5c5c5c5c5c5注
この例では、
RoleAssignmentIdプロパティは/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example/providers/Microsoft.Authorization/roleAssignments/a0a0a0a0-bbbb-cccc-dddd-e1e1e1e1e1e1です。これはもう 1 つの架空の例です。 この例は、わかりやすくするために、デプロイの一般的な出力のサブセットです。使用する他の ID からアカウントへのアクセスを許可するには、次の手順を繰り返します。
ヒント
必要な数の ID に対して、これらの手順を繰り返すことができます。 通常、これらの手順は少なくとも繰り返され、開発者は自分の人間の ID を使用してアカウントにアクセスでき、アプリケーションはマネージド ID を使用してデータにアクセスできます。
Important
ロール定義を割り当てるには、ロールベースのアクセス制御権限を付与したい ID の一意識別子をすでに取得している必要があります。
コードでコントロール プレーンのロールベースのアクセスを検証する
アプリケーション コードと Azure Management SDK を使用して、アクセス権を正しく付与したことを検証します。
using Azure.Identity;
using Azure.ResourceManager;
DefaultAzureCredential credential = new();
ArmClient client = new(credential);
const { CosmosDBManagementClient } = require('@azure/arm-cosmosdb');
const { DefaultAzureCredential } = require('@azure/identity');
const subscriptionId = "<subscription-id>";
const credential = new DefaultAzureCredential();
const client = new CosmosDBManagementClient(credential, subscriptionId);
import { CosmosDBManagementClient } from '@azure/arm-cosmosdb';
import { TokenCredential, DefaultAzureCredential } from '@azure/identity';
let subscriptionId: string = "<subscription-id>";
let credential: TokenCredential = new DefaultAzureCredential();
const client: CosmosDBManagementClient = new CosmosDBManagementClient(credential, subscriptionId);
from azure.mgmt.cosmosdb import CosmosDBManagementClient
from azure.identity import DefaultAzureCredential
subscription_id = "<subscription-id>"
credential = DefaultAzureCredential()
client = CosmosDBManagementClient(credential=credential, subscription=subscription_id)
package main
import (
"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/cosmos/armcosmos"
)
const subscriptionId = "<subscription-id>"
func main() {
credential, _ := azidentity.NewDefaultAzureCredential(nil)
client, _ := armcosmos.NewDatabaseClient(subscriptionId, credential, nil)
}
package com.example;
import com.azure.core.management.profile.AzureProfile;
import com.azure.core.management.AzureEnvironment;
import com.azure.identity.DefaultAzureCredential;
import com.azure.identity.DefaultAzureCredentialBuilder;
import com.azure.resourcemanager.cosmos.CosmosManager;
public class CosmosDB {
public static void main(String[] args) {
AzureProfile profile = new AzureProfile(AzureEnvironment.AZURE);
DefaultAzureCredential credential = new DefaultAzureCredentialBuilder()
.build();
CosmosManager manager = CosmosManager.authenticate(credential, profile);
}
}
データ プレーンのロールベースのアクセス権を付与する
データ プレーン アクセスとは、アカウント内のリソースを管理することなく、Azure サービス内でデータの読み取りと書き込みを行う機能を指します。 たとえば、Azure Cosmos DB データ プレーンへのアクセスには、次の機能が含まれる場合があります。
- アカウントとリソースのメタデータを読み取る
- アイテムの作成、読み取り、更新、修正プログラムの適用、削除
- NoSQL クエリの実行
- コンテナーの変更フィードからの読み取り
- ストアド プロシージャの実行
- 競合フィードで競合を管理する
まず、Azure Cosmos DB for NoSQL のデータの読み取り、クエリ、管理へのアクセスを許可する dataActions の一覧を含むロール定義を準備する必要があります。 このガイドでは、組み込みロールとカスタム ロールを準備します。 次に、アプリケーションが Azure Cosmos DB for NoSQL のデータにアクセスできるように、新しく定義されたロールを ID に割り当てます。
Important
既存のデータ プレーン ロール定義を取得するには、次のコントロール プレーンのアクセス許可が必要です。
Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions/read
新しいデータ プレーン ロール定義を作成するには、次のコントロール プレーンのアクセス許可が必要です。
Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions/readMicrosoft.DocumentDB/databaseAccounts/sqlRoleDefinitions/write
新しいデータ プレーン ロールの割り当てを作成するには、次のコントロール プレーンのアクセス許可が必要です。
Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions/readMicrosoft.DocumentDB/databaseAccounts/sqlRoleAssignments/readMicrosoft.DocumentDB/databaseAccounts/sqlRoleAssignments/write
Warnung
Azure Cosmos DB for NoSQL のネイティブ ロールベースのアクセス制御では、 notDataActions プロパティはサポートされていません。 許可された dataAction として指定されていないアクションは、自動的に除外されます。
az cosmosdb sql role definition listを使用して、Azure Cosmos DB for NoSQL アカウントに関連付けられているすべてのロール定義を一覧表示します。az cosmosdb sql role definition list \ --resource-group "<name-of-existing-resource-group>" \ --account-name "<name-of-existing-nosql-account>"出力を確認し、 Cosmos DB 組み込みデータ共同作成者という名前のロール定義を見つけます。 出力の
idプロパティには、ロールの定義の一意識別子が含まれます。 このガイドの後半の割り当て手順で使用する必要があるため、この値を記録します。[ ..., { "assignableScopes": [ "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql" ], "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql/sqlRoleDefinitions/00000000-0000-0000-0000-000000000002", "name": "00000000-0000-0000-0000-000000000002", "permissions": [ { "dataActions": [ "Microsoft.DocumentDB/databaseAccounts/readMetadata", "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/*", "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/items/*" ], "notDataActions": [] } ], "resourceGroup": "msdocs-identity-example", "roleName": "Cosmos DB Built-in Data Contributor", "type": "Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions", "typePropertiesType": "BuiltInRole" } ... ]注
この例では、
id値が/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql/sqlRoleDefinitions/00000000-0000-0000-0000-000000000002されます。 この例では架空のデータを使用します。識別子はこの例とは異なります。role-definition.jsonという名前の新しい JSON ファイル を作成します 。 このファイルで、次に示すデータ アクションを指定するリソース定義を作成します。
Description Microsoft.DocumentDB/databaseAccounts/readMetadataアカウント レベルのメタデータを読み取ることができます Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/*コンテナー レベルのデータ操作を実行できます Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/items/*コンテナーを含む項目に対して任意の操作を実行できます { "RoleName": "Azure Cosmos DB for NoSQL Data Plane Owner", "Type": "CustomRole", "AssignableScopes": [ "/" ], "Permissions": [ { "DataActions": [ "Microsoft.DocumentDB/databaseAccounts/readMetadata", "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/*", "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/items/*" ] } ] }次に、
az cosmosdb sql role definition createを使用してロール定義を作成します。 引数の入力としてrole-definition.jsonを使用します。az cosmosdb sql role definition create \ --resource-group "<name-of-existing-resource-group>" \ --account-name "<name-of-existing-nosql-account>" \ --body "@role-definition.json"次に、
az cosmosdb sql role definition listを使用して、Azure Cosmos DB for NoSQL アカウントに関連付けられているすべてのロール定義を一覧表示します。az cosmosdb sql role definition list \ --resource-group "<name-of-existing-resource-group>" \ --account-name "<name-of-existing-nosql-account>"前のコマンドからの出力を確認します。 作成した Azure Cosmos DB for NOSQL データ プレーン所有者という名前のロール定義を見つけてください。 出力の
idプロパティには、ロールの定義の一意識別子が含まれます。 このガイドの後半の割り当て手順で使用する必要があるため、この値を記録します。{ "assignableScopes": [ "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql" ], "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql/sqlRoleDefinitions/bbbbbbbb-1111-2222-3333-cccccccccccc", "name": "bbbbbbbb-1111-2222-3333-cccccccccccc", "permissions": [ { "dataActions": [ "Microsoft.DocumentDB/databaseAccounts/readMetadata", "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/*", "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/items/*" ], "notDataActions": [] } ], "resourceGroup": "msdocs-identity-example", "roleName": "Azure Cosmos DB for NoSQL Data Plane Owner", "type": "Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions", "typePropertiesType": "CustomRole" }注
この例では、
id値が/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql/sqlRoleDefinitions/bbbbbbbb-1111-2222-3333-ccccccccccccされます。 この例では架空のデータを使用します。識別子はこの例とは異なります。az cosmosdb showを使用して、現在のアカウントの一意の識別子を取得します。az cosmosdb show \ --resource-group "<name-of-existing-resource-group>" \ --name "<name-of-existing-nosql-account>" \ --query "{id:id}"前のコマンドの出力を確認します。 次の手順で使用する必要があるため、このアカウントの
idプロパティの値を記録します。{ "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql" }注
この例では、
id値が/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosqlされます。 この例では架空のデータを使用します。識別子はこの例とは異なります。az cosmosdb sql role assignment createを使用して新しいロールを割り当てます。 先ほどメモしたロールの定義識別子を--role-definition-id引数に使用し、自分の ID の一意識別子を--principal-id引数に使用します。 最後に、--scope引数にアカウントの識別子を使用します。az cosmosdb sql role assignment create \ --resource-group "<name-of-existing-resource-group>" \ --account-name "<name-of-existing-nosql-account>" \ --role-definition-id "<id-of-new-role-definition>" \ --principal-id "<id-of-existing-identity>" \ --scope "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql"ヒント
データ プレーンのロールベースのアクセス制御を自分の ID に付与しようとしている場合は、次のコマンドを使用して ID を取得できます。
az ad signed-in-user show詳細については、
az ad signed-in-userを参照してください。ヒント
Azure Cosmos DB のロールベースのアクセス制御のネイティブ実装では、 スコープ とは、アクセス許可を適用するアカウント内のリソースの粒度を指します。 最上位レベルでは、最大のスコープを使用して、データ プレーンのロールベースのアクセス制御の割り当てをアカウント全体にスコープ設定できます。 このスコープには、アカウント内のすべてのデータベースとコンテナーが含まれます。
/subscriptions/<subscription-id>/resourcegroups/<resource-group-name>/providers/Microsoft.DocumentDB/databaseAccounts/<account-name>/または、データ プレーン ロールの割り当てのスコープを特定のデータベースに設定することもできます。
/subscriptions/<subscription-id>/resourcegroups/<resource-group-name>/providers/Microsoft.DocumentDB/databaseAccounts/<account-name>/dbs/<database-name>最後に、割り当てのスコープを 1 つのコンテナーに設定できます。最も詳細なスコープは次のとおりです。
/subscriptions/<subscription-id>/resourcegroups/<resource-group-name>/providers/Microsoft.DocumentDB/databaseAccounts/<account-name>/dbs/<database-name>/colls/<container-name>多くの場合、完全修飾スコープではなく相対スコープを使用できます。 たとえば、この相対スコープを使用して、Azure CLI コマンドからデータ プレーンロールベースのアクセス制御アクセス許可を特定のデータベースとコンテナーに付与できます。
/dbs/<database-name>/colls/<container-name>また、次の相対スコープを使用して、すべてのデータベースとコンテナーへのユニバーサル アクセスを許可することもできます。
/az cosmosdb sql role assignment listを使用して、Azure Cosmos DB for NoSQL アカウントのすべてのロールの割り当てを一覧表示します。 出力を確認して、ロールの割り当てが作成されたことを確認します。az cosmosdb sql role assignment list \ --resource-group "<name-of-existing-resource-group>" \ --account-name "<name-of-existing-nosql-account>"
az cosmosdb sql role definition listを使用して、Azure Cosmos DB for NoSQL アカウントに関連付けられているすべてのロール定義を一覧表示します。az cosmosdb sql role definition list \ --resource-group "<name-of-existing-resource-group>" \ --account-name "<name-of-existing-nosql-account>"出力を確認し、 Cosmos DB 組み込みデータ共同作成者という名前のロール定義を見つけます。 出力の
idプロパティには、ロールの定義の一意識別子が含まれます。 このガイドの後半の割り当て手順で使用する必要があるため、この値を記録します。[ ..., { "assignableScopes": [ "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql" ], "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql/sqlRoleDefinitions/00000000-0000-0000-0000-000000000002", "name": "00000000-0000-0000-0000-000000000002", "permissions": [ { "dataActions": [ "Microsoft.DocumentDB/databaseAccounts/readMetadata", "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/*", "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/items/*" ], "notDataActions": [] } ], "resourceGroup": "msdocs-identity-example", "roleName": "Cosmos DB Built-in Data Contributor", "type": "Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions", "typePropertiesType": "BuiltInRole" } ... ]注
この例では、
id値が/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql/sqlRoleDefinitions/00000000-0000-0000-0000-000000000002されます。 この例では架空のデータを使用します。識別子はこの例とは異なります。ロール定義を定義する新しい Bicep ファイルを作成します。 ファイルに data-plane-role-definition.bicep という名前を付けます。 次の
dataActionsを定義に追加します。Description Microsoft.DocumentDB/databaseAccounts/readMetadataアカウント レベルのメタデータを読み取ることができます Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/*コンテナー レベルのデータ操作を実行できます Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/items/*コンテナーを含む項目に対して任意の操作を実行できます metadata description = 'Create RBAC definition for data plane access to Azure Cosmos DB for NoSQL.' @description('Name of the Azure Cosmos DB for NoSQL account.') param accountName string @description('Name of the role definition.') param roleDefinitionName string = 'Azure Cosmos DB for NoSQL Data Plane Owner' resource account 'Microsoft.DocumentDB/databaseAccounts@2024-05-15' existing = { name: accountName } resource definition 'Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions@2024-05-15' = { name: guid(account.id, roleDefinitionName) parent: account properties: { roleName: roleDefinitionName type: 'CustomRole' assignableScopes: [ account.id ] permissions: [ { dataActions: [ 'Microsoft.DocumentDB/databaseAccounts/readMetadata' 'Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/*' 'Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/items/*' ] } ] } } output definitionId string = definition.idヒント
Azure Cosmos DB のロールベースのアクセス制御のネイティブ実装では、 スコープ とは、アクセス許可を適用するアカウント内のリソースの粒度を指します。 最上位レベルでは、最大のスコープを使用して、データ プレーンのロールベースのアクセス制御の割り当てをアカウント全体にスコープ設定できます。 このスコープには、アカウント内のすべてのデータベースとコンテナーが含まれます。
/subscriptions/<subscription-id>/resourcegroups/<resource-group-name>/providers/Microsoft.DocumentDB/databaseAccounts/<account-name>/または、データ プレーン ロールの割り当てのスコープを特定のデータベースに設定することもできます。
/subscriptions/<subscription-id>/resourcegroups/<resource-group-name>/providers/Microsoft.DocumentDB/databaseAccounts/<account-name>/dbs/<database-name>最後に、割り当てのスコープを 1 つのコンテナーに設定できます。最も詳細なスコープは次のとおりです。
/subscriptions/<subscription-id>/resourcegroups/<resource-group-name>/providers/Microsoft.DocumentDB/databaseAccounts/<account-name>/dbs/<database-name>/colls/<container-name>多くの場合、完全修飾スコープではなく相対スコープを使用できます。 たとえば、この相対スコープを使用して、Azure CLI コマンドからデータ プレーンロールベースのアクセス制御アクセス許可を特定のデータベースとコンテナーに付与できます。
/dbs/<database-name>/colls/<container-name>また、次の相対スコープを使用して、すべてのデータベースとコンテナーへのユニバーサル アクセスを許可することもできます。
/data-plane-role-definition.
bicepparamという名前の新しい Bicep パラメーター ファイルを作成します。 このパラメーター ファイルで、既存の Azure Cosmos DB for NoSQL アカウントの名前をaccountNameパラメーターに割り当てます。using './data-plane-role-definition.bicep' param accountName = '<name-of-existing-nosql-account>'az deployment group createを使用して Bicep テンプレートをデプロイします。az deployment group create \ --resource-group "<name-of-existing-resource-group>" \ --parameters data-plane-role-definition.bicepparam \ --template-file data-plane-role-definition.bicepロールの割り当てを定義する新しい Bicep ファイルを作成します。 ファイルに data-plane-role-assignment.bicep という名前を付けます。
metadata description = 'Assign RBAC role for data plane access to Azure Cosmos DB for NoSQL.' @description('Name of the Azure Cosmos DB for NoSQL account.') param accountName string @description('Id of the role definition to assign to the targeted principal in the context of the account.') param roleDefinitionId string @description('Id of the identity/principal to assign this role in the context of the account.') param identityId string = deployer().objectId resource account 'Microsoft.DocumentDB/databaseAccounts@2024-05-15' existing = { name: accountName } resource assignment 'Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments@2024-05-15' = { name: guid(roleDefinitionId, identityId, account.id) parent: account properties: { principalId: identityId roleDefinitionId: roleDefinitionId scope: account.id } } output assignmentId string = assignment.iddata-plane-role-assignment.
bicepparamという名前の新しい Bicep パラメーター ファイルを作成します。 このパラメーター ファイルで、既存の Azure Cosmos DB for NoSQL アカウントの名前をaccountNameパラメーターに割り当て、以前に記録したロール定義識別子をroleDefinitionIdパラメーターに割り当て、id の一意識別子をidentityIdパラメーターに割り当てます。using './data-plane-role-assignment.bicep' param accountName = '<name-of-existing-nosql-account>' param roleDefinitionId = '<id-of-new-role-definition>' param identityId = '<id-of-existing-identity>'ヒント
データ プレーンのロールベースのアクセス制御を独自の ID に付与しようとしている場合は、
identityIdパラメーターを省略できます。 その後、Bicep テンプレートはdeployer().objectIdを使用して、テンプレートをデプロイしたプリンシパルの ID を取得します。 詳細については、deployerを参照してください。az deployment group createを使用して Bicep テンプレートをデプロイします。az deployment group create \ --resource-group "<name-of-existing-resource-group>" \ --parameters data-plane-role-assignment.bicepparam \ --template-file data-plane-role-assignment.bicep使用する他の ID からアカウントへのアクセスを許可するには、次の手順を繰り返します。
ヒント
必要な数の ID に対して、これらの手順を繰り返すことができます。 通常、これらの手順は少なくとも繰り返され、開発者は自分の人間の ID を使用してアカウントにアクセスできます。 これらの手順を繰り返して、アプリケーションがマネージド ID を使用してリソースにアクセスできるようにすることもできます。
Get-AzCosmosDBSqlRoleDefinitionを使用して、Azure Cosmos DB for NoSQL アカウントに関連付けられているすべてのロール定義を一覧表示します。$parameters = @{ ResourceGroupName = "<name-of-existing-resource-group>" AccountName = "<name-of-existing-nosql-account>" } Get-AzCosmosDBSqlRoleDefinition @parameters出力を確認し、 Cosmos DB 組み込みデータ共同作成者という名前のロール定義を見つけます。 出力の
Idプロパティには、ロールの定義の一意識別子が含まれます。 このガイドの後半の割り当て手順で使用する必要があるため、この値を記録します。Id : /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql/sqlRoleDefinitions/00000000-0000-0000-0000-000000000002 RoleName : Cosmos DB Built-in Data Contributor Type : BuiltInRole AssignableScopes : {/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccountsmsdocs-identity-example-nosql} Permissions.DataActions : {Microsoft.DocumentDB/databaseAccounts/readMetadata, Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/*, Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/items/*} Permissions.NotDataActions :注
この例では、
Id値が/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql/sqlRoleDefinitions/00000000-0000-0000-0000-000000000002されます。 この例では架空のデータを使用します。識別子はこの例とは異なります。 ただし、識別子 (00000000-0000-0000-0000-000000000002) は、アカウント内のすべてのロール定義で一意です。New-AzCosmosDBSqlRoleDefinitionを使用して新しいロール定義を作成します。DataActionパラメーターには、次に示すデータ アクションを指定します。Description Microsoft.DocumentDB/databaseAccounts/readMetadataアカウント レベルのメタデータを読み取ることができます Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/*コンテナー レベルのデータ操作を実行できます Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/items/*コンテナーを含む項目に対して任意の操作を実行できます $parameters = @{ ResourceGroupName = "<name-of-existing-resource-group>" AccountName = "<name-of-existing-nosql-account>" RoleName = "Azure Cosmos DB for NoSQL Data Plane Owner" Type = "CustomRole" AssignableScope = @( "/" ) DataAction = @( "Microsoft.DocumentDB/databaseAccounts/readMetadata", "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/*", "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/items/*" ) } New-AzCosmosDBSqlRoleDefinition @parametersヒント
Azure Cosmos DB のロールベースのアクセス制御のネイティブ実装では、 スコープ とは、アクセス許可を適用するアカウント内のリソースの粒度を指します。 最上位レベルでは、最大のスコープを使用して、データ プレーンのロールベースのアクセス制御の割り当てをアカウント全体にスコープ設定できます。 このスコープには、アカウント内のすべてのデータベースとコンテナーが含まれます。
/subscriptions/<subscription-id>/resourcegroups/<resource-group-name>/providers/Microsoft.DocumentDB/databaseAccounts/<account-name>/または、データ プレーン ロールの割り当てのスコープを特定のデータベースに設定することもできます。
/subscriptions/<subscription-id>/resourcegroups/<resource-group-name>/providers/Microsoft.DocumentDB/databaseAccounts/<account-name>/dbs/<database-name>最後に、割り当てのスコープを 1 つのコンテナーに設定できます。最も詳細なスコープは次のとおりです。
/subscriptions/<subscription-id>/resourcegroups/<resource-group-name>/providers/Microsoft.DocumentDB/databaseAccounts/<account-name>/dbs/<database-name>/colls/<container-name>多くの場合、完全修飾スコープではなく相対スコープを使用できます。 たとえば、この相対スコープを使用して、Azure CLI コマンドからデータ プレーンロールベースのアクセス制御アクセス許可を特定のデータベースとコンテナーに付与できます。
/dbs/<database-name>/colls/<container-name>また、次の相対スコープを使用して、すべてのデータベースとコンテナーへのユニバーサル アクセスを許可することもできます。
/Get-AzCosmosDBSqlRoleDefinitionを使用して、Azure Cosmos DB for NoSQL アカウントに関連付けられているすべてのロール定義を一覧表示します。$parameters = @{ ResourceGroupName = "<name-of-existing-resource-group>" AccountName = "<name-of-existing-nosql-account>" } Get-AzCosmosDBSqlRoleDefinition @parameters前のコマンドからの出力を確認します。 作成した Azure Cosmos DB for NOSQL データ プレーン所有者という名前のロール定義を見つけてください。 出力の
Idプロパティには、ロールの定義の一意識別子が含まれます。 このガイドの後半の割り当て手順で使用する必要があるため、この値を記録します。Id : /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql/sqlRoleDefinitions/bbbbbbbb-1111-2222-3333-cccccccccccc RoleName : Azure Cosmos DB for NoSQL Data Plane Owner Type : CustomRole AssignableScopes : {/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql} Permissions.DataActions : {Microsoft.DocumentDB/databaseAccounts/readMetadata, Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/items/*, Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/*} Permissions.NotDataActions :注
この例では、
Id値が/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql/sqlRoleDefinitions/bbbbbbbb-1111-2222-3333-ccccccccccccされます。 この例では架空のデータを使用します。識別子はこの例とは異なります。Get-AzCosmosDBAccountを使用して、現在のアカウントのメタデータを取得します。$parameters = @{ ResourceGroupName = "<name-of-existing-resource-group>" Name = "<name-of-existing-nosql-account>" } Get-AzCosmosDBAccount @parameters | Select -Property Id前のコマンドの出力を確認します。 次の手順で使用する必要があるため、このアカウントの
Idプロパティの値を記録します。Id -- /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql注
この例では、
Id値が/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosqlされます。 この例では架空のデータを使用します。識別子はこの例とは異なります。New-AzCosmosDBSqlRoleAssignmentを使用して新しいロールを割り当てます。 先ほどメモしたロールの定義識別子をRoleDefinitionIdパラメーターに使用し、自分の ID の一意識別子をPrincipalIdパラメーターに使用します。 最後に、Scopeパラメーターにアカウントの識別子を使用します。$parameters = @{ ResourceGroupName = "<name-of-existing-resource-group>" AccountName = "<name-of-existing-nosql-account>" RoleDefinitionId = "<id-of-new-role-definition>" PrincipalId = "<id-of-existing-identity>" Scope = "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql" } New-AzCosmosDBSqlRoleAssignment @parametersヒント
データ プレーンのロールベースのアクセス制御を自分の ID に付与しようとしている場合は、次のコマンドを使用して ID を取得できます。
Get-AzADUser -SignedIn | Format-List ` -Property Id, DisplayName, Mail, UserPrincipalName詳細については、
Get-AzADUserを参照してください。Get-AzCosmosDBSqlRoleAssignmentを使用して、Azure Cosmos DB for NoSQL アカウントのすべてのロールの割り当てを一覧表示します。 出力を確認して、ロールの割り当てが作成されたことを確認します。$parameters = @{ ResourceGroupName = "<name-of-existing-resource-group>" AccountName = "<name-of-existing-nosql-account>" } Get-AzCosmosDBSqlRoleAssignment @parameters
Warnung
Azure portal では、データ プレーンのロールベースのアクセス制御の管理はサポートされていません。
コードでデータ プレーンロールベースのアクセスを検証する
アプリケーション コードと Azure SDK を使用してアクセス権を正しく付与したことを検証します。
using Azure.Core;
using Azure.Identity;
using Microsoft.Azure.Cosmos;
string endpoint = "<account-endpoint>";
TokenCredential credential = new DefaultAzureCredential();
CosmosClient client = new(endpoint, credential);
Container container = client.GetContainer("<database-name>", "<container-name>");
await container.ReadItemAsync<dynamic>("<item-id>", new PartitionKey("<partition-key>"));
const { CosmosClient } = require('@azure/cosmos');
const { DefaultAzureCredential } = require('@azure/identity');
const endpoint = '<account-endpoint>';
const credential = new DefaultAzureCredential();
const client = new CosmosClient({ endpoint, aadCredentials:credential});
const container = client.database('<database-name>').container('<container-name>');
await container.item('<item-id>', '<partition-key>').read<String>();
import { Container, CosmosClient, CosmosClientOptions } from '@azure/cosmos'
import { TokenCredential, DefaultAzureCredential } from '@azure/identity'
let endpoint: string = '<account-endpoint>';
let credential: TokenCredential = new DefaultAzureCredential();
let options: CosmosClientOptions = {
endpoint: endpoint,
aadCredentials: credential
};
const client: CosmosClient = new CosmosClient(options);
const container: Container = client.database('<database-name>').container('<container-name>');
await container.item('<item-id>', '<partition-key>').read<String>();
from azure.cosmos import CosmosClient
from azure.identity import DefaultAzureCredential
endpoint = "<account-endpoint>"
credential = DefaultAzureCredential()
client = CosmosClient(endpoint, credential=credential)
container = client.get_database_client("<database-name>").get_container_client("<container-name>")
container.read_item(
item="<item-id>",
partition_key="<partition-key>",
)
import (
"context"
"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
"github.com/Azure/azure-sdk-for-go/sdk/data/azcosmos"
)
const endpoint = "<account-endpoint>"
func main() {
credential, _ := azidentity.NewDefaultAzureCredential(nil)
client, _ := azcosmos.NewClient(endpoint, credential, nil)
database, _ := client.NewDatabase("<database-name>")
container, _ := database.NewContainer("<container-name>")
_, err := container.ReadItem(context.TODO(), azcosmos.NewPartitionKeyString("<partition-key>"), "<item-id>", nil)
if err != nil {
panic(err)
}
}
import com.azure.cosmos.CosmosClient;
import com.azure.cosmos.CosmosClientBuilder;
import com.azure.cosmos.CosmosContainer;
import com.azure.cosmos.models.PartitionKey;
import com.azure.identity.DefaultAzureCredential;
import com.azure.identity.DefaultAzureCredentialBuilder;
public class NoSQL {
public static void main(String[] args) {
DefaultAzureCredential credential = new DefaultAzureCredentialBuilder()
.build();
CosmosClient client = new CosmosClientBuilder()
.endpoint("<account-endpoint>")
.credential(credential)
.buildClient();
CosmosContainer container = client.getDatabase("<database-name>").getContainer("<container-name>");
container.readItem("<item-id>", new PartitionKey("<partition-key>"), Object.class);
}
}
use azure_data_cosmos::CosmosClient;
use azure_identity::DefaultAzureCredential;
fn main() {
let credential = DefaultAzureCredential::new().unwrap();
let client = CosmosClient::new("<account-endpoint>", credential, None).unwrap();
let container = client.database_client("<database-name>").container_client("<container-name>");
let response = container.read_item("<partition-key>", "<item-id>", None);
tokio::runtime::Runtime::new().unwrap().block_on(response).unwrap();
}