다음을 통해 공유


Azure Cosmos DB for NoSQL에서 데이터 평면 역할 기반 액세스 제어 사용

적용 대상: NoSQL

배포 가이드 시퀀스의 현재 위치('역할 기반 액세스 제어')를 다이어그램으로 표시합니다.

개요, 개념, 준비, 역할 기반 액세스 제어, 네트워크 및 참조 순서대로 이러한 위치를 포함하는 배포 가이드 시퀀스의 다이어그램 '역할 기반 액세스 제어' 위치가 현재 강조 표시되어 있습니다.

새 앱을 빌드하기 위한 최신 샘플은 새 샘플 갤러리 를 방문하세요.

이 문서에서는 NoSQL용 Azure Cosmos DB 계정에서 데이터를 관리하기 위한 ID 액세스 권한을 부여하는 단계를 안내합니다.

Important

이 문서의 단계에서는 개별 항목에 대한 작업을 수행하고 쿼리를 실행하기 위한 데이터 평면 액세스만 다룹니다. 컨트롤 플레인에 대한 데이터베이스 및 컨테이너를 관리하는 방법을 알아보려면 컨트롤 플레인 역할 기반 액세스 권한 부여를 참조하세요.

필수 조건

  • 활성 구독이 있는 Azure 계정. 체험 계정을 만듭니다.
  • 기존 Azure Cosmos DB API for NoSQL 계정.
  • Microsoft Entra ID에 하나 이상의 기존 ID가 있습니다.

역할 정의 준비

먼저 NoSQL용 Azure Cosmos DB에서 dataActions 데이터를 읽고, 쿼리하고, 관리할 수 있는 액세스 권한을 부여하는 목록을 사용하여 역할 정의를 준비해야 합니다.

Important

기존 데이터 평면 역할 정의를 가져오려면 다음 컨트롤 플레인 권한이 필요합니다.

  • Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions/read

자세한 내용은 제어 평면 역할 기반 액세스 권한 부여를 참조 하세요.

를 사용하여 az cosmosdb sql role definition listAzure Cosmos DB for NoSQL 계정과 연결된 모든 역할 정의를 나열합니다. 출력을 검토하고 Cosmos DB 기본 제공 데이터 기여자라는 역할 정의를 찾습니다. 출력에는 속성에 있는 역할 정의 id 의 고유 식별자가 포함됩니다. 이 가이드의 뒷부분에 있는 할당 단계에서 사용하는 데 필요하기 때문에 이 값을 기록합니다.

az cosmosdb sql role definition list \
    --resource-group "<name-of-existing-resource-group>" \
    --account-name "<name-of-existing-nosql-account>"
[
  ...,
  {
    "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입니다. 이 예제에서는 가상 데이터를 사용하며 식별자는 이 예제와 다릅니다.

NoSQL용 Azure Cosmos DB 계정과 연결된 모든 역할 정의를 나열하는 데 사용합니다 Get-AzCosmosDBSqlRoleDefinition . 출력을 검토하고 Cosmos DB 기본 제공 데이터 기여자라는 역할 정의를 찾습니다. 출력에는 속성에 있는 역할 정의 Id 의 고유 식별자가 포함됩니다. 이 가이드의 뒷부분에 있는 할당 단계에서 사용하는 데 필요하기 때문에 이 값을 기록합니다.

$parameters = @{
    ResourceGroupName = "<name-of-existing-resource-group>"
    AccountName = "<name-of-existing-nosql-account>"
}
Get-AzCosmosDBSqlRoleDefinition @parameters
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)는 계정의 모든 역할 정의에서 고유합니다.

ID에 역할 할당

이제 애플리케이션이 NoSQL용 Azure Cosmos DB의 데이터에 액세스할 수 있도록 ID에 새로 정의된 역할을 할당합니다.

Important

새 데이터 평면 역할 할당을 만들려면 다음 컨트롤 플레인 권한이 필요합니다.

  • Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions/read
  • Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments/read
  • Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments/write

자세한 내용은 제어 평면 역할 기반 액세스 권한 부여를 참조 하세요.

  1. 현재 계정에 대한 고유 식별자를 가져오는 데 사용합니다 az cosmosdb show .

    az cosmosdb show \
        --resource-group "<name-of-existing-resource-group>" \
        --name "<name-of-existing-nosql-account>" \
        --query "{id:id}"
    
  2. 이전 명령의 출력을 관찰합니다. 다음 단계에서 사용해야 하며 이 계정의 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입니다. 이 예제에서는 가상 데이터를 사용하며 식별자는 이 예제와 다릅니다.

  3. 를 사용하여 새 역할을 할당합니다 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"
    
  4. Azure Cosmos DB for NoSQL 계정에 대한 모든 역할 할당을 나열하는 데 사용합니다 az cosmosdb sql role assignment list . 출력을 검토하여 역할 할당이 생성되었는지 확인합니다.

    az cosmosdb sql role assignment list \
        --resource-group "<name-of-existing-resource-group>" \
        --account-name "<name-of-existing-nosql-account>"
    
  1. 새 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
    
    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.id
    
  2. data-plane-role-assignmentbicepparam라는 새 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>'
    
  3. 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
    
  4. 이 단계를 반복하여 사용하려는 다른 ID에서 계정에 대한 액세스 권한을 부여합니다.

    원하는 만큼 ID에 대해 이러한 단계를 반복할 수 있습니다. 일반적으로 이러한 단계는 개발자가 사용자 ID를 사용하여 계정에 액세스할 수 있도록 허용하고 관리 ID를 사용하여 애플리케이션에 액세스할 수 있도록 하기 위해 적어도 반복됩니다.

  1. 현재 계정에 대한 메타데이터를 가져오는 데 사용합니다 Get-AzCosmosDBAccount .

    $parameters = @{
        ResourceGroupName = "<name-of-existing-resource-group>"
        Name = "<name-of-existing-nosql-account>"
    }    
    Get-AzCosmosDBAccount @parameters | Select -Property Id
    
  2. 이전 명령의 출력을 관찰합니다. 다음 단계에서 사용해야 하며 이 계정의 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입니다. 이 예제에서는 가상 데이터를 사용하며 식별자는 이 예제와 다릅니다.

  3. 새 역할을 할당하는 데 사용합니다 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
    
  4. 를 사용하여 Get-AzCosmosDBSqlRoleAssignmentAzure Cosmos DB for NoSQL 계정에 대한 모든 역할 할당을 나열합니다. 출력을 검토하여 역할 할당이 생성되었는지 확인합니다.

    $parameters = @{
        ResourceGroupName = "<name-of-existing-resource-group>"
        AccountName = "<name-of-existing-nosql-account>"
    }
    Get-AzCosmosDBSqlRoleAssignment @parameters
    

코드에서 데이터 평면 액세스 유효성 검사

마지막으로 기본 프로그래밍 언어로 애플리케이션 코드 및 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);

Important

이 코드 샘플에서는 NuGet의 Microsoft.Azure.Cosmos 라이브러리 및 Azure.Identity 라이브러리를 사용합니다.