Použití Key Vault odkazů jako nastavení aplikací v Azure App Service a Azure Functions

V tomto článku se dozvíte, jak používat tajné kódy z Azure Key Vault jako hodnoty nastavení aplikací nebo připojovacích řetězců ve vašich App Service nebo Azure Functions aplikacích.

Azure Key Vault je služba, která poskytuje centralizovanou správu tajných kódů s plnou kontrolou nad zásadami přístupu a historií auditu. Pokud je nastavení aplikace nebo připojovací řetězec odkazem na trezor klíčů, kód aplikace ho může použít jako jakékoli jiné nastavení aplikace nebo připojovací řetězec. Tímto způsobem můžete udržovat tajné kódy mimo konfiguraci vaší aplikace. Nastavení aplikace jsou bezpečně šifrována v neaktivním klidovém stavu, ale pokud potřebujete funkce správy tajných kódů, měly by být v trezoru klíčů.

Udělení přístupu k trezoru klíčů vaší aplikaci

Abyste mohli číst tajné kódy z trezoru klíčů, musíte mít vytvořený trezor a udělit aplikaci oprávnění pro přístup k němu.

  1. Trezor klíčů vytvoříte podle Key Vault rychlého startu.

  2. Vytvořte pro aplikaci spravovanou identitu .

    Odkazy na key vault používají ve výchozím nastavení identitu přiřazenou systémem aplikace, ale můžete zadat identitu přiřazenou uživatelem.

  3. Autorizace přístupu pro čtení k tajným kódům trezoru klíčů pro spravovanou identitu, kterou jste vytvořili dříve. Způsob, jakým to uděláte, závisí na modelu oprávnění trezoru klíčů:

Přístup k trezorům s omezeným přístupem k síti

Pokud je váš trezor nakonfigurovaný s omezeními sítě, ujistěte se, že aplikace má síťový přístup. Trezory by neměly záviset na veřejných odchozích IP adresách aplikace, protože původní IP adresa žádosti o tajný kód se může lišit. Místo toho by měl být trezor nakonfigurovaný tak, aby přijímal provoz z virtuální sítě používané aplikací.

  1. Ujistěte se, že aplikace má nakonfigurované odchozí síťové funkce, jak je popsáno v tématu App Service síťových funkcí a možností Azure Functions sítí.

    Linuxové aplikace, které se připojují k privátním koncovým bodům, musí být explicitně nakonfigurované tak, aby směrovaly veškerý provoz přes virtuální síť. Tento požadavek se v nadcházející aktualizaci odebere. Pokud chcete nakonfigurovat toto nastavení, spusťte následující příkaz:

    az webapp config set --subscription <sub> -g <group-name> -n <app-name> --generic-configurations '{"vnetRouteAllEnabled": true}'
    
  2. Ujistěte se, že konfigurace trezoru umožňuje přístup k síti nebo podsíti, kterou k ní vaše aplikace používá.

Přístup k trezorům s identitou přiřazenou uživatelem

Některé aplikace potřebují při vytváření odkazovat na tajné kódy, když identita přiřazená systémem ještě není k dispozici. V těchto případech je možné vytvořit identitu přiřazenou uživatelem a předem k trezoru získat přístup.

Jakmile udělíte oprávnění k identitě přiřazené uživatelem, postupujte takto:

  1. Pokud jste to ještě neudělali, přiřaďte identitu k aplikaci.

  2. Nakonfigurujte aplikaci tak, aby tuto identitu používala pro operace odkazů trezoru klíčů nastavením keyVaultReferenceIdentity vlastnosti na ID prostředku identity přiřazené uživatelem.

    identityResourceId=$(az identity show --resource-group <group-name> --name <identity-name> --query id -o tsv)
    az webapp update --resource-group <group-name> --name <app-name> --set keyVaultReferenceIdentity=${identityResourceId}
    

Toto nastavení platí pro všechny odkazy na trezor klíčů pro aplikaci.

