Key Vault-hivatkozások használata alkalmazásbeállításokként Azure App Service és Azure Functions

Ez a cikk bemutatja, hogyan használhatja az Azure Key Vault titkos kulcsait az alkalmazásbeállítások vagy kapcsolati sztringek értékeiként a App Service vagy Azure Functions-alkalmazásokban.

Az Azure Key Vault egy központosított titkoskód-kezelést biztosító szolgáltatás, amely teljes körű vezérlést biztosít a hozzáférési szabályzatok és a naplózási előzmények felett. Ha egy alkalmazásbeállítás vagy kapcsolati sztring kulcstartó-referencia, az alkalmazáskód bármely más alkalmazásbeállításhoz vagy kapcsolati sztring hasonlóan használhatja. Így az alkalmazás konfigurációján kívül titkos kódokat is fenntarthat. Az alkalmazásbeállítások inaktív állapotban biztonságosan titkosítva vannak, de ha titkos kódkezelési képességekre van szüksége, a kulcstartóba kell lépniük.

Hozzáférés biztosítása az alkalmazásnak egy kulcstartóhoz

Ahhoz, hogy titkos kulcsokat olvashasson egy kulcstartóból, létre kell hoznia egy tárolót, és engedélyt kell adnia az alkalmazásnak a hozzáférésre.

  1. Hozzon létre egy kulcstartót az Key Vault rövid útmutatót követve.

  2. Hozzon létre egy felügyelt identitást az alkalmazáshoz.

    A Key Vault-hivatkozások alapértelmezés szerint az alkalmazás rendszer által hozzárendelt identitását használják, de megadhat egy felhasználó által hozzárendelt identitást.

  3. Olvasási hozzáférés engedélyezése a kulcstartó titkos kulcstartójához a korábban létrehozott felügyelt identitáshoz. Ennek menete a kulcstartó engedélymodelljétől függ:

Hozzáférés a hálózat által korlátozott tárolókhoz

Ha a tároló hálózati korlátozásokkal van konfigurálva, győződjön meg arról, hogy az alkalmazás rendelkezik hálózati hozzáféréssel. A tárolók nem függhetnek az alkalmazás nyilvános kimenő IP-címétől, mert a titkos kérés forrás IP-címe eltérő lehet. Ehelyett a tárolót úgy kell konfigurálni, hogy fogadja az alkalmazás által használt virtuális hálózat forgalmát.

  1. Győződjön meg arról, hogy az alkalmazás rendelkezik konfigurált kimenő hálózati képességekkel, az App Service hálózati funkciók és Azure Functions hálózati beállítások című cikkben leírtak szerint.

    A privát végpontokhoz csatlakozó Linux-alkalmazásokat kifejezetten úgy kell konfigurálni, hogy az összes forgalmat a virtuális hálózaton keresztül irányítják. Ezt a követelményt egy következő frissítés eltávolítja. A beállítás konfigurálásához futtassa a következő parancsot:

    az webapp config set --subscription <sub> -g <group-name> -n <app-name> --generic-configurations '{"vnetRouteAllEnabled": true}'
    
  2. Győződjön meg arról, hogy a tároló konfigurációja lehetővé teszi az alkalmazás által a hozzáféréshez használt hálózatot vagy alhálózatot.

Hozzáférés tárolókhoz felhasználó által hozzárendelt identitással

Egyes alkalmazásoknak a létrehozáskor kell titkos kulcsokra hivatkoznia, ha egy rendszer által hozzárendelt identitás még nem érhető el. Ezekben az esetekben előre létrehozhat egy felhasználó által hozzárendelt identitást, és hozzáférést adhat a tárolóhoz.

Miután megadta az engedélyeket a felhasználó által hozzárendelt identitáshoz, kövesse az alábbi lépéseket:

  1. Ha még nem tette meg, rendelje hozzá az identitást az alkalmazáshoz.

  2. Konfigurálja az alkalmazást úgy, hogy ezt az identitást használja a Key Vault referenciaműveleteihez úgy, hogy a keyVaultReferenceIdentity tulajdonságot a felhasználó által hozzárendelt identitás erőforrás-azonosítójára állítja.

    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}
    

Ez a beállítás az alkalmazás összes Key Vault-hivatkozására vonatkozik.

Változtatás

