Použití odkazů služby Key Vault jako nastavení aplikace ve službě Aplikace Azure Service a Azure Functions

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

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. Když je nastavení aplikace nebo připojovací řetězec odkazem na trezor klíčů, může ho kód aplikace používat stejně jako jakékoli jiné nastavení aplikace nebo připojovací řetězec. Tímto způsobem můžete udržovat tajné kódy kromě konfigurace vaší aplikace. Nastavení aplikace se bezpečně šifrují v klidovém stavu, ale pokud potřebujete možnosti správy tajných kódů, měly by přejít do 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. Pomocí rychlého startu pro Key Vault vytvořte trezor klíčů.

  2. Vytvořte spravovanou identitu pro vaši aplikaci.

    Odkazy na službu Key Vault ve výchozím nastavení používají 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 ve vašem trezoru klíčů pro spravovanou identitu, kterou jste vytvořili dříve. Postup 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 má aplikace přístup k síti. Trezory by neměly záviset na veřejných odchozích IP adresách aplikace, protože původní IP adresa požadavku na 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 síťových funkcích služby App Service a možnostech sítí Azure Functions.

    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 bude odebrán v nadcházející aktualizaci. Pokud chcete toto nastavení nakonfigurovat, 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 vaše aplikace používá.

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

Některé aplikace musí při vytváření odkazovat na tajné kódy, pokud ještě není identita přiřazená systémem dostupná. V těchto případech je možné vytvořit identitu přiřazenou uživatelem a předem mu přidělit přístup k trezoru.

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 používala tuto identitu pro referenční operace trezoru klíčů nastavením vlastnosti na ID prostředku identity přiřazené uživatelem keyVaultReferenceIdentity .

    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 referenci není zadaná verze tajného kódu, aplikace používá nejnovější verzi, která existuje v trezoru klíčů. Jakmile budou k dispozici novější verze, například s událostí rotace, aplikace se automaticky aktualizuje a začne používat nejnovější verzi do 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é 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 odkaz 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í aplikací využívajících odkazy na trezor klíčů by se měla označit 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 Popis
SecretUri=secretUri Tajný identifikátor URI by měl být úplný identifikátor URI roviny dat tajného kódu v trezoru, volitelně včetně verze, například https://myvault.vault.azure.net/secrets/mysecret/ nebo https://myvault.vault.azure.net/secrets/mysecret/ec96f02080254f109c51a1f14cdb1931
VaultName=vaultName; SecretName=secretName; SecretVersion=secretVersion Název trezoru je povinný a jedná se o název trezoru. Název tajného klíče je povinný a je to název tajného kódu. SecretVersion je nepovinný, ale pokud je k dispozici verze tajného kódu, který se má použít.

Kompletní odkaz by například 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 připojení služby Azure Files

Aplikace můžou pomocí WEBSITE_CONTENTAZUREFILECONNECTIONSTRING nastavení aplikace připojit službu Azure Files jako systém souborů. Toto nastavení obsahuje ověřovací kontroly, aby se zajistilo, že aplikace může být správně spuštěná. Platforma spoléhá na to, že má sdílenou složku obsahu ve službě Azure Files a předpokládá výchozí název, pokud ho nezadáte prostřednictvím WEBSITE_CONTENTSHARE nastavení. U všech požadavků, které tato nastavení upravují, platforma ověří, jestli tato sdílená složka obsahu existuje, a pokusí se ji vytvořit, pokud ne. Pokud sdílenou složku obsahu nemůžete najít nebo vytvořit, zablokuje žádost.

Pokud v tomto nastavení použijete odkazy na trezor klíčů, kontrola ověření ve výchozím nastavení selže, protože při zpracování příchozího požadavku se samotný tajný klíč nedá vyřešit. Pokud se chcete tomuto problému vyhnout, můžete ověření přeskočit nastavením WEBSITE_SKIP_CONTENTSHARE_VALIDATION na 1. Toto nastavení říká službě App Service, aby obešla všechny kontroly a nevytvoří sdílenou složku obsahu za vás. Měli byste se ujistit, že je vytvořený předem.

Upozornění

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

Při vytváření aplikace může pokus o připojení sdílené složky obsahu selhat kvůli tomu, že se nešířily oprávnění spravované identity nebo se nenastavila integrace virtuální sítě. Nastavení služby Azure Files můžete odložit až později v šabloně nasazení, aby se na toto nastavení vyhodila. Další informace najdete v nasazení Azure Resource Manageru. V tomto případě služba App Service používá výchozí systém souborů, dokud se nenastaví služba Azure Files a soubory se nezkopírují. Před připojením služby Azure Files musíte zajistit, aby během přechodného období nedošlo k žádným pokusům o nasazení.

Důležité informace o instrumentaci Přehledy aplikací

Aplikace můžou použít APPINSIGHTS_INSTRUMENTATIONKEY nastavení nebo APPLICATIONINSIGHTS_CONNECTION_STRING nastavení aplikace k integraci s Přehledy aplikace. Prostředí portálu pro App Service a Azure Functions také tato nastavení používají k zobrazení telemetrických dat z prostředku. Pokud na tyto hodnoty odkazuje služba Key Vault, tato prostředí nejsou dostupná a místo toho je potřeba pracovat přímo s prostředkem Přehledy aplikace, abyste mohli zobrazit telemetrii. Tyto hodnoty se ale nepovažují za tajné kódy, takže můžete alternativně zvážit jejich přímou konfiguraci místo použití odkazů na trezor klíčů.

Nasazení podle modelu Azure Resource Manager

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

Následující pseudo-šablona je 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 nasazení správy zdrojového kódu závisí na nastavení aplikace. Toto chování je obvykle nebezpečné, protože se aktualizace nastavení aplikace chová asynchronně. Vzhledem k tomu, že jsme zahrnuli WEBSITE_ENABLE_SYNC_UPDATE_SITE nastavení aplikace, je aktualizace synchronní. To znamená, že nasazení správy zdrojového kódu začne jenom po úplné aktualizaci nastavení aplikace. Další nastavení aplikace najdete v tématu Proměnné prostředí a nastavení aplikace ve službě Aplikace Azure Service.

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

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

Řešení se obvykle nezdařilo kvůli chybné konfiguraci zásad přístupu ke službě Key Vault. Důvodem však může být také to, že tajný klíč již neexistuje, nebo kvůli chybě syntaxe samotného odkazu.

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

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

Použití detektoru služby 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 Možnost Webová aplikace dolů.
  4. Do vyhledávacího pole vyhledejte a vyberte application Nastavení Diagnostics služby Key Vault.

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 Aplikaci funkcí, která nefunguje nebo hlásí chyby.
  5. Vyberte diagnostiku Nastavení aplikace služby Key Vault.