Door het systeem toegewezen beheerde identiteiten gebruiken voor toegang tot Azure Cosmos DB-gegevens

VAN TOEPASSING OP: NoSQL

In dit artikel stelt u een robuuste, sleutelrotatieagnostische oplossing in voor toegang tot Azure Cosmos DB-sleutels met behulp van beheerde identiteiten en op rollen gebaseerd toegangsbeheer voor gegevensvlakken. In het voorbeeld in dit artikel wordt Gebruikgemaakt van Azure Functions, maar u kunt elke service gebruiken die beheerde identiteiten ondersteunt.

U leert hoe u een functie-app maakt die toegang heeft tot Azure Cosmos DB-gegevens zonder dat u Azure Cosmos DB-sleutels hoeft te kopiëren. De functie-app wordt geactiveerd wanneer een HTTP-aanvraag wordt gedaan en vervolgens alle bestaande databases weergeeft.

Vereisten

  • Een Azure-account met een actief abonnement. Gratis een account maken

  • Een bestaand Azure Cosmos DB-API voor NoSQL-account. Een Azure Cosmos DB-API voor NoSQL-account maken

  • Een bestaande Azure Functions-functie-app. Uw eerste functie maken in de Azure-portal

  • Azure Functions Core Tools

  • Als u de stappen in dit artikel wilt uitvoeren, installeert u de Azure CLI en meldt u zich aan bij Azure.

    Controle van vereisten

    1. Sla in een terminal- of opdrachtvenster de namen van uw Azure Functions-functie-app, Het Azure Cosmos DB-account en de resourcegroep op als shellvariabelen met de naam functionName, cosmosNameen resourceGroupName.

      # Variable for function app name
      functionName="msdocs-function-app"
      
      # Variable for Azure Cosmos DB account name
      cosmosName="msdocs-cosmos-app"
      
      # Variable for resource group name
      resourceGroupName="msdocs-cosmos-functions-dotnet-identity"
      

      Notitie

      Deze variabelen worden in latere stappen opnieuw gebruikt. In dit voorbeeld wordt ervan uitgegaan dat uw Azure Cosmos DB-accountnaam is msdocs-cosmos-app, dat de naam van uw functie-app is msdocs-function-app en dat uw resourcegroepnaam is msdocs-cosmos-functions-dotnet-identity.

    2. Bekijk de eigenschappen van de functie-app met behulp van de az functionapp show opdracht.

      az functionapp show \
          --resource-group $resourceGroupName \
          --name $functionName
      
    3. Bekijk de eigenschappen van de door het systeem toegewezen beheerde identiteit voor uw functie-app met behulp van az webapp identity show.

      az webapp identity show \
          --resource-group $resourceGroupName \
          --name $functionName
      
    4. De eigenschappen van het Azure Cosmos DB-account weergeven met behulp van az cosmosdb show.

      az cosmosdb show \
          --resource-group $resourceGroupName \
          --name $cosmosName
      

Azure Cosmos DB-API voor NoSQL-databases maken

In deze stap maakt u twee databases.

  1. Maak in een terminal- of opdrachtvenster een nieuwe products database met behulp van az cosmosdb sql database create.

    az cosmosdb sql database create \
        --resource-group $resourceGroupName \
        --name products \
        --account-name $cosmosName
    
  2. Maak een nieuwe customers database.

    az cosmosdb sql database create \
        --resource-group $resourceGroupName \
        --name customers \
        --account-name $cosmosName
    

Azure Cosmos DB-API voor NoSQL-eindpunt ophalen