Obměna

Pokud v odkazu není uvedená verze tajného kódu, aplikace použije nejnovější verzi, která existuje v trezoru klíčů. Když budou k dispozici novější verze, například s událostí obměně, aplikace se automaticky aktualizuje a začne používat nejnovější verzi během 24 hodin. Zpoždění je způsobeno tím, že App Service ukládá hodnoty odkazů na trezor klíčů do mezipaměti a znovu je načítá každých 24 hodin. Jakákoli změna konfigurace aplikace způsobí restartování aplikace a okamžité opětovné načtení všech odkazovaných tajných kódů.

Nastavení zdrojové aplikace z trezoru klíčů

Pokud chcete použít odkaz na trezor klíčů, nastavte ho jako hodnotu nastavení. Vaše aplikace může na tajný klíč odkazovat jako obvykle. Nejsou vyžadovány žádné změny kódu.

Tip

Většina nastavení aplikace používající odkazy na trezor klíčů by měla být označená jako nastavení slotu, protože pro každé prostředí byste měli mít samostatné trezory.

Odkaz na trezor klíčů je ve formátu @Microsoft.KeyVault({referenceString}), kde {referenceString} je v jednom z následujících formátů:

Referenční řetězec Description
SecretUri=secretUri SecretUri by měl být úplný identifikátor URI roviny dat tajného klíče v trezoru, volitelně včetně verze, například nebo https://myvault.vault.azure.net/secrets/mysecret/https://myvault.vault.azure.net/secrets/mysecret/ec96f02080254f109c51a1f14cdb1931
VaultName=vaultName; SecretName=secretName; SecretVersion=secretVersion Název trezoru je povinný a je název trezoru. Název tajného klíče je povinný a je název tajného kódu. SecretVersion je nepovinná, ale pokud je k dispozici, označuje verzi tajného kódu, která se má použít.

Například úplný odkaz by vypadal jako následující řetězec:

