Dela via


Använda rollbaserad åtkomstkontroll för dataplan med Azure Cosmos DB för NoSQL

GÄLLER FÖR: NoSQL

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 NoSQL-konto.

Viktigt!

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. Information om hur du hanterar databaser och containrar för kontrollplanet finns i Bevilja rollbaserad åtkomst för kontrollplanet.

Förutsättningar

  • Ett Azure-konto med en aktiv prenumeration. Skapa ett konto utan kostnad.
  • Ett befintligt Azure Cosmos DB för NoSQL-konto.
  • 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 NoSQL.

Viktigt!

För att få en befintlig rolldefinition för dataplanet krävs följande behörigheter för kontrollplanet:

  • Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions/read

För mer information, se bevilja rollbaserad åtkomst för kontrollplan.

Visa en lista över alla rolldefinitioner som är associerade med ditt Azure Cosmos DB för NoSQL-konto med .az cosmosdb sql role definition list 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.

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"
  }
  ...
]

Anmärkning

I det här exemplet skulle id värdet vara /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql/sqlRoleDefinitions/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.

Använd Get-AzCosmosDBSqlRoleDefinition för att lista alla rolldefinitioner som är associerade med ditt Azure Cosmos DB för NoSQL-konto. 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>"
    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 : 

Anmärkning

I det här exemplet skulle Id värdet vara /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql/sqlRoleDefinitions/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. Identifieraren (00000000-0000-0000-0000-000000000002) är dock unik för alla rolldefinitioner i ditt konto.

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

Viktigt!

För att skapa en ny rolltilldelning för dataplanet krävs följande behörigheter för kontrollplanet:

  • Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions/read
  • Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments/read
  • Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments/write

Mer information finns i bevilja rollbaserad åtkomst för kontrollplanet.

  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-nosql-account>" \
        --query "{id:id}"
    
  2. Observera utdata från föregående kommando. Registrera värdet för egenskapen id för det här kontot, eftersom det behövs för att användas i nästa steg.

    {
      "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql"
    }
    

    Anmärkning

    I det här exemplet skulle id 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. Tilldela den nya rollen med .az cosmosdb sql role assignment create Använd tidigare registrerade rolldefinitionsidentifierare till --role-definition-id argumentet och den unika identifieraren för din identitet till --principal-id argumentet. Använd slutligen ditt kontos identifierare för --scope argumentet.

    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"
    

    Tips/Råd

    Om du försöker bevilja rollbaserad åtkomstkontroll för dataplanet till din identitet kan du använda det här kommandot för att få fram identiteten:

    az ad signed-in-user show
    

    Mer information finns i az ad signed-in-user.

  4. Använd az cosmosdb sql role assignment list för att lista alla rolltilldelningar för ditt Azure Cosmos DB för NoSQL-konto. Granska utdata för att säkerställa att rolltilldelningen har skapats.

    az cosmosdb sql role assignment list \
        --resource-group "<name-of-existing-resource-group>" \
        --account-name "<name-of-existing-nosql-account>"
    
  1. Skapa en ny Bicep-fil för att definiera rolltilldelningen. Namnge filen 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 = deployer().objectId
    
    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. Skapa en ny Bicep-parameterfil med namnet data-plane-role-assignment.bicepparam. I den här parameterfilen tilldelar du namnet på ditt befintliga Azure Cosmos DB för NoSQL-konto 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-nosql-account>'
    param roleDefinitionId = '<id-of-new-role-definition>'
    param identityId = '<id-of-existing-identity>'
    

    Tips/Råd

    Om du försöker bevilja rollbaserad åtkomstkontroll för dataplanet till din egen identitet kan du utelämna parametern identityId . Bicep-mallen kommer sedan att använda deployer().objectId för att hämta identiteten för den huvudprincipalen som har distribuerat mallen. Mer information finns i deployer.

  3. Distribuera Bicep-mallen med hjälp av 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.

    Tips/Råd

    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 deras mänskliga identitet. Du kan också upprepa de här stegen för att tillåta program att komma åt resurser med hjälp av en hanterad identitet.

  1. Använd Get-AzCosmosDBAccount för att hämta metadata 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 för egenskapen Id för det här kontot, eftersom det behövs för att användas i nästa steg.

    Id
    --    
    /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql
    

    Anmärkning

    I det här exemplet skulle Id 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. Använd New-AzCosmosDBSqlRoleAssignment för att tilldela den nya rollen. Använd de tidigare registrerade rolldefinitionsidentifierarna för parametern RoleDefinitionId och den unika identifieraren för din identitet till parametern PrincipalId . Slutligen använder du ditt kontos identifierare för parametern 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
    

    Tips/Råd

    Om du försöker bevilja rollbaserad åtkomstkontroll för dataplanet för din egen identitet kan du använda det här kommandot för att hämta identiteten.

    Get-AzADUser -SignedIn | Format-List `
        -Property Id, DisplayName, Mail, UserPrincipalName
    

    Mer information finns i Get-AzADUser.

  4. Visa en lista över alla rolltilldelningar för ditt Azure Cosmos DB för NoSQL-konto med .Get-AzCosmosDBSqlRoleAssignment Granska resultatet för att se till att din rolltilldelning har skapats.

    $parameters = @{
        ResourceGroupName = "<name-of-existing-resource-group>"
        AccountName = "<name-of-existing-nosql-account>"
    }
    Get-AzCosmosDBSqlRoleAssignment @parameters
    

Verifiera dataplanå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.Core;
using Azure.Identity;
using Microsoft.Azure.Cosmos;

string endpoint = "<account-endpoint>";

TokenCredential credential = new DefaultAzureCredential();

CosmosClient client = new(endpoint, credential);

Container container = client.GetContainer("<database-name>", "<container-name>");

await container.ReadItemAsync<dynamic>("<item-id>", new PartitionKey("<partition-key>"));

Viktigt!

Det här kodexemplet använder biblioteken Microsoft.Azure.Cosmos och Azure.Identity från NuGet.