In deze stap voert u een query uit op het documenteindpunt voor het API voor NoSQL-account.

  1. Gebruiken az cosmosdb show met de queryparameter ingesteld op documentEndpoint. Noteer het resultaat. U gebruikt deze waarde in een latere stap.

    az cosmosdb show \
        --resource-group $resourceGroupName \
        --name $cosmosName \
        --query documentEndpoint
    
    cosmosEndpoint=$(
        az cosmosdb show \
            --resource-group $resourceGroupName \
            --name $cosmosName \
            --query documentEndpoint \
            --output tsv
    )
    
    echo $cosmosEndpoint
    

    Notitie

    Deze variabele wordt in een latere stap opnieuw gebruikt.

Toegang verlenen tot uw Azure Cosmos DB-account

In deze stap wijst u een rol toe aan de door het systeem toegewezen beheerde identiteit van de functie-app. Azure Cosmos DB heeft meerdere ingebouwde rollen die u kunt toewijzen aan de beheerde identiteit voor toegang tot het besturingsvlak. Voor gegevensvlaktoegang maakt u een nieuwe aangepaste rol met toegang tot leesmetagegevens.

Tip

Zie het artikel Lagere blootstelling aan bevoegde accounts voor meer informatie over het belang van toegang tot minimale bevoegdheden.

  1. Gebruiken az cosmosdb show met de queryparameter ingesteld op id. Sla het resultaat op in een shellvariabele met de naam scope.

    scope=$(
        az cosmosdb show \
            --resource-group $resourceGroupName \
            --name $cosmosName \
            --query id \
            --output tsv
    )
    
    echo $scope
    

    Notitie

    Deze variabele wordt in een latere stap opnieuw gebruikt.

  2. Gebruiken az webapp identity show met de queryparameter ingesteld op principalId. Sla het resultaat op in een shellvariabele met de naam principal.

    principal=$(
        az webapp identity show \
            --resource-group $resourceGroupName \
            --name $functionName \
            --query principalId \
            --output tsv
    )
    
    echo $principal
    
  3. Maak een nieuw JSON-bestand met de configuratie van de nieuwe aangepaste rol.

    {
        "RoleName": "Read Azure Cosmos DB Metadata",
        "Type": "CustomRole",
        "AssignableScopes": ["/"],
        "Permissions": [{
            "DataActions": [
                "Microsoft.DocumentDB/databaseAccounts/readMetadata"
            ]
        }]
    }
    

    Tip

    U kunt een bestand maken in Azure Cloud Shell met behulp van touch <filename> de ingebouwde editor (code .). Zie de Azure Cloud Shell-editor voor meer informatie

  4. Hiermee az cosmosdb sql role definition create maakt u een nieuwe roldefinitie met de naam Read Azure Cosmos DB Metadata met behulp van het aangepaste JSON-object.

    az cosmosdb sql role definition create \
        --resource-group $resourceGroupName \
        --account-name $cosmosName \
        --body @definition.json
    

    Notitie

    In dit voorbeeld wordt de roldefinitie gedefinieerd in een bestand met de naam definition.json.

  5. Hiermee az role assignment create wijst u de rol toe aan de door het Read Azure Cosmos DB Metadata systeem toegewezen beheerde identiteit.

    az cosmosdb sql role assignment create \
        --resource-group $resourceGroupName \
        --account-name $cosmosName \
        --role-definition-name "Read Azure Cosmos DB Metadata" \
        --principal-id $principal \
        --scope $scope
    

Programmatisch toegang krijgen tot de Azure Cosmos DB-sleutels

