Usare il controllo degli accessi in base al ruolo con Azure Cosmos DB per tabella (anteprima)
Diagramma della sequenza della guida alla distribuzione, inclusi questi percorsi, in ordine: Panoramica, Concetti, Preparazione, Controllo degli accessi in base al ruolo e Riferimento. Il percorso "Controllo degli accessi in base al ruolo" è attualmente evidenziato.
Questo articolo illustra i passaggi per concedere a un'identità l'accesso per gestire i dati in un account Azure Cosmos DB per tabelle. I passaggi descritti in questo articolo riguardano solo l'accesso al piano dati per eseguire operazioni su singoli elementi ed eseguire query.
Prerequisiti
- Un account Azure con una sottoscrizione attiva. Creare un account gratuitamente.
- Un account Azure Cosmos DB per table esistente.
- Una o più identità esistenti in Microsoft Entra ID.
Usare l'ambiente Bash in Azure Cloud Shell. Per altre informazioni, vedere Avvio rapido su Bash in Azure Cloud Shell.
Se si preferisce eseguire i comandi di riferimento dell'interfaccia della riga di comando in locale, installare l'interfaccia della riga di comando di Azure. Per l'esecuzione in Windows o macOS, è consigliabile eseguire l'interfaccia della riga di comando di Azure in un contenitore Docker. Per altre informazioni, vedere Come eseguire l'interfaccia della riga di comando di Azure in un contenitore Docker.
Se si usa un'installazione locale, accedere all'interfaccia della riga di comando di Azure con il comando az login. Per completare il processo di autenticazione, seguire la procedura visualizzata nel terminale. Per altre opzioni di accesso, vedere Accedere tramite l'interfaccia della riga di comando di Azure.
Quando richiesto, al primo utilizzo installare l'estensione dell'interfaccia della riga di comando di Azure. Per altre informazioni sulle estensioni, vedere Usare le estensioni con l'interfaccia della riga di comando di Azure.
Eseguire az version per trovare la versione e le librerie dipendenti installate. Per eseguire l'aggiornamento alla versione più recente, eseguire az upgrade.
Preparare la definizione del ruolo
Prima di tutto, è necessario preparare una definizione di ruolo con un elenco di dataActions
per concedere l'accesso a lettura, query e gestione dei dati in Azure Cosmos DB per tabella.
Ottenere prima di tutto l'identificatore di risorsa dell'account Azure Cosmos DB per tabella esistente usando az cosmsodb show
e archiviarlo in una variabile. Elencare quindi tutte le definizioni di ruolo associate all'account Azure Cosmos DB per tabella usando az rest
. Esaminare infine l'output e individuare la definizione del ruolo denominata Collaboratore dati predefinito di Cosmos DB. L'output contiene l'identificatore univoco della definizione del ruolo nella id
proprietà . Registrare questo valore perché è necessario usare nel passaggio di assegnazione più avanti in questa guida.
resourceId=$( \
az cosmosdb show \
--resource-group "<name-of-existing-resource-group>" \
--name "<name-of-existing-table-account>" \
--query "id" \
--output tsv \
)
az rest \
--method "GET" \
--url $resourceId/tableRoleDefinitions?api-version=2023-04-15
[
...,
{
"id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql/tableRoleDefinitions/00000000-0000-0000-0000-000000000002",
"name": "00000000-0000-0000-0000-000000000002",
"properties": {
"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/tables/*",
"Microsoft.DocumentDB/databaseAccounts/tables/containers/entities/*"
],
"notDataActions": []
}
],
"roleName": "Cosmos DB Built-in Data Contributor",
"type": "BuiltInRole"
},
"type": "Microsoft.DocumentDB/databaseAccounts/tableRoleDefinitions"
}
...
]
Nota
Per questo esempio, il valore id
sarebbe /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql/tableRoleDefinitions/00000000-0000-0000-0000-000000000002
. In questo esempio vengono usati dati fittizi e l'identificatore è diverso da questo esempio. Questo output di esempio viene troncato.
Usare Get-AzCosmosDBAccount
per ottenere l'identificatore di risorsa dell'account Azure Cosmos DB per tabella esistente e archiviarlo in una variabile. Usare Invoke-AzRestMethod
quindi per elencare tutte le definizioni di ruolo associate all'account Azure Cosmos DB per tabella. Esaminare l'output e individuare la definizione del ruolo denominata Collaboratore dati predefinito di Cosmos DB. L'output contiene l'identificatore univoco della definizione del ruolo nella Id
proprietà . Registrare questo valore perché è necessario usare nel passaggio di assegnazione più avanti in questa guida.
$parameters = @{
ResourceGroupName = "<name-of-existing-resource-group>"
Name = "<name-of-existing-table-account>"
}
$resourceId = (
Get-AzCosmosDBAccount @parameters |
Select-Object -Property Id -First 1
).Id
$parameters = @{
Path = "$resourceId/tableRoleDefinitions?api-version=2023-04-15"
Method = "GET"
}
Invoke-AzRestMethod @parameters
StatusCode : 200
Content : {
"value": [
...,
{
"id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql/tableRoleDefinitions/00000000-0000-0000-0000-000000000002",
"name": "00000000-0000-0000-0000-000000000002",
"properties": {
"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/tables/*",
"Microsoft.DocumentDB/databaseAccounts/tables/containers/entities/*"
],
"notDataActions": []
}
],
"roleName": "Cosmos DB Built-in Data Contributor",
"type": "BuiltInRole"
},
"type": "Microsoft.DocumentDB/databaseAccounts/tableRoleDefinitions"
}
...
]
}
...
Nota
Per questo esempio, il valore Id
sarebbe /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql/tableRoleDefinitions/00000000-0000-0000-0000-000000000002
. In questo esempio vengono usati dati fittizi e l'identificatore è diverso da questo esempio. Questo output di esempio viene troncato.
Assegnare un ruolo all'identità
Assegnare ora il ruolo appena definito a un'identità in modo che le applicazioni possano accedere ai dati in Azure Cosmos DB per tabelle.
Importante
Questa attività di assegnazione richiede di avere l'identificatore univoco di qualsiasi identità che si vuole concedere autorizzazioni di controllo degli accessi in base al ruolo. Se non si dispone di un identificatore univoco per un'identità, seguire le istruzioni riportate nelle guide alla creazione dell'identità gestita o all'accesso.
Usare
az cosmosdb show
per ottenere l'identificatore univoco per l'account corrente.az cosmosdb show \ --resource-group "<name-of-existing-resource-group>" \ --name "<name-of-existing-resource-group>" \ --query "{id:id}"
Osservare l'output del comando precedente. Registrare il valore della
id
proprietà per questo account perché è necessario usare nel passaggio successivo.{ "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql" }
Nota
Per questo esempio, il valore
id
sarebbe/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql
. In questo esempio vengono usati dati fittizi e l'identificatore è diverso da questo esempio.Creare un nuovo file JSON denominato role-assignment.json. Nel file JSON aggiungere l'identificatore univoco per l'identità e l'identificatore univoco per la risorsa account.
{ "properties": { "roleDefinitionId": "<account-resource-id>/tableRoleDefinitions/d3d3d3d3-eeee-ffff-aaaa-b4b4b4b4b4b4", "scope": "<account-resource-id>", "principalId": "<id-of-existing-identity>" } }
Nota
In questo esempio il GUID univoco specificato è .
d3d3d3d3-eeee-ffff-aaaa-b4b4b4b4b4b4
È possibile usare il GUID univoco usato in precedenza per la definizione del ruolo.Creare o aggiornare un'assegnazione di ruolo usando
az cosmosdb show
eaz rest
insieme per inviare una richiesta HTTPPUT
. Come parte di questa richiesta, specificare un GUID univoco per l'assegnazione di ruolo.resourceId=$( \ az cosmosdb show \ --resource-group "<name-of-existing-resource-group>" \ --name "<name-of-existing-table-account>" \ --query "id" \ --output tsv \ ) az rest \ --method "PUT" \ --url $resourceId/tableRoleAssignments/e4e4e4e4-ffff-aaaa-bbbb-c5c5c5c5c5c5?api-version=2023-04-15 \ --body @role-assignment.json
Nota
In questo esempio il GUID univoco specificato è .
e4e4e4e4-ffff-aaaa-bbbb-c5c5c5c5c5c5
È possibile specificare qualsiasi GUID univoco per l'assegnazione di ruolo.
Creare un altro file Bicep per assegnare un ruolo a un'identità. Assegnare al file il nome data-plane-role-assignment.bicep.
metadata description = 'Assign RBAC role for data plane access to Azure Cosmos DB for Table.' @description('Name of the Azure Cosmos DB for Table 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@2023-04-15' existing = { name: accountName } resource assignment 'Microsoft.DocumentDB/databaseAccounts/tableRoleAssignments@2023-04-15' = { name: guid(roleDefinitionId, identityId, account.id) parent: account properties: { principalId: identityId roleDefinitionId: roleDefinitionId scope: account.id } } output id string = assignment.id
Creare un nuovo file di parametri Bicep denominato
data-plane-role-assignment.bicepparam
. In questo file di parametri; assegnare il nome dell'account Azure Cosmos DB per Table esistente alaccountName
parametro , gli identificatori di definizione del ruolo registrati in precedenza alroleDefinitionId
parametro e l'identificatore univoco per l'identità alidentityId
parametro .using './data-plane-role-assignment.bicep' param accountName = '<name-of-existing-table-account>' param roleDefinitionId = '<id-of-new-role-definition>' param identityId = '<id-of-existing-identity>'
Distribuire questo modello Bicep usando
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
Ripetere questi passaggi per concedere l'accesso all'account da qualsiasi altra identità che si vuole usare.
Suggerimento
È possibile ripetere questi passaggi per tutte le identità desiderate. In genere, questi passaggi vengono almeno ripetuti per consentire agli sviluppatori di accedere a un account usando la propria identità umana e consentire alle applicazioni di accedere usando un'identità gestita.
Usare 'Get-AzCosmosDBAccount per ottenere l'identificatore univoco per l'account corrente.
$parameters = @{ ResourceGroupName = "<name-of-existing-resource-group>" Name = "<name-of-existing-nosql-account>" } Get-AzCosmosDBAccount @parameters | Select -Property Id
Osservare l'output del comando precedente. Registrare il valore della
Id
proprietà per questo account perché è necessario usare nel passaggio successivo.Id -- /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql
Nota
Per questo esempio, il valore
Id
sarebbe/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql
. In questo esempio vengono usati dati fittizi e l'identificatore è diverso da questo esempio.Creare o aggiornare un'assegnazione di ruolo usando
Get-AzCosmosDBAccount
eInvoke-AzRestMethod
insieme per inviare una richiesta HTTPPUT
. Come parte di questa richiesta, specificare un GUID univoco per l'assegnazione di ruolo. Infine, creare un payload di assegnazione di risorse specificando l'identificatore univoco per l'identità.$parameters = @{ ResourceGroupName = "<name-of-existing-resource-group>" Name = "<name-of-existing-table-account>" } $resourceId = ( Get-AzCosmosDBAccount @parameters | Select-Object -Property Id -First 1 ).Id $payload = @{ properties = @{ roleDefinitionId = "$resourceId/tableRoleDefinitions/00000000-0000-0000-0000-000000000002" scope = "$resourceId" principalId = "<id-of-existing-identity>" } } $parameters = @{ Path = "$resourceId/tableRoleAssignments/e4e4e4e4-ffff-aaaa-bbbb-c5c5c5c5c5c5?api-version=2023-04-15" Method = "PUT" Payload = $payload | ConvertTo-Json -Depth 2 } Invoke-AzRestMethod @parameters
Nota
In questo esempio il GUID univoco specificato è .
e4e4e4e4-ffff-aaaa-bbbb-c5c5c5c5c5c5
È possibile specificare qualsiasi GUID univoco per l'assegnazione di ruolo.
Convalidare l'accesso al piano dati nel codice
Verificare infine di aver concesso correttamente l'accesso usando il codice dell'applicazione e Azure SDK nel linguaggio di programmazione preferito.
using Azure.Identity;
using Azure.Data.Tables;
string endpoint = "<account-endpoint>";
DefaultAzureCredential credential = new();
TableServiceClient client = new(
endpoint: new Uri(endpoint),
tokenCredential: credential
);
TableClient table = client.GetTableClient(
tableName: "<name-of-table>"
);
Importante
Questo esempio di codice usa le Azure.Data.Tables
librerie e Azure.Identity
di NuGet.
Avviso
Se si usa un'identità gestita assegnata dall'utente, sarà necessario specificare l'identificatore univoco dell'identità gestita durante la creazione dell'oggetto credenziali.