Поделиться через


Использование управления доступом на основе ролей уровня данных с помощью Azure Cosmos DB для NoSQL

ОБЛАСТЬ ПРИМЕНЕНИЯ: NoSQL

В этой статье подробно описываются шаги по предоставлению идентификатору доступа для управления данными в учетной записи Azure Cosmos DB для NoSQL.

Это важно

Действия, описанные в этой статье, охватывают только доступ к плоскости данных для выполнения операций с отдельными элементами и выполнения запросов. Чтобы узнать, как управлять базами данных и контейнерами для контрольной плоскости, ознакомьтесь с предоставлением ролевого доступа для контрольной плоскости.

Предпосылки

  • Учетная запись Azure с активной подпиской. Создайте учетную запись бесплатно.
  • Существующая учетная запись Azure Cosmos DB для NoSQL.
  • Одно или несколько существующих идентичностей в Microsoft Entra ID.
  • Если вы решили использовать Azure PowerShell локально:
    • Установите последнюю версию модуля Az PowerShell.
    • Подключитесь к учетной записи Azure с помощью командлета Connect-AzAccount .
  • Если вы решили использовать Azure Cloud Shell:

Подготовка определения роли

Сначала необходимо подготовить определение роли со списком dataActions, чтобы предоставить доступ к чтению, запросу и управлению данными в Azure Cosmos DB for NoSQL.

Это важно

Для получения существующего определения роли плоскости данных требуются следующие разрешения уровня управления:

  • Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions/read

Дополнительные сведения см. в разделе "Предоставление доступа на основе ролей уровня управления".

Перечислите все определения ролей, связанные с вашей учетной записью Azure Cosmos DB для NoSQL, используя az cosmosdb sql role definition list. Просмотрите выходные данные и найдите определение роли с именем Встроенный участник данных 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. В этом примере используются вымышленные данные, и идентификатор будет отличаться от этого примера.

Используйте Get-AzCosmosDBSqlRoleDefinition для перечисления всех определений ролей, связанных с учетной записью Azure Cosmos DB для NoSQL. Просмотрите выходные данные и найдите определение роли с именем Встроенный участник данных 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) является уникальным для всех определений ролей в вашей учетной записи.

Назначение роли идентичности

Теперь назначьте только что определенную роль идентификатору, чтобы приложения могли получать доступ к данным в Azure Cosmos DB для NoSQL.

Это важно

Для создания нового назначения роли контура данных требуются следующие разрешения контура управления:

  • 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, а уникальный идентификатор вашей личности для аргумента --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"
    

    Подсказка

    Если вы пытаетесь предоставить управление доступом к плоскости данных на основе ролей для вашего удостоверения, вы можете использовать эту команду, чтобы получить удостоверение:

    az ad signed-in-user show
    

    Дополнительные сведения см. в разделе az ad signed-in-user.

  4. Используйте az cosmosdb sql role assignment list для перечисления всех назначений ролей для учетной записи Azure Cosmos DB для NoSQL. Просмотрите выходные данные, чтобы убедиться, что назначение роли было создано.

    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 = 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.id
    
  2. Создайте новый файл параметров Bicep с именем data-plane-role-assignmentbicepparam. В этом файле параметров назначьте параметру accountName имя вашей существующей учетной записи Azure Cosmos DB для NoSQL, параметру roleDefinitionId — идентификаторы ранее записанных определений ролей, а параметру 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>'
    

    Подсказка

    Если вы пытаетесь предоставить управление доступом на основе ролей плоскости данных вашему удостоверению, можно опустить identityId этот параметр. Затем шаблон Bicep будет использовать deployer().objectId для получения удостоверения участника, который развернул шаблон. Дополнительные сведения см. в разделе deployer.

  3. Разверните шаблон Bicep с помощью az deployment group create.

    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. Повторите эти действия, чтобы предоставить доступ к учетной записи для любых других идентификаторов, которые вы хотите использовать.

    Подсказка

    Эти действия можно повторить для стольких учетных записей, сколько вам нужно. Как правило, эти шаги по крайней мере повторяются, чтобы разрешить разработчикам доступ к учетной записи с помощью их человеческого удостоверения. Вы также можете повторить эти действия, чтобы разрешить приложениям получать доступ к ресурсам с помощью управляемого удостоверения.

  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, и уникальный идентификатор вашей идентичности для параметра 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
    

    Подсказка

    Если вы пытаетесь предоставить вашей учетной записи управление доступом на основе ролей на канальном уровне, вы можете использовать эту команду, чтобы узнать свою учетную запись:

    Get-AzADUser -SignedIn | Format-List `
        -Property Id, DisplayName, Mail, UserPrincipalName
    

    Дополнительные сведения см. в разделе Get-AzADUser.

  4. Перечислите все назначения ролей для вашей учетной записи Azure Cosmos DB для NoSQL, используя Get-AzCosmosDBSqlRoleAssignment. Просмотрите выходные данные, чтобы убедиться, что назначение роли было создано.

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

Проверка доступа к плоскости передачи данных в коде

Наконец, убедитесь, что вы правильно предоставили доступ с помощью кода приложения и пакета SDK Azure на предпочитаемом языке программирования.

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>"));

Это важно

В этом примере кода используются Microsoft.Azure.Cosmos и Azure.Identity библиотеки из NuGet.