Cvičení – přístup k tajným kódům uloženým v Azure Key Vaultu

Dokončeno

Víte, jak povolení spravovaných identit pro prostředky Azure vytvoří identitu, kterou bude vaše aplikace používat k ověřování. Teď vytvořte aplikaci, která používá danou identitu pro přístup k tajným kódům v trezoru.

Čtení tajných kódů v aplikaci ASP.NET Core

Rozhraní API služby Azure Key Vault je rozhraní REST API, které zpracovává veškerou správu a používání klíčů a trezorů. Každý tajný klíč v trezoru má jedinečnou adresu URL. Hodnoty tajných kódů se načítají pomocí požadavků HTTP GET.

Oficiální klient služby Key Vault pro .NET Core je SecretClient třída v Azure.Security.KeyVault.Secrets balíčku NuGet. Nemusíte ho ale používat přímo. S použitím metody AddAzureKeyVault v ASP.NET Core můžete načíst všechny tajné kódy z trezoru do rozhraní Configuration API při spuštění. Tato technika umožňuje přístup ke všem tajným kódům pomocí názvu pomocí stejného IConfiguration rozhraní, které používáte pro zbytek konfigurace. Aplikace, které používají AddAzureKeyVault trezor, List vyžadují jak oprávnění, tak Get oprávnění k trezoru.

Tip

Bez ohledu na architekturu nebo jazyk, který používáte k sestavení aplikace, byste ji měli navrhnout tak, aby ukážela hodnoty tajných kódů místně nebo je načítá do paměti při spuštění, pokud nemáte konkrétní důvod, proč ne. Jejich čtení přímo z trezoru při každém použití je zbytečně pomalé a drahé.

AddAzureKeyVault Vyžaduje pouze název trezoru jako vstup, který získáte z konfigurace místní aplikace. Také automaticky zpracovává ověřování spravovaných identit. Když se používá v aplikaci nasazené do služby Aplikace Azure Service se spravovanými identitami pro prostředky Azure, zjistí službu tokenů spravovaných identit a použije ji k ověření. Je vhodný pro většinu scénářů a implementuje všechny osvědčené postupy. Použijete ho ve cvičení této lekce.

Čtení tajných kódů v aplikaci Node.js

Rozhraní API služby Azure Key Vault je rozhraní REST API, které zpracovává veškerou správu a používání klíčů a trezorů. Každý tajný klíč v trezoru má jedinečnou adresu URL. Hodnoty tajných kódů se načítají pomocí požadavků HTTP GET.

Oficiální klient služby Key Vault pro aplikace Node.js je třída SecretClient v balíčku npm @azure/keyvault-secrets. Aplikace, které do své konfigurace nebo kódu obsahují názvy tajných kódů, obvykle používají svou getSecret metodu, která načte hodnotu tajného kódu s daným názvem. getSecret vyžaduje, aby identita vaší aplikace měla Get oprávnění k trezoru. Aplikace navržené k načtení všech tajných kódů z trezoru také používají metodu listPropertiesOfSecrets , která načte seznam tajných kódů a vyžaduje oprávnění List .

Než bude vaše aplikace moct vytvořit instanci SecretClient, musí získat objekt přihlašovacích údajů pro ověření v trezoru. Pokud chcete provést ověření, použijte DefaultAzureCredential z balíčku npm @azure/identity. Je DefaultAzureCredential vhodné pro většinu scénářů, kdy je aplikace určená ke konečnému spuštění v Cloudu Azure, protože DefaultAzureCredential kombinuje přihlašovací údaje, které se běžně používají k ověřování při nasazení, s přihlašovacími údaji použitými k ověření ve vývojovém prostředí. Pokusy DefaultAzureCredential o ověření pomocí následujících mechanismů v pořadí:

  • Prostředí. Přečte DefaultAzureCredential informace o účtu zadané pomocí proměnných prostředí a použije je k ověření.
  • Spravovaná identita Pokud je aplikace nasazená na hostitele Azure s povolenou spravovanou identitou, ověří se DefaultAzureCredential u daného účtu.
  • Visual Studio Code. Pokud se vývojář ověřil pomocí modulu plug-in Azure Account editoru Visual Studio Code, ověří se DefaultAzureCredential u daného účtu.
  • Rozhraní příkazového řádku Azure. Pokud vývojář ověřil účet pomocí příkazu Azure CLI az login , DefaultAzureCredential ověří se u daného účtu.

Další informace najdete v dokumentaci.

Tip

Bez ohledu na architekturu nebo jazyk, který používáte k sestavení aplikace, byste ji měli navrhnout tak, aby ukážela hodnoty tajných kódů místně nebo je načítá do paměti při spuštění, pokud nemáte konkrétní důvod, proč ne. Jejich čtení přímo z trezoru při každém použití je zbytečně pomalé a drahé.

