Cvičení – přístup k tajným kódům uloženým v Azure Key Vaultu
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 rozhraní API použije v aplikaci nasazené do služby Aplikace Azure Service s povolenými 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í:
- Životní 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. Vrácení hodnoty tajného kódu klientovi není něco, co byste normálně měli udě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 AddAzureKeyVault
ho .
Vytvoření aplikace
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 .
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, který načte a používá tajné kódy
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.
Pro spuštění aplikace zadejte následující příkaz, který spustí editor.
code .
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ámeAddAzureKeyVault
ho.Pro kontroler vytvořte nový soubor ve
Controllers
složce s názvemSecretTestController.cs
a 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ťtetouch 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!"); } } } }
dotnet build
Spusťte příkaz v Azure Cloud Shellu a ujistěte se, ž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 s Express.js a pomocí @azure/keyvault-secrets
@azure/identity
balíčků načtěte tajný kód z našeho trezoru.
Vytvoření aplikace
Spuštěním následujícího kódu v Azure Cloud Shellu inicializujte novou Node.js aplikaci, 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, který načte a používá tajné kódy
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.
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).
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) } }
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); });
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));
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!