Dela via


Använda rollbaserad åtkomstkontroll med Azure Cosmos DB for Table (förhandsversion)

Diagram över den aktuella platsen (rollbaserad åtkomstkontroll) i sekvensen i distributionsguiden.

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.

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 .

  1. 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}"
    
  2. 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.

  3. 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.

  4. Skapa eller uppdatera nu en rolltilldelning med hjälp av az cosmosdb show och az rest tillsammans för att utfärda en HTTP-begäran PUT . 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.

  1. 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
    
  2. 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 parametern accountName , de tidigare registrerade rolldefinitionsidentifierarna till parametern roleDefinitionId och den unika identifieraren för din identitet till parametern identityId .

    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>'
    
  3. 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
    
  4. 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.

  1. 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
    
  2. 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.

  3. Skapa eller uppdatera nu en rolltilldelning med hjälp av Get-AzCosmosDBAccount och Invoke-AzRestMethod tillsammans för att utfärda en HTTP-begäran PUT . 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.