Ha a referencia nem tartalmazza a titkos verziót, az alkalmazás a key vaultban található legújabb verziót használja. Amikor újabb verziók válnak elérhetővé, például rotációs esemény esetén, az alkalmazás automatikusan frissül, és 24 órán belül megkezdi a legújabb verzió használatát. A késést az okozza, hogy az App Service gyorsítótárazza a kulcstartó-referenciák értékeit, és 24 óránként kéri le őket újra. Az alkalmazás konfigurációjának bármilyen módosítása az alkalmazás újraindítását és az összes hivatkozott titkos kód azonnali újrabetöltését eredményezi.

Forrásalkalmazás beállításai a Key Vaultból

Kulcstartó-referencia használatához állítsa be a referenciát a beállítás értékeként. Az alkalmazás a kulcsán keresztül a szokásos módon hivatkozhat a titkos kódra. Nincs szükség kódmódosításra.

Tipp

A kulcstartó-hivatkozásokat használó legtöbb alkalmazásbeállítást pontbeállításként kell megjelölni, mivel minden környezethez külön tárolót kell használnia.

A key vault-referenciák formátuma @Microsoft.KeyVault({referenceString}), ahol {referenceString} az alábbi formátumok egyike szerepel:

Hivatkozási sztring Leírás
SecretUri=secretUri A SecretUri-nak a tárolóban lévő titkos kulcsok teljes adatsíkbeli URI-jának kell lennie, opcionálisan egy verziót is beleértve, például https://myvault.vault.azure.net/secrets/mysecret/ vagy https://myvault.vault.azure.net/secrets/mysecret/ec96f02080254f109c51a1f14cdb1931
VaultName=vaultName; SecretName=secretName; SecretVersion=secretVersion A Tárolónév megadása kötelező, és a tároló neve. A SecretName megadása kötelező, és a titkos név. A SecretVersion nem kötelező, de ha van ilyen, a használni kívánt titkos kód verzióját jelzi.

Egy teljes hivatkozás például a következő sztringhez hasonlóan néz ki:

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

Alternatív megoldás:

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

A Azure Files csatlakoztatásával kapcsolatos szempontok

Az alkalmazások az WEBSITE_CONTENTAZUREFILECONNECTIONSTRING alkalmazásbeállítással csatlakoztathatják Azure Files fájlrendszerként. Ez a beállítás érvényesítési ellenőrzésekkel ellenőrzi, hogy az alkalmazás megfelelően elindítható-e. A platform a tartalommegosztásra támaszkodik Azure Files belül, és alapértelmezett nevet feltételez, kivéve, ha a WEBSITE_CONTENTSHARE beállítással meg van adva. A beállításokat módosító kérések esetén a platform ellenőrzi, hogy létezik-e ez a tartalommegosztás, és megpróbálja létrehozni, ha nem. Ha nem találja vagy nem tudja létrehozni a tartalommegosztást, letiltja a kérést.

Ha ebben a beállításban key vault-hivatkozásokat használ, az érvényesítési ellenőrzés alapértelmezés szerint meghiúsul, mert maga a titkos kód nem oldható fel a bejövő kérés feldolgozása során. A probléma elkerülése érdekében kihagyhatja az érvényesítést az "1" beállítással WEBSITE_SKIP_CONTENTSHARE_VALIDATION . Ez a beállítás arra utasítja App Service, hogy hagyja figyelmen kívül az összes ellenőrzést, és ne hozza létre a tartalommegosztást. Győződjön meg arról, hogy előre létrejött.

Figyelemfelhívás

Ha kihagyja az érvényesítést, és a kapcsolati sztring vagy a tartalommegosztás érvénytelen, az alkalmazás nem fog megfelelően elindulni, és csak HTTP 500-hibákat fog kiszolgálni.

Az alkalmazás létrehozása során a tartalommegosztás csatlakoztatásának megkísérlése meghiúsulhat, mert a felügyelt identitás engedélyeit nem propagálja, vagy a virtuális hálózati integráció nincs beállítva. A Azure Files beállítását későbbre halaszthatja az üzembe helyezési sablonban ennek megfelelően. További információ: Azure Resource Manager üzembe helyezése. Ebben az esetben a App Service egy alapértelmezett fájlrendszert használ, amíg be nem állítja Azure Files, és a fájlok nem lesznek átmásolva. Győződjön meg arról, hogy a Azure Files csatlakoztatása előtti átmeneti időszakban nem történik üzembe helyezési kísérlet.

Az Application Insights rendszerállapotával kapcsolatos szempontok

