Использование управления доступом на основе ролей уровня данных с помощью 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.
- Если вы решили использовать Azure PowerShell локально:
- Установите последнюю версию модуля Az PowerShell.
- Подключитесь к учетной записи Azure с помощью командлета Connect-AzAccount.
- Если вы решили использовать Azure Cloud Shell:
- Дополнительные сведения см. в статье Общие сведения об Azure Cloud Shell.
Подготовка определения роли
Сначала необходимо подготовить определение роли со списком 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
Дополнительные сведения см. в разделе "Предоставление доступа на основе ролей уровня управления".
Используйте
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
аргумента и уникальный идентификатор удостоверения для аргумента--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 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>"
Создайте файл 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
Создайте файл параметров 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>'
Разверните шаблон 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
Повторите эти действия, чтобы предоставить доступ к учетной записи из любых других удостоверений, которые вы хотите использовать.
Совет
Эти действия можно повторить для столько удостоверений, сколько вы хотите. Как правило, эти шаги по крайней мере повторяются, чтобы разработчики могли получать доступ к учетной записи с помощью человеческого удостоверения и разрешать приложениям доступ с помощью управляемого удостоверения.
Используется
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
ролей для параметра и уникальный идентификатор удостоверения для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
Список всех назначений ролей для учетной записи 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.