We hebben nu een functie-app met een door het systeem toegewezen beheerde identiteit met de aangepaste rol. Met de volgende functie-app wordt een query uitgevoerd op het Azure Cosmos DB-account voor een lijst met databases.

  1. Maak een lokaal functieproject met de parameter in een map met de --dotnet naam csmsfunc. De map van uw shell wijzigen

    func init csmsfunc --dotnet
    
    cd csmsfunc
    
  2. Maak een nieuwe functie met de sjabloonparameter ingesteld op httptrigger en de naam ingesteld op readdatabases.

    func new --template httptrigger --name readdatabases
    
  3. Voeg het Azure.IdentityMicrosoft.Azure.Cosmos En NuGet-pakket toe aan het .NET-project. Bouw het project met behulp van dotnet build.

    dotnet add package Azure.Identity
    
    dotnet add package Microsoft.Azure.Cosmos
    
    dotnet build
    
  4. Open de functiecode in een IDE (Integrated Developer Environment).

    Tip

    Als u de Azure CLI lokaal of in de Azure Cloud Shell gebruikt, kunt u Visual Studio Code openen.

    code .
    
  5. Vervang de code in het readdatabases.cs-bestand door deze voorbeeldfunctie-implementatie. Sla het bijgewerkte bestand op.

    using System;
    using System.Collections.Generic;
    using System.Threading.Tasks;
    using Azure.Identity;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Azure.Cosmos;
    using Microsoft.Azure.WebJobs;
    using Microsoft.Azure.WebJobs.Extensions.Http;
    using Microsoft.AspNetCore.Http;
    using Microsoft.Extensions.Logging;
    
    namespace csmsfunc
    {
        public static class readdatabases
        {
            [FunctionName("readdatabases")]
            public static async Task<IActionResult> Run(
                [HttpTrigger(AuthorizationLevel.Anonymous, "get")] HttpRequest req,
                ILogger log)
            {
                log.LogTrace("Start function");
    
                CosmosClient client = new CosmosClient(
                    accountEndpoint: Environment.GetEnvironmentVariable("COSMOS_ENDPOINT", EnvironmentVariableTarget.Process),
                    new DefaultAzureCredential()
                );
    
                using FeedIterator<DatabaseProperties> iterator = client.GetDatabaseQueryIterator<DatabaseProperties>();
    
                List<(string name, string uri)> databases = new();
                while(iterator.HasMoreResults)
                {
                    foreach(DatabaseProperties database in await iterator.ReadNextAsync())
                    {
                        log.LogTrace($"[Database Found]\t{database.Id}");
                        databases.Add((database.Id, database.SelfLink));
                    }
                }
    
                return new OkObjectResult(databases);
            }
        }
    }
    

(Optioneel) De functie lokaal uitvoeren

In een lokale omgeving gebruikt de DefaultAzureCredential klasse verschillende lokale referenties om de huidige identiteit te bepalen. Als u lokaal werkt, is dit niet vereist voor de instructies, kunt u lokaal ontwikkelen met uw eigen identiteit of een service-principal.

  1. Voeg in het bestand local.settings.json een nieuwe instelling toe met de naam COSMOS_ENDPOINT in het object Waarden . De waarde van de instelling moet het documenteindpunt zijn dat u eerder in deze handleiding hebt vastgelegd.

    ...
    "Values": {
        ...
        "COSMOS_ENDPOINT": "https://msdocs-cosmos-app.documents.azure.com:443/",
        ...
    }
    ...
    

    Notitie

    Dit JSON-object is ingekort voor kortheid. Dit JSON-object bevat ook een voorbeeldwaarde die ervan uitgaat dat uw accountnaam is msdocs-cosmos-app.

  2. De functie-app uitvoeren

    func start
    

Implementeren in Azure

Zodra de DefaultAzureCredential klasse is gepubliceerd, worden referenties uit de omgeving of een beheerde identiteit gebruikt. Voor deze handleiding wordt de door het systeem toegewezen beheerde identiteit gebruikt als referentie voor de CosmosClient constructor.

  1. Stel de COSMOS_ENDPOINT instelling in voor de functie-app die al in Azure is geïmplementeerd.

    az functionapp config appsettings set \
        --resource-group $resourceGroupName \
        --name $functionName \
        --settings "COSMOS_ENDPOINT=$cosmosEndpoint"
    
  2. Implementeer uw functie-app in Azure door de functionName shell-variabele opnieuw te gebruiken:

    func azure functionapp publish $functionName
    
  3. Test uw functie in Azure Portal.