Az alkalmazások a vagy APPLICATIONINSIGHTS_CONNECTION_STRING az APPINSIGHTS_INSTRUMENTATIONKEY alkalmazásbeállítások használatával integrálhatók az Application Insights szolgáltatással. A portál App Service és Azure Functions is ezeket a beállításokat használja az erőforrás telemetriai adatainak felszínre hozásához. Ha ezekre az értékekre Key Vault hivatkozik, ezek a szolgáltatások nem érhetők el, és ehelyett közvetlenül az Application Insights-erőforrással kell dolgoznia a telemetriai adatok megtekintéséhez. Ezek az értékek azonban nem számítanak titkos kulcsnak, ezért érdemes lehet közvetlenül konfigurálni őket a Kulcstartó-hivatkozások használata helyett.

Az Azure Resource Manager üzembe helyezése

Ha azure-Resource Manager-sablonokon keresztül automatizálja az erőforrások üzembe helyezését, előfordulhat, hogy a funkció működéséhez egy adott sorrendbe kell rendeznie a függőségeket. Ügyeljen arra, hogy az alkalmazásbeállításokat saját erőforrásként definiálja, és ne használjon tulajdonságot siteConfig az alkalmazásdefinícióban. Ennek az az oka, hogy először az alkalmazást kell definiálni, hogy a rendszer által hozzárendelt identitás létrejönjön vele, és használható legyen a hozzáférési szabályzatban.

Az alábbi pszeudosablon egy példa arra, hogyan nézhet ki egy függvényalkalmazás:

{
    //...
    "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]"
                    }
                }
            ]
        }
    ]
}

Megjegyzés

Ebben a példában a verziókövetés üzembe helyezése az alkalmazás beállításaitól függ. Ez általában nem biztonságos viselkedés, mivel az alkalmazásbeállítás frissítése aszinkron módon viselkedik. Mivel azonban belefoglaltuk az WEBSITE_ENABLE_SYNC_UPDATE_SITE alkalmazásbeállítást, a frissítés szinkronban van. Ez azt jelenti, hogy a verziókövetés üzembe helyezése csak akkor kezdődik meg, ha az alkalmazásbeállítások teljes mértékben frissültek. További alkalmazásbeállításokért lásd: Környezeti változók és alkalmazásbeállítások Azure App Service.

Key Vault-referenciák hibaelhárítása

Ha a hivatkozás nem oldható fel megfelelően, a hivatkozási sztringet használja helyette (például @Microsoft.KeyVault(...): ). Előfordulhat, hogy az alkalmazás hibát jelez, mert egy másik érték titkos kódját várja.

A probléma megoldásának sikertelenségét általában a Key Vault hozzáférési szabályzat helytelen konfigurációja okozza. Ennek oka lehet azonban egy már nem létező titkos kód vagy egy szintaxishiba a hivatkozásban.

Ha a szintaxis helyes, a hiba egyéb okait a portál aktuális megoldási állapotának ellenőrzésével tekintheti meg. Lépjen az Alkalmazásbeállítások területre, és válassza a "Szerkesztés" lehetőséget a szóban forgó hivatkozáshoz. A szerkesztési párbeszédpanel állapotinformációkat jelenít meg, beleértve az esetleges hibákat is. Ha nem látja az állapotüzenetet, az azt jelenti, hogy a szintaxis érvénytelen, és nem ismeri fel kulcstartó-referenciaként.

Az egyik beépített érzékelővel további információkat is kaphat.

A detektor használata App Service

  1. A portálon navigáljon az alkalmazáshoz.
  2. Válassza a Problémák diagnosztizálása és megoldása lehetőséget.
  3. Válassza a Rendelkezésre állás és teljesítmény lehetőséget, majd válassza a Webalkalmazás leállt lehetőséget.
  4. A keresőmezőben keresse meg és válassza Key Vault Alkalmazásbeállítások diagnosztikái lehetőséget.

A detektor használata Azure Functions

  1. A portálon navigáljon az alkalmazáshoz.
  2. Lépjen a Platformfunkciók elemre.
  3. Válassza a Problémák diagnosztizálása és megoldása lehetőséget.
  4. Válassza a Rendelkezésre állás és teljesítmény lehetőséget, majd válassza a Függvényalkalmazás leállása vagy a jelentési hibák lehetőséget.
  5. Válassza Key Vault Alkalmazásbeállítások diagnosztikát.