Använda rollbaserad åtkomstkontroll med Azure Cosmos DB for Table (förhandsversion)
Diagram över sekvensen i distributionsguiden, inklusive dessa platser, i ordning: Översikt, Begrepp, Förbereda, Rollbaserad åtkomstkontroll och Referens. Platsen rollbaserad åtkomstkontroll är för närvarande markerad.
Den här artikeln går igenom stegen för att bevilja en identitet åtkomst för att hantera data i ett Azure Cosmos DB för tabellkonto. Stegen i den här artikeln omfattar endast åtkomst till dataplan för att utföra åtgärder på enskilda objekt och köra frågor.
Förutsättningar
- Ett Azure-konto med en aktiv prenumeration. Skapa ett konto utan kostnad.
- Ett befintligt Azure Cosmos DB för tabellkonto.
- En eller flera befintliga identiteter i Microsoft Entra-ID.
Använd Bash-miljön i Azure Cloud Shell. Mer information finns i Snabbstart för Bash i Azure Cloud Shell.
Om du föredrar att köra CLI-referenskommandon lokalt installerar du Azure CLI. Om du kör i Windows eller macOS kan du köra Azure CLI i en Docker-container. Mer information finns i Så här kör du Azure CLI i en Docker-container.
Om du använder en lokal installation loggar du in på Azure CLI med hjälp av kommandot az login. Slutför autentiseringsprocessen genom att följa stegen som visas i terminalen. Andra inloggningsalternativ finns i Logga in med Azure CLI.
När du uppmanas att installera Azure CLI-tillägget vid första användningen. Mer information om tillägg finns i Använda tillägg med Azure CLI.
Kör az version om du vill hitta versionen och de beroende bibliotek som är installerade. Om du vill uppgradera till den senaste versionen kör du az upgrade.
Förbereda rolldefinition
Först måste du förbereda en rolldefinition med en lista över dataActions
för att ge åtkomst till läsning, frågor och hantera data i Azure Cosmos DB för tabell.
Hämta först resursidentifieraren för det befintliga Azure Cosmos DB för tabellkontot med och az cosmsodb show
lagra det i en variabel. Visa sedan en lista över alla rolldefinitioner som är associerade med ditt Azure Cosmos DB för tabellkonto med hjälp av az rest
. Granska slutligen utdata och leta upp rolldefinitionen med namnet Inbyggd Datadeltagare i Cosmos DB. Utdata innehåller den unika identifieraren för rolldefinitionen i egenskapen id
. Registrera det här värdet som det krävs för att använda i tilldelningssteget senare i den här guiden.
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"
}
...
]
Kommentar
I det här exemplet id
skulle värdet vara /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql/tableRoleDefinitions/00000000-0000-0000-0000-000000000002
. I det här exemplet används fiktiva data och identifieraren skulle skilja sig från det här exemplet. Det här exemplets utdata trunkeras.
Använd Get-AzCosmosDBAccount
för att hämta resursidentifieraren för det befintliga Azure Cosmos DB för tabellkontot och lagra det i en variabel. Invoke-AzRestMethod
Använd sedan för att lista alla rolldefinitioner som är associerade med ditt Azure Cosmos DB för tabellkonto. Granska utdata och leta upp rolldefinitionen med namnet Cosmos DB Built-in Data Contributor. Utdata innehåller den unika identifieraren för rolldefinitionen i egenskapen Id
. Registrera det här värdet som det krävs för att använda i tilldelningssteget senare i den här guiden.
$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"
}
...
]
}
...
Kommentar
I det här exemplet Id
skulle värdet vara /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql/tableRoleDefinitions/00000000-0000-0000-0000-000000000002
. I det här exemplet används fiktiva data och identifieraren skulle skilja sig från det här exemplet. Det här exemplets utdata trunkeras.
Tilldela roll till identitet
Tilldela nu den nyligen definierade rollen till en identitet så att dina program kan komma åt data i Azure Cosmos DB för Table.
Viktigt!
Den här tilldelningsuppgiften kräver att du har den unika identifieraren för alla identiteter som du vill bevilja rollbaserade behörigheter för åtkomstkontroll. Om du inte har en unik identifierare för en identitet följer du anvisningarna i guiderna för att skapa hanterad identitet eller skaffa inloggningsidentitet .
Använd
az cosmosdb show
för att hämta den unika identifieraren för ditt aktuella konto.az cosmosdb show \ --resource-group "<name-of-existing-resource-group>" \ --name "<name-of-existing-resource-group>" \ --query "{id:id}"
Observera utdata från föregående kommando. Registrera värdet
id
för egenskapen för det här kontot som det krävs för att använda i nästa steg.{ "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql" }
Kommentar
I det här exemplet
id
skulle värdet vara/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql
. I det här exemplet används fiktiva data och identifieraren skulle skilja sig från det här exemplet.Skapa en ny JSON-fil med namnet role-assignment.json. I JSON-filen lägger du till den unika identifieraren för din identitet och unika identifierare för kontoresursen.
{ "properties": { "roleDefinitionId": "<account-resource-id>/tableRoleDefinitions/d3d3d3d3-eeee-ffff-aaaa-b4b4b4b4b4b4", "scope": "<account-resource-id>", "principalId": "<id-of-existing-identity>" } }
Kommentar
I det här exemplet var det unika GUID som angavs
d3d3d3d3-eeee-ffff-aaaa-b4b4b4b4b4b4
. Du kan använda det unika GUID som du använde tidigare för din egen rolldefinition.Skapa eller uppdatera nu en rolltilldelning med hjälp av
az cosmosdb show
ochaz rest
tillsammans för att utfärda en HTTP-begäranPUT
. Som en del av den här begäran anger du ett unikt GUID för din rolltilldelning.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
Kommentar
I det här exemplet var det unika GUID som angavs
e4e4e4e4-ffff-aaaa-bbbb-c5c5c5c5c5c5
. Du kan ange ett unikt GUID för din egen rolltilldelning.
Skapa en annan Bicep-fil för att tilldela en roll till en identitet. Ge filen namnet 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
Skapa en ny Bicep-parameterfil med namnet
data-plane-role-assignment.bicepparam
. I den här parameterfilen; tilldela namnet på ditt befintliga Azure Cosmos DB för tabellkonto till parameternaccountName
, de tidigare registrerade rolldefinitionsidentifierarna till parameternroleDefinitionId
och den unika identifieraren för din identitet till parameternidentityId
.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>'
Distribuera den här Bicep-mallen med .
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
Upprepa de här stegen för att bevilja åtkomst till kontot från andra identiteter som du vill använda.
Dricks
Du kan upprepa de här stegen för så många identiteter som du vill. Vanligtvis upprepas de här stegen åtminstone för att ge utvecklare åtkomst till ett konto med hjälp av sin mänskliga identitet och för att tillåta programåtkomst med hjälp av en hanterad identitet.
Använd Get-AzCosmosDBAccount för att hämta den unika identifieraren för ditt aktuella konto.
$parameters = @{ ResourceGroupName = "<name-of-existing-resource-group>" Name = "<name-of-existing-nosql-account>" } Get-AzCosmosDBAccount @parameters | Select -Property Id
Observera utdata från föregående kommando. Registrera värdet
Id
för egenskapen för det här kontot som det krävs för att använda i nästa steg.Id -- /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql
Kommentar
I det här exemplet
Id
skulle värdet vara/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql
. I det här exemplet används fiktiva data och identifieraren skulle skilja sig från det här exemplet.Skapa eller uppdatera nu en rolltilldelning med hjälp av
Get-AzCosmosDBAccount
ochInvoke-AzRestMethod
tillsammans för att utfärda en HTTP-begäranPUT
. Som en del av den här begäran anger du ett unikt GUID för din rolltilldelning. Skapa slutligen en nyttolast för resurstilldelning som anger den unika identifieraren för din identitet.$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
Kommentar
I det här exemplet var det unika GUID som angavs
e4e4e4e4-ffff-aaaa-bbbb-c5c5c5c5c5c5
. Du kan ange ett unikt GUID för din egen rolltilldelning.
Verifiera dataplansåtkomst i kod
Kontrollera slutligen att du har beviljat åtkomst korrekt med hjälp av programkod och Azure SDK på önskat programmeringsspråk.
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>"
);
Viktigt!
Det här kodexemplet använder biblioteken Azure.Data.Tables
och Azure.Identity
från NuGet.
Varning
Om du använder en användartilldelad hanterad identitet måste du ange den unika identifieraren för den hanterade identiteten som en del av skapandet av autentiseringsuppgifterna.