Používání tajných kódů v aplikaci

Po načtení tajného kódu do aplikace už záleží na aplikaci, aby s ním nakládala bezpečně. V aplikaci, kterou sestavíte v tomto modulu, napíšete hodnotu tajného kódu do odpovědi klienta a předvedete, že se úspěšně načetla, zobrazíte ji ve webovém prohlížeči. Návrat tajného kódu klientovi není něco, co byste měli běžně dělat! Tajné kódy obvykle slouží k inicializaci klientských knihoven pro databáze nebo vzdálená rozhraní API.

Důležité

Vždy pečlivě zkontrolujte kód, abyste zajistili, že vaše aplikace nikdy nezapisuje tajné kódy do jakéhokoli druhu výstupu, včetně protokolů, úložiště a odpovědí.

Cvičení

Pokud chcete načíst tajný kód z našeho trezoru, vytvoříte nové webové rozhraní API ASP.NET Core a použijete AddAzureKeyVaultho .

Vytvoření aplikace

  1. Pokud chcete vytvořit novou aplikaci webového rozhraní API ASP.NET Core a otevřít ji v editoru, spusťte v Azure Cloud Shellu následující příkazy.

    dotnet new webapi -o KeyVaultDemoApp
    cd KeyVaultDemoApp
    code .
    
  2. Po načtení editoru přidejte balíček NuGet obsahující AddAzureKeyVault a obnovte všechny závislosti aplikace. V Azure Cloud Shellu spusťte následující příkazy.

    dotnet add package Azure.Identity
    dotnet add package Azure.Extensions.AspNetCore.Configuration.Secrets
    dotnet restore
    

Přidání kódu pro načtení a použití tajných kódů

Pokud chcete předvést dobré použití služby Key Vault, upravte aplikaci tak, aby při spuštění načítá tajné kódy z trezoru. Přidáte také nový kontroler s koncovým bodem, který získá váš SecretPassword tajný kód z trezoru.

  1. Pro spuštění aplikace zadejte následující příkaz, který spustí editor.

    code .
    
  2. Otevřete Program.cs, odstraňte obsah a nahraďte je následujícím kódem.

    using System;
    using Azure.Identity;
    using Microsoft.AspNetCore;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.Hosting;
    
    namespace KeyVaultDemoApp
    {
        public class Program
        {
            public static void Main(string[] args)
            {
                CreateHostBuilder(args).Build().Run();
            }
    
            public static IHostBuilder CreateHostBuilder(string[] args) =>
                Host.CreateDefaultBuilder(args)
                    .ConfigureWebHostDefaults(webBuilder =>
                    {
                        webBuilder.UseStartup<Startup>();
                    })
                    .ConfigureAppConfiguration((context, config) =>
                    {
                        // Build the current set of configuration to load values from
                        // JSON files and environment variables, including VaultName.
                        var builtConfig = config.Build();
    
                        // Use VaultName from the configuration to create the full vault URI.
                        var vaultName = builtConfig["VaultName"];
                        Uri vaultUri = new Uri($"https://{vaultName}.vault.azure.net/");
    
                        // Load all secrets from the vault into configuration. This will automatically
                        // authenticate to the vault using a managed identity. If a managed identity
                        // is not available, it will check if Visual Studio and/or the Azure CLI are
                        // installed locally and see if they are configured with credentials that can
                        // access the vault.
                        config.AddAzureKeyVault(vaultUri, new DefaultAzureCredential());
                    });
        }
    }
    

    Důležité

    Až dokončíte úpravy souborů, nezapomeňte je uložit. Soubory můžete uložit buď pomocí příkazu .... nebo klávesa akcelerátoru (Ctrl+S ve Windows a Linuxu, Cmd+S v macOS).

    Jediná změna oproti výchozímu kódu je přidání ConfigureAppConfiguration. Tento prvek je místo, kde načteme název trezoru z konfigurace a zavoláme AddAzureKeyVault ho.

  3. Pro kontroler vytvořte nový soubor ve Controllers složce s názvem SecretTestController.csa vložte následující kód.

    Tip

    Pokud chcete vytvořit nový soubor, použijte příkaz v Cloud Shellu touch . V tomto případě spusťte touch Controllers/SecretTestController.cs příkaz. Pokud ho chcete najít v pravém horním rohu podokna Soubory editoru, vyberte ikonu Aktualizovat.

    using System;
    using Microsoft.AspNetCore.Http;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Extensions.Configuration;
    
    namespace KeyVaultDemoApp.Controllers
    {
        [Route("api/[controller]")]
        public class SecretTestController : ControllerBase
        {
            private readonly IConfiguration _configuration;
    
            public SecretTestController(IConfiguration configuration)
            {
                _configuration = configuration;
            }
    
            [HttpGet]
            public IActionResult Get()
            {
                // Get the secret value from configuration. This can be done anywhere
                // we have access to IConfiguration. This does not call the Key Vault
                // API, because the secrets were loaded at startup.
                var secretName = "SecretPassword";
                var secretValue = _configuration[secretName];
    
                if (secretValue == null)
                {
                    return StatusCode(
                        StatusCodes.Status500InternalServerError,
                        $"Error: No secret named {secretName} was found...");
                }
                else {
                    return Content($"Secret value: {secretValue}" +
                        Environment.NewLine + Environment.NewLine +
                        "This is for testing only! Never output a secret " +
                        "to a response or anywhere else in a real app!");
                }
            }
        }
    }
    
  4. Spuštěním dotnet build příkazu v Azure Cloud Shellu se ujistěte, že se všechno zkompiluje. Aplikace je připravená ke spuštění. Teď je čas ho dostat do Azure!

