Použití Key Vault odkazů pro App Service a Azure Functions

V tomto tématu se dozvíte, jak pracovat s tajnými kódy z Azure Key Vault v App Service nebo Azure Functions aplikace bez nutnosti jakýchkoli změn kódu. Azure Key Vault je služba, která poskytuje centralizovanou správu tajných kódů s úplnou kontrolou zásad přístupu a historie auditu.

Udělení přístupu aplikace k Key Vault

Aby bylo možné číst tajné kódy z Key Vault, je nutné vytvořit trezor a udělit aplikaci oprávnění k přístupu.

  1. Vytvořte Trezor klíčů pomocí Key Vault rychlý Start.

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

    Key Vault odkazy použijí ve výchozím nastavení identitu přiřazenou systémem aplikace, ale můžete zadat identitu přiřazenou uživatelem.

  3. Vytvořte zásadu přístupu v Key Vault pro identitu aplikace, kterou jste vytvořili dříve. Povolit pro tuto zásadu oprávnění tajného klíče "získat". Nekonfigurujte "autorizovanou aplikaci" ani applicationId nastavení, protože to není kompatibilní se spravovanou identitou.

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

Pokud je váš trezor nakonfigurovaný s omezeními sítě, budete také muset zajistit, aby aplikace měla přístup k síti.

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

    Aplikace pro Linux, které se pokoušejí použít soukromé koncové body, navíc vyžadují, aby byla aplikace explicitně nakonfigurovaná tak, aby měla veškerou trasu provozu přes virtuální síť. Tento požadavek se v nadcházející aktualizaci odebere. Pokud to chcete nastavit, použijte následující příkaz rozhraní příkazového řádku:

    az webapp config set --subscription <sub> -g <rg> -n <appname> --generic-configurations '{"vnetRouteAllEnabled": true}'
    
  2. Ujistěte se, že účty pro konfiguraci trezoru pro síť nebo podsíť, ke kterým budou mít přístup vaše aplikace.

Poznámka

kontejner Windows v současné době nepodporuje Key Vault odkazů prostřednictvím integrace virtuální sítě.

Trezory přístupu s identitou přiřazenou uživatelem

Některé aplikace musí odkazovat na tajné klíče v době vytváření, pokud by identita přiřazená systémem ještě nebyla k dispozici. V těchto případech je možné vytvořit uživatelsky přiřazenou identitu a získat tak předem přístup k trezoru.

Po udělení oprávnění k identitě přiřazené uživateli postupujte následovně:

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

  2. Nakonfigurujte aplikaci tak, aby používala tuto identitu pro Key Vault referenčních operací, nastavením keyVaultReferenceIdentity vlastnosti na ID prostředku identity přiřazené uživatelem.

    userAssignedIdentityResourceId=$(az identity show -g MyResourceGroupName -n MyUserAssignedIdentityName --query id -o tsv)
    appResourceId=$(az webapp show -g MyResourceGroupName -n MyAppName --query id -o tsv)
    az rest --method PATCH --uri "${appResourceId}?api-version=2021-01-01" --body "{'properties':{'keyVaultReferenceIdentity':'${userAssignedIdentityResourceId}'}}"
    

Tato konfigurace bude platit pro všechny odkazy aplikace.

Referenční syntaxe

Odkaz na Key Vault je ve formátu @Microsoft.KeyVault({referenceString}) , kde {referenceString} je nahrazen jednou z následujících možností:

Řetězec odkazu Description
SecretUri =SecretUri SecretUri by měl být úplný identifikátor URI datové roviny tajného klíče v Key Vault, volitelně včetně verze, například https://myvault.vault.azure.net/secrets/mysecret/ nebo.https://myvault.vault.azure.net/secrets/mysecret/ec96f02080254f109c51a1f14cdb1931
Trezor =trezor; Tajné heslo =tajné heslo Verzetajnéhoklíče =verzetajnéhoklíče Název trezoru je povinný a měl by se jednat o název prostředku Key Vault. Je vyžadován název tajného klíče , který by měl být názvem cílového tajného klíče. Verzetajnéhoklíče je volitelná, ale pokud je k dispozici, označuje verzi tajného klíče, který se má použít.

Například kompletní odkaz by vypadal jako následující:

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

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

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

Obměna

Pokud v odkazu není uvedená verze, aplikace použije nejnovější verzi, která existuje v trezoru klíčů. Když budou k dispozici novější verze, například s událostí otáčení, aplikace se automaticky aktualizuje a začne používat nejnovější verzi do 24 hodin. Prodleva je způsobená tím, že App Service ukládá do mezipaměti hodnoty pro odkazy trezoru klíčů a znovu je načte každých 24 hodin. Jakékoli změny konfigurace aplikace způsobí okamžité opětovné načtení všech odkazovaných tajných klíčů.

zdrojová aplikace Nastavení z Key Vault

odkazy na Key Vault lze použít jako hodnoty pro Nastavení aplikací, což vám umožní uchovávat tajné kódy Key Vault místo konfigurace lokality. Nastavení aplikace jsou bezpečně šifrované v klidovém stavu, ale pokud potřebujete možnosti správy tajných klíčů, měli by přejít do Key Vault.

Chcete-li použít odkaz Key Vault pro nastavení aplikace, nastavte odkaz jako hodnotu nastavení. Vaše aplikace může na tajný klíč odkazovat jako na klíč jako normální. Nevyžadují se žádné změny kódu.

