Připojení webové služby na Azure Key Vault
21.03.2021Správa hesel a bezpečnostních tokenů (dále jen klíče) je téma, se kterým se musí vypořádat každý vývojář. V dnešním článku si nakonfigurujeme webovou službu, která bude tyto údaje stahovat ze služby Azure Key Vault.
Slovníček
ASP.NET Core | Open-source webový framework od Microsoftu (první release 2016). |
Azure App Service | Webová služba běžící v Azure Cloud. |
Azure Key Vault (AKV) | Šifrované a bezpečné úložiště, pro správu klíčů a hesel, které pro autorizaci využívá službu Azure Active Directory. |
Azure Active Directory (AAD) | Služba pro správu identit a přístupů, která obsahuje seznam systémových i uživatelských účtů. AAD slouží k řízení přístupu ke cloudovým službám. Jedná se o cloud variantu on-premise služby Active Directory (AD). |
Azure Cloud Shell | CLI (příkazová řádka), pomocí které můžeme spravovat Azure služby z webového prohlížeče. Podporuje prostředí Bash i PowerShell. |
Obsah
- Úvod
- Příprava prostředí pomocí CLI
- Kontrola prostředí pomocí GUI
- Načtení klíče z webové služby
- Odkazy
Úvod
Azure Key Vault (AKV) je jednou z hlavních služeb v prostředí Azure. Umožňuje spravovat všechny klíče na jednom bezpečném místě, odkud si je ostatní služby mohou po autorizaci vyžádat a stáhnout. Stejně jako každá jiná Azure služba i AKV musí být přiřazena do tzv. resource skupiny (Resource Group).
Aby se webová služba (například Azure App Service) mohla připojit k AKV, je potřeba vytvořit systémový účet a nastavit oprávnění ke čtení klíčů. Reference na klíč se zadává v nastavení webové služby v sekci 'Application settings', přičemž klíč je poté v aplikaci dostupný jako globální proměnná.
Příprava prostředí pomocí CLI
Veškeré nastavení probíhá prostřednictvím webového rozhraní Azure Portálu. Konfiguraci můžeme provést buď pomocí webového rozhraní nebo prostřednictvím příkazové řádky v prostředí Azure Cloud Shell nebo PowerShell. Příkazová řádka má tu výhodu, že může sloužit jako dokumentace procesu vytvoření služeb a příkazy lze snadno znovu spustit.
# Vytvoření resource skupiny
az group create --name "rg-lutest" --location "germanywestcentral"
# Vytvoření free service plánu
az appservice plan create --resource-group "rg-lutest" --name "rg-lutest-appservice-plan" --sku FREE
# Vytvoření webové služby se service free plánem
az webapp create --resource-group "rg-lutest" --name "rg-lutest-webapp-01" --plan "rg-lutest-appservice-plan" --runtime "DOTNET|5.0"
# Vytvoření key vault služby s podporou RBAC
az keyvault create --resource-group "rg-lutest" --name "rg-lutest-keyvault" --location "germanywestcentral" --enable-rbac-authorization true
# Po zapnutí RBAC si musíme přiřadit správcovskou roli, abychom mohli AKV spravovat.
# Pomocí parametru --scope můžeme omezit přístup na konkrétní AKV
az role assignment create --assignee "<email_address>" --role "Key Vault Administrator"
# Vytvoření klíče
az keyvault secret set --vault-name "rg-lutest-keyvault" --name "SecretKey" --value "P@55w02d"
# Vytvoříme systémový účet, který přiřadíme webové službě
az webapp identity assign --resource-group "rg-lutest" --name "rg-lutest-webapp-01"
# Zjistíme "appId" systémového účtu => 5c0dadd4-110b-49bb-a1f5-473c19a351d9
az ad sp list --display-name "rg-lutest-webapp-01"
# Systémovému účtu přiřadíme roli "Key Vault Secrets User", která účtu zpřístupní klíče v Key Vault.
# Pomocí příkazu scope můžeme omezit přístup na konkrétní Key Vault nebo i konkrétní klíč.
# --scope /subscriptions/{subscriptionid}/resourcegroups/{resource-group-name}/providers/Microsoft.KeyVault/vaults/{key-vault-name}/secrets/{secret-name}
az role assignment create --assignee "5c0dadd4-110b-49bb-a1f5-473c19a351d9" --role "Key Vault Secrets User" `
--scope "/subscriptions/<subscription_id>/resourcegroups/rg-lutest/providers/Microsoft.KeyVault/vaults/rg-lutest-keyvault"
Kontrola prostředí pomocí GUI
Pokud se podíváme do naší resource groupy "rg-lutest", měla by obsahovat následující tři služby.
Webová služba by měla mít přístup do AKV přes roli "Key Vault Secrets User".
V AKV by měl existovat klíč "SecretKey".
Načtení klíče z webové služby
Pokud se podíváme na detail našeho klíče v AKV, můžeme si zobrazit jeho URI.
URI klíče vložíme jako AKV referenci do nastavení webové služby (App Service > Configuration > Application settings). Formát reference je následující
@Microsoft.KeyVault(SecretUri=<uri>)
Po přidání hodnoty můžeme vidět, že nám Azure hodnotu rozpoznal jako "Key vault Referenci"
Klíč pak v kódu získáme příkazem
Environment.GetEnvironmentVariable("SecretKey")
Pro testovací účely si můžeme klíč vypsat následovně:
Vytvoříme si viewmodel, který si naplníme v akci privacy kontroleru.
// viewmodel
namespace WebApp01.Models
{
public class PrivacyViewModel
{
public string Key { get; set; }
}
}
// controller action
public IActionResult Privacy()
{
var model = new PrivacyViewModel() { Key = Environment.GetEnvironmentVariable("SecretKey") };
return View(model);
}
Vykreslíme ve view.
<!-- razor view -->
@model WebApp01.Models.PrivacyViewModel
<p>
<b>Key:</b> @Model.Key
</p>
Pokud si pak zobrazíme "Privacy" stránku, uvidíme hodnotu našeho klíče, který je uložený v AKV.
Odkazy
- Jak zaregistrovat systémový účet pro webovou službu
- Příklad nastavení webové služby a key vault
- Jak z webové služby získat key vault klíč
- MS docs, jak z webové služby získat key vault klíč
- GUI návod jak vytvořit systémový účet k webové službě
- Dokumentace k RBAC
- CLI dokumentace ke key vault klíčům
- CLI dokumentace k app service plánu
- CLI dokumentace k resource skupině
- CLI dokumentace k webové službě
- CLI dokumentace k service principal příkazu