Vytvořte nové webové rozhraní API pomocí Express.js a pomocí @azure/keyvault-secrets balíčků načtěte @azure/identity tajný kód z našeho trezoru.

Vytvoření aplikace

Spuštěním následujícího kódu v Azure Cloud Shellu inicializujete novou aplikaci Node.js, nainstalujte potřebné balíčky a otevřete nový soubor v editoru.

mkdir KeyVaultDemoApp
cd KeyVaultDemoApp
npm init -y
npm install @azure/identity @azure/keyvault-secrets express
touch app.js
code app.js

Přidání kódu pro načtení a použití tajných kódů

Aby bylo možné předvést dobré použití služby Key Vault, vaše aplikace načítá tajné kódy z trezoru při spuštění. Abyste si ukázali, že se tajné kódy načetly, vytvořte koncový bod, který zobrazuje hodnotu tajného SecretPassword kódu.

  1. Pokud chcete aplikaci nastavit, vložte do editoru následující kód. Tento kód naimportuje potřebné balíčky, nastaví konfiguraci identifikátoru URI portu a trezoru a vytvoří nový objekt pro uložení názvů a hodnot tajných kódů.

    // Importing dependencies
    const { DefaultAzureCredential } = require("@azure/identity");
    const { SecretClient } = require("@azure/keyvault-secrets");
    const app = require('express')();
    
    // Initialize port
    const port = process.env.PORT || 3000;
    
    // Create Vault URI from App Settings
    const vaultUri = `https://${process.env.VaultName}.vault.azure.net/`;
    
    // Map of key vault secret names to values
    let vaultSecretsMap = {};
    

    Důležité

    Ujistěte se, že při práci soubory ukládáte, zejména, když práci dokončíte. Soubory můžete uložit buď pomocí příkazu .... nebo klávesa akcelerátoru (Ctrl+S ve Windows a Linuxu, Cmd+S v macOS).

  2. Dále přidejte kód pro ověření do trezoru a načtěte tajné kódy. Tento kód přidáte jako dvě samostatné funkce. Za dříve přidaný kód vložte několik prázdných řádků a potom vložte následující kód.

    const getKeyVaultSecrets = async () => {
      // Create a key vault secret client
      let secretClient = new SecretClient(vaultUri, new DefaultAzureCredential());
      try {
        // Iterate through each secret in the vault
        listPropertiesOfSecrets = secretClient.listPropertiesOfSecrets();
        while (true) {
          let { done, value } = await listPropertiesOfSecrets.next();
          if (done) {
            break;
          }
          // Only load enabled secrets - getSecret will return an error for disabled secrets
          if (value.enabled) {
            const secret = await secretClient.getSecret(value.name);
            vaultSecretsMap[value.name] = secret.value;
          }
        }
      } catch(err) {
        console.log(err.message)
      }
    }
    
  3. Vytvořte koncový bod Express, abyste otestovali načtení tajného kódu. Vložte tento kód.

    app.get('/api/SecretTest', (req, res) => {
      let secretName = 'SecretPassword';
      let response;
      if (secretName in vaultSecretsMap) {
        response = `Secret value: ${vaultSecretsMap[secretName]}\n\nThis is for testing only! Never output a secret to a response or anywhere else in a real app!`;
      } else {
        response = `Error: No secret named ${secretName} was found...`
      }
      res.type('text');
      res.send(response);
    });
    
  4. Voláním funkcí načtěte tajné kódy z našeho trezoru a pak spusťte aplikaci. Dokončete aplikaci vložením této poslední části kódu.

    (async () =>  {
      await getKeyVaultSecrets();
      app.listen(port, () => {
        console.log(`Server running at http://localhost:${port}`);
      });
    })().catch(err => console.log(err));
    
  5. Napsali jste kód, takže nezapomeňte soubor uložit.

Aplikace je připravená ke spuštění. Teď je čas ho dostat do Azure!