Použití spravovaných identit přiřazených systémem pro přístup k datům Azure Cosmos DB

PLATÍ PRO: NoSQL

V tomto článku nastavíte robustní řešení nezávislé na obměně klíčů pro přístup ke klíčům Azure Cosmos DB pomocí spravovaných identit a řízení přístupu na základě role roviny dat. Příklad v tomto článku používá Azure Functions, ale můžete použít libovolnou službu, která podporuje spravované identity.

Dozvíte se, jak vytvořit aplikaci funkcí, která má přístup k datům Azure Cosmos DB, aniž byste museli kopírovat klíče Azure Cosmos DB. Aplikace funkcí se aktivuje, když se vytvoří požadavek HTTP, a pak vypíše všechny existující databáze.

Požadavky

  • Účet Azure s aktivním předplatným. Vytvoření účtu zdarma

  • Existující účet rozhraní API služby Azure Cosmos DB pro NoSQL Vytvoření účtu rozhraní API služby Azure Cosmos DB pro NoSQL

  • Existující aplikace funkcí Azure Functions. Vytvoření první funkce na webu Azure Portal

  • Azure Functions Core Tools

  • Pokud chcete provést kroky v tomto článku, nainstalujte Azure CLI a přihlaste se k Azure.

    Kontrola požadovaných součástí

    1. V terminálu nebo příkazovém okně uložte názvy vaší aplikace funkcí Azure Functions, účtu služby Azure Cosmos DB a skupiny prostředků jako proměnné prostředí s názvem functionName, cosmosNamea 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"
      

      Poznámka:

      Tyto proměnné se znovu použijí v dalších krocích. Tento příklad předpokládá, že název vašeho účtu služby Azure Cosmos DB je msdocs-cosmos-app, název vaší aplikace funkcí je msdocs-function-app a název vaší skupiny prostředků je msdocs-cosmos-functions-dotnet-identity.

    2. Pomocí příkazu zobrazte vlastnosti az functionapp show aplikace funkcí.

      az functionapp show \
          --resource-group $resourceGroupName \
          --name $functionName
      
    3. Umožňuje zobrazit vlastnosti spravované identity přiřazené systémem pro vaši aplikaci funkcí pomocí az webapp identity show.

      az webapp identity show \
          --resource-group $resourceGroupName \
          --name $functionName
      
    4. Zobrazte vlastnosti účtu služby Azure Cosmos DB pomocí az cosmosdb show.

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

Vytvoření databází Azure Cosmos DB API pro NoSQL

V tomto kroku vytvoříte dvě databáze.

  1. V terminálu nebo příkazovém okně vytvořte novou products databázi pomocí az cosmosdb sql database createpříkazu .

    az cosmosdb sql database create \
        --resource-group $resourceGroupName \
        --name products \
        --account-name $cosmosName
    
  2. Vytvořte novou customers databázi.

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

Získání koncového bodu rozhraní API služby Azure Cosmos DB pro NoSQL

V tomto kroku se budete dotazovat na koncový bod dokumentu pro účet rozhraní API pro NoSQL.

  1. Používá se az cosmosdb show s parametrem dotazu nastaveným na documentEndpointhodnotu . Zaznamenejte výsledek. Tuto hodnotu použijete v pozdějším kroku.

    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
    

    Poznámka:

    Tato proměnná se znovu použije v pozdějším kroku.

Udělení přístupu k účtu služby Azure Cosmos DB

V tomto kroku přiřadíte roli spravované identitě přiřazené systémem aplikace funkcí. Azure Cosmos DB má několik předdefinovaných rolí, které můžete přiřadit spravované identitě pro přístup k rovině řízení. Pro přístup roviny dat vytvoříte novou vlastní roli s přístupem k metadatům čtení.

Tip