Tip

Většina nastavení aplikací pomocí Key Vault odkazů by měla být označená jako nastavení slotu, protože pro každé prostředí byste měli mít oddělené trezory.

Pokyny pro připojení souborů Azure

Aplikace můžou pomocí WEBSITE_CONTENTAZUREFILECONNECTIONSTRING nastavení aplikace připojit soubory Azure jako systém souborů. Toto nastavení má další kontroly ověřování, aby bylo zajištěno, že aplikaci bude možné správně spustit. Platforma se spoléhá na sdílení obsahu v rámci služby soubory Azure a předpokládá, že je výchozí název, pokud není zadaný prostřednictvím WEBSITE_CONTENTSHARE nastavení. Pro všechny žádosti, které upraví tato nastavení, se platforma pokusí ověřit, jestli tato sdílená složka obsahu existuje, a pokusí se ji vytvořit, pokud ne. Pokud sdílenou složku obsahu nelze najít nebo vytvořit, je požadavek zablokován.

Při použití Key Vault odkazů pro toto nastavení se tato kontrola při ověřování ve výchozím nastavení nezdaří, protože samotný tajný klíč nelze vyřešit při zpracování příchozího požadavku. Chcete-li se tomuto problému vyhnout, můžete toto ověření přeskočit nastavením WEBSITE_SKIP_CONTENTSHARE_VALIDATION na hodnotu 1. Tím se vynechá všechny kontroly a sdílená složka obsahu se pro vás nevytvoří. Měli byste zajistit, aby byl vytvořen předem.

Upozornění

Pokud vynecháte ověření a připojovací řetězec nebo sdílenou složku obsahu není platný, aplikace nebude schopna spustit správně a bude zajišťovat pouze chyby HTTP 500.

V rámci vytváření lokality je také možné, že pokus o připojení sdílené složky obsahu se nezdařil z důvodu nešíření oprávnění spravovaných identit nebo integrace virtuální sítě není nastavena. Nastavení souborů Azure můžete odložit až později v šabloně nasazení, aby to vyhovovalo. Další informace najdete v tématu nasazení Azure Resource Manager . App Service použije výchozí systém souborů, dokud nebudou soubory Azure nastavované, a soubory se nekopírují, takže budete muset zajistit, aby během přechodného období nedocházelo k žádným pokusům o nasazení před tím, než se připojí soubory Azure.

Nasazení podle modelu Azure Resource Manager

Při automatizaci nasazení prostředků prostřednictvím šablon Azure Resource Manager může být nutné pořadí závislostí v určitém pořadí, aby tato funkce fungovala. Všimněte si, že budete muset definovat nastavení aplikace jako vlastní prostředek, a ne použít siteConfig vlastnost v definici webu. Je to proto, že lokalita musí být definovaná jako první, aby se k ní vytvořila identita přiřazená systémem a mohla by se používat v zásadách přístupu.

Příklad pseudo šablony pro aplikaci Function App může vypadat takto:

{
    //...
    "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('storageConnectionStringResourceId')).secretUriWithVersion, ')')]",
                        "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING": "[concat('@Microsoft.KeyVault(SecretUri=', reference(variables('storageConnectionStringResourceId')).secretUriWithVersion, ')')]",
                        "APPINSIGHTS_INSTRUMENTATIONKEY": "[concat('@Microsoft.KeyVault(SecretUri=', reference(variables('appInsightsKeyResourceId')).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 je nasazení správy zdrojů závislé na nastavení aplikace. To je obvykle nebezpečné chování, protože se aktualizace nastavení aplikace chová asynchronně. Protože však jsme zahrnuli WEBSITE_ENABLE_SYNC_UPDATE_SITE nastavení aplikace, aktualizace je synchronní. To znamená, že nasazení správy zdrojů bude zahájeno až po úplné aktualizaci nastavení aplikace. Další nastavení aplikace najdete v tématu proměnné prostředí a nastavení aplikace v Azure App Service.

Řešení potíží s Key Vaultmi odkazy

Pokud odkaz není správně přeložen, použije se místo toho referenční hodnota. To znamená, že pro nastavení aplikace by se vytvořila proměnná prostředí, jejíž hodnota má @Microsoft.KeyVault(...) syntaxi. To může způsobit, že aplikace vyvolá chyby, protože očekávala tajný kód určité struktury.

Nejčastěji to je způsobeno neznámým nastavením zásad přístupu Key Vault. Může to ale také být způsobeno tím, že už existující tajný kód nebo Chyba 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 aplikace Nastavení a pro příslušné reference vyberte upravit. Pod konfigurací nastavení byste měli vidět informace o stavu, včetně všech chyb. Neexistence těchto informací implikuje neplatnou syntaxi reference.

K získání dalších informací můžete použít také jeden z vestavěný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 možnost dostupnost a výkon a vyberte možnost Webová aplikace dolů.
  4. najděte Key Vault Application Nastavení diagnostics a klikněte na další informace.

Použití detektoru pro Azure Functions

  1. Na portálu přejděte do aplikace.
  2. Přejděte k funkcím platformy.
  3. Vyberte Diagnostikovat a řešit problémy.
  4. Zvolte možnost dostupnost a výkon a vyberte funkce aplikace dolů nebo hlášení chyb.
  5. klikněte na Key Vault diagnostika Nastavení aplikace.