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


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

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

Схема текущего расположения (управление доступом на основе ролей) в последовательности руководства по развертыванию.

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

Совет

Посетите новую коллекцию примеров для последних примеров для создания новых приложений

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

Внимание

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

Необходимые компоненты

  • Учетная запись Azure с активной подпиской. Создайте учетную запись бесплатно .
  • Существующая учетная запись Azure Cosmos DB для NoSQL.
  • Одно или несколько существующих удостоверений в идентификаторе Microsoft Entra.
  • Используйте среду Bash в Azure Cloud Shell. Дополнительные сведения см . в кратком руководстве по Bash в Azure Cloud Shell.

  • Если вы предпочитаете выполнять справочные команды CLI локально, установите Azure CLI. Если вы работаете в Windows или macOS, Azure CLI можно запустить в контейнере Docker. Дополнительные сведения см. в статье Как запустить Azure CLI в контейнере Docker.

    • Если вы используете локальную установку, выполните вход в Azure CLI с помощью команды az login. Чтобы выполнить аутентификацию, следуйте инструкциям в окне терминала. Сведения о других возможностях, доступных при входе, см. в статье Вход с помощью Azure CLI.

    • Установите расширение Azure CLI при первом использовании, когда появится соответствующий запрос. Дополнительные сведения о расширениях см. в статье Использование расширений с Azure CLI.

    • Выполните команду az version, чтобы узнать установленную версию и зависимые библиотеки. Чтобы обновиться до последней версии, выполните команду az upgrade.

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

Сначала необходимо подготовить определение роли со списком dataActions предоставления доступа для чтения, запроса и управления данными в Azure Cosmos DB для 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"
    
  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
    
    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-assignment..bicepparam В этом файле параметров назначьте имя существующей учетной записи 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>'
    
  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
    
  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);

Внимание

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