Další informace o důležitosti přístupu s nejnižšími oprávněními najdete v článku Nižší expozice privilegovaných účtů .

  1. Používá se az cosmosdb show s parametrem dotazu nastaveným na idhodnotu . Uložte výsledek do proměnné prostředí s názvem scope.

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

    Poznámka:

    Tato proměnná se znovu použije v pozdějším kroku.

  2. Používá se az webapp identity show s parametrem dotazu nastaveným na principalIdhodnotu . Uložte výsledek do proměnné prostředí s názvem principal.

    principal=$(
        az webapp identity show \
            --resource-group $resourceGroupName \
            --name $functionName \
            --query principalId \
            --output tsv
    )
    
    echo $principal
    
  3. Vytvořte nový soubor JSON s konfigurací nové vlastní role.

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

    Tip

    Soubor můžete vytvořit v Azure Cloud Shellu pomocí integrovaného touch <filename> editoru (code .). Další informace najdete v editoru Azure Cloud Shellu.

  4. Slouží az cosmosdb sql role definition create k vytvoření nové definice role pojmenované Read Azure Cosmos DB Metadata pomocí vlastního objektu JSON.

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

    Poznámka:

    V tomto příkladu je definice role definována v souboru s názvem definition.json.

  5. Slouží az role assignment create k přiřazení Read Azure Cosmos DB Metadata role spravované identitě přiřazené systémem.

    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
    

Přístup ke klíčům Služby Azure Cosmos DB prostřednictvím kódu programu

Teď máme aplikaci funkcí, která má spravovanou identitu přiřazenou systémem s vlastní rolí. Následující aplikace funkcí dotazuje účet služby Azure Cosmos DB na seznam databází.

  1. Vytvořte projekt místní funkce s --dotnet parametrem ve složce s názvem csmsfunc. Změna adresáře prostředí

    func init csmsfunc --dotnet
    
    cd csmsfunc
    
  2. Vytvořte novou funkci s parametrem šablony nastaveným na httptrigger a názvem nastaveným na readdatabases.

    func new --template httptrigger --name readdatabases
    
  3. Azure.Identity Přidejte balíček NuGet Microsoft.Azure.Cosmos do projektu .NET. Sestavte projekt pomocí dotnet build.

    dotnet add package Azure.Identity
    
    dotnet add package Microsoft.Azure.Cosmos
    
    dotnet build
    
  4. Otevřete kód funkce v integrovaném vývojovém prostředí (IDE).

    Tip

    Pokud používáte Azure CLI místně nebo v Azure Cloud Shellu, můžete otevřít Visual Studio Code.

    code .
    
  5. Nahraďte kód v souboru readdatabases.cs touto ukázkovou implementací funkce. Aktualizovaný soubor uložte.

    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);
            }
        }
    }
    

(Volitelné) Místní spuštění funkce

V místním prostředí DefaultAzureCredential třída použije k určení aktuální identity různé místní přihlašovací údaje. Přestože se postup nevyžaduje místně, můžete vyvíjet místně pomocí vlastní identity nebo instančního objektu.

  1. Do souboru local.settings.json přidejte nové nastavení pojmenované COSMOS_ENDPOINT v objektu Values. Hodnota nastavení by měla být koncový bod dokumentu, který jste si poznamenali dříve v tomto průvodci postupy.

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

    Poznámka:

    Tento objekt JSON byl zkrácen pro stručnost. Tento objekt JSON obsahuje také ukázkovou hodnotu, která předpokládá název vašeho účtu .msdocs-cosmos-app

  2. Spuštění aplikace funkcí

    func start
    

Nasazení do Azure

Po publikování DefaultAzureCredential třída použije přihlašovací údaje z prostředí nebo spravované identity. Pro tuto příručku se spravovaná identita přiřazená systémem použije jako přihlašovací údaje pro CosmosClient konstruktor.

  1. COSMOS_ENDPOINT Nastavte nastavení aplikace funkcí, která je už nasazená v Azure.

    az functionapp config appsettings set \
        --resource-group $resourceGroupName \
        --name $functionName \
        --settings "COSMOS_ENDPOINT=$cosmosEndpoint"
    
  2. Nasaďte aplikaci funkcí do Azure opětovným použitím functionName proměnné prostředí:

    func azure functionapp publish $functionName
    
  3. Otestujte funkci na webu Azure Portal.