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

21.03.2021

Správa klíčů a různých kódů/hesel je téma, se kterým se musí vypořádat nejeden vývojář a v dnešním článku si nakonfigurujeme webovou službu, která si bude takové klíče 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 Cloudu.
Azure Key Vault (AKV) Šifrované a zabezpečené úložiště, pro správu klíčů a hesel, které pro autorizaci využívá službu Azure Active Directory.
Azure Active Directory Služba pro řízení identit a přístupů, která obsahuje seznam systémových a uživatelských účtů, pomocí kterých řídí přístup ke cloudovým službám. Jedná se o nástupce Active Directory služby.
Azure Cloud Shell CLI (příkazová řádka), pomocí které můžeme spravovat Azure služby z webového prohlížeče. Podporuje Bash nebo Power Shell.

Obsah

Úvod

Azure Key Vault (AKV) je jedna z klíčových služeb v Azure prostředí. Umožní nám spravovat všechny klíče na jednom bezpečném místě, ze kterého si ostatní služby, po autorizaci, mohou klíče vyžádat a použít. AKV, stejně jako jakákoliv jiná Azure služba, musí být přiřazená do tzv. resource skupiny (Resource Group). Aby se webová služba (Azure App Service), mohla připojit do AKV, musí mít vytvořený systémový účet a ten musí mít oprávnění na čtení klíče v AKV. Reference na klíč do AKV se zadává v nastavení webové služby "Application settings" a klíč je pak v aplikaci přístupný jako globální proměnná.

Příprava prostředí pomocí CLI

Veškeré nastavení se provádí přes webové rozhraní v Azure portálu. Konfiguraci nastavíme buď pomocí webových formulářů nebo příkazové řádky Azure Cloud Shell. Příkazová řádka má tu výhodu, že může sloužit jako dokumentace, jakým způsobem byly služby vytvořené a příkazy můžeme také 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