Připojení webové služby na Azure Key Vault

21.03.2021

Sprá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

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