@Microsoft.KeyVault(SecretUri=https://myvault.vault.azure.net/secrets/mysecret/)

Máte k dispozici i další možnosti:

@Microsoft.KeyVault(VaultName=myvault;SecretName=mysecret)

Důležité informace o Azure Files montáži

Aplikace můžou pomocí WEBSITE_CONTENTAZUREFILECONNECTIONSTRING nastavení aplikace připojit Azure Files jako systém souborů. Toto nastavení má ověřovací kontroly, které zajišťují, že se aplikace dá správně spustit. Platforma spoléhá na to, že má sdílenou složku obsahu v rámci Azure Files, a pokud není zadaný prostřednictvím WEBSITE_CONTENTSHARE nastavení, předpokládá výchozí název. U všech požadavků, které tato nastavení upravují, platforma ověří, jestli tato sdílená složka obsahu existuje, a pokud ne, pokusí se ji vytvořit. Pokud nemůže najít nebo vytvořit sdílenou složku obsahu, zablokuje požadavek.

Pokud v tomto nastavení použijete odkazy na trezor klíčů, ověřovací kontrola se ve výchozím nastavení nezdaří, protože při zpracování příchozího požadavku nejde přeložit samotný tajný klíč. Abyste se tomuto problému vyhnuli, můžete ověření přeskočit nastavením WEBSITE_SKIP_CONTENTSHARE_VALIDATION na hodnotu 1. Toto nastavení App Service říká, že má obejít všechny kontroly, a nevytvoří za vás sdílenou složku obsahu. Měli byste se ujistit, že je vytvořený předem.

Upozornění

Pokud přeskočíte ověření a připojovací řetězec nebo sdílená složka obsahu jsou neplatné, aplikace se nebude moct správně spustit a bude obsluhovat pouze chyby HTTP 500.

Při vytváření aplikace může dojít k selhání pokusu o připojení sdílené složky obsahu kvůli tomu, že se nešířila oprávnění spravované identity nebo se nenastavila integrace virtuální sítě. Nastavení Azure Files můžete odložit na později v šabloně nasazení, aby se to přizpůsobilo. Další informace najdete v tématu Nasazení Azure Resource Manager. V tomto případě App Service používá výchozí systém souborů, dokud se nenastaví Azure Files a soubory se nezkopírují. Před připojením Azure Files se musíte ujistit, že během přechodného období nedojde k žádným pokusům o nasazení.

Důležité informace o instrumentaci Application Insights

Aplikace můžou k integraci s Application Insights použít APPINSIGHTS_INSTRUMENTATIONKEY nastavení aplikace neboAPPLICATIONINSIGHTS_CONNECTION_STRING. Prostředí portálu pro App Service a Azure Functions také použít tato nastavení k zobrazení telemetrických dat z prostředku. Pokud se na tyto hodnoty odkazuje z Key Vault, nejsou tato prostředí k dispozici a místo toho musíte k zobrazení telemetrie pracovat přímo s prostředkem Application Insights. Tyto hodnoty se ale nepovažují za tajné kódy, takže můžete alternativně zvážit jejich konfiguraci přímo místo použití odkazů na trezor klíčů.

Nasazení podle modelu Azure Resource Manager

Při automatizaci nasazení prostředků prostřednictvím šablon Azure Resource Manager možná budete muset sekvencovat závislosti v určitém pořadí, aby tato funkce fungovala. Nezapomeňte definovat nastavení aplikace jako vlastní prostředek místo použití siteConfig vlastnosti v definici aplikace. Důvodem je to, že aplikace musí být nejprve definována, aby se s ní vytvořila identita přiřazená systémem a bylo možné ji použít v zásadách přístupu.

Následující pseudo šablony jsou příkladem toho, jak může aplikace funkcí vypadat:

{
    //...
    "resources": [
        {
            "type": "Microsoft.Storage/storageAccounts",
            "name": "[variables('storageAccountName')]",
            //...
        },
        {
            "type": "Microsoft.Insights/components",
            "name": "[variables('appInsightsName')]",
            //...
        },
        {
            "type": "Microsoft.Web/sites",
            "name": "[variables('functionAppName')]",
            "identity": {
                "type": "SystemAssigned"
            },
            //...
            "resources": [
                {
                    "type": "config",
                    "name": "appsettings",
                    //...
                    "dependsOn": [
                        "[resourceId('Microsoft.Web/sites', variables('functionAppName'))]",
                        "[resourceId('Microsoft.KeyVault/vaults/', variables('keyVaultName'))]",
                        "[resourceId('Microsoft.KeyVault/vaults/secrets', variables('keyVaultName'), variables('storageConnectionStringName'))]",
                        "[resourceId('Microsoft.KeyVault/vaults/secrets', variables('keyVaultName'), variables('appInsightsKeyName'))]"
                    ],
                    "properties": {
                        "AzureWebJobsStorage": "[concat('@Microsoft.KeyVault(SecretUri=', reference(variables('storageConnectionStringName')).secretUriWithVersion, ')')]",
                        "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING": "[concat('@Microsoft.KeyVault(SecretUri=', reference(variables('storageConnectionStringName')).secretUriWithVersion, ')')]",
                        "APPINSIGHTS_INSTRUMENTATIONKEY": "[concat('@Microsoft.KeyVault(SecretUri=', reference(variables('appInsightsKeyName')).secretUriWithVersion, ')')]",
                        "WEBSITE_ENABLE_SYNC_UPDATE_SITE": "true"
                        //...
                    }
                },
                {
                    "type": "sourcecontrols",
                    "name": "web",
                    //...
                    "dependsOn": [
                        "[resourceId('Microsoft.Web/sites', variables('functionAppName'))]",
                        "[resourceId('Microsoft.Web/sites/config', variables('functionAppName'), 'appsettings')]"
                    ],
                }
            ]
        },
        {
            "type": "Microsoft.KeyVault/vaults",
            "name": "[variables('keyVaultName')]",
            //...
            "dependsOn": [
                "[resourceId('Microsoft.Web/sites', variables('functionAppName'))]"
            ],
            "properties": {
                //...
                "accessPolicies": [
                    {
                        "tenantId": "[reference(resourceId('Microsoft.Web/sites/', variables('functionAppName')), '2020-12-01', 'Full').identity.tenantId]",
                        "objectId": "[reference(resourceId('Microsoft.Web/sites/', variables('functionAppName')), '2020-12-01', 'Full').identity.principalId]",
                        "permissions": {
                            "secrets": [ "get" ]
                        }
                    }
                ]
            },
            "resources": [
                {
                    "type": "secrets",
                    "name": "[variables('storageConnectionStringName')]",
                    //...
                    "dependsOn": [
                        "[resourceId('Microsoft.KeyVault/vaults/', variables('keyVaultName'))]",
                        "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
                    ],
                    "properties": {
                        "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountResourceId'),'2019-09-01').key1)]"
                    }
                },
                {
                    "type": "secrets",
                    "name": "[variables('appInsightsKeyName')]",
                    //...
                    "dependsOn": [
                        "[resourceId('Microsoft.KeyVault/vaults/', variables('keyVaultName'))]",
                        "[resourceId('Microsoft.Insights/components', variables('appInsightsName'))]"
                    ],
                    "properties": {
                        "value": "[reference(resourceId('microsoft.insights/components/', variables('appInsightsName')), '2019-09-01').InstrumentationKey]"
                    }
                }
            ]
        }
    ]
}

Poznámka

V tomto příkladu závisí nasazení správy zdrojového kódu na nastavení aplikace. To je obvykle nebezpečné chování, protože aktualizace nastavení aplikace se chová asynchronně. Protože jsme ale zahrnuli WEBSITE_ENABLE_SYNC_UPDATE_SITE nastavení aplikace, je aktualizace synchronní. To znamená, že nasazení správy zdrojového kódu začne až po úplné aktualizaci nastavení aplikace. Další nastavení aplikací najdete v tématu Proměnné prostředí a nastavení aplikací v Azure App Service.

Řešení potíží s odkazy na trezor klíčů

Pokud odkaz není správně přeložen, použije se místo toho odkazový řetězec (například @Microsoft.KeyVault(...)). To může způsobit, že aplikace vyvolá chyby, protože očekává tajný kód jiné hodnoty.

Selhání při řešení je obvykle způsobeno chybnou konfigurací zásad přístupu Key Vault. Příčinou ale může být také to, že tajný klíč už neexistuje nebo chyba syntaxe v samotném odkazu.

Pokud je syntaxe správná, můžete zobrazit další příčiny chyby kontrolou aktuálního stavu řešení na portálu. Přejděte do Nastavení aplikace a jako příslušný odkaz vyberte Upravit. Dialogové okno pro úpravy zobrazuje informace o stavu, včetně všech chyb. Pokud se stavová zpráva nezobrazí, znamená to, že syntaxe je neplatná a není rozpoznána jako odkaz na trezor klíčů.

K získání dalších informací můžete také použít některý z integrovaných detektorů.

Použití detektoru pro App Service

  1. Na portálu přejděte do aplikace.
  2. Vyberte Diagnostikovat a řešit problémy.
  3. Zvolte Dostupnost a výkon a vyberte Webová aplikace mimo provoz.
  4. Ve vyhledávacím poli vyhledejte a vyberte Key Vault Application Settings Diagnostics.

Použití detektoru pro Azure Functions

  1. Na portálu přejděte do aplikace.
  2. Přejděte na Funkce platformy.
  3. Vyberte Diagnostikovat a řešit problémy.
  4. Zvolte Dostupnost a výkon a vyberte Aplikace funkcí mimo provoz nebo hlásí chyby.
  5. Vyberte Key Vault Application Settings Diagnostics.