Använd Key Vault-referenser för App Service och Azure Functions
Det här avsnittet visar hur du arbetar med hemligheter från Azure Key Vault i ditt App Service eller Azure Functions-program utan att några kodändringar krävs. Azure Key Vault är en tjänst som tillhandahåller centraliserad hemlighetshantering med fullständig kontroll över åtkomstprinciper och granskningshistorik.
Bevilja din app åtkomst till Key Vault
För att kunna läsa hemligheter från Key Vault måste du ha skapat ett valv och ge appen behörighet att komma åt det.
Skapa ett nyckelvalv genom att följa Key Vault snabbstarten.
Skapa en hanterad identitet för ditt program.
Key Vault-referenser använder appens system tilldelade identitet som standard, men du kan ange en användar tilldelad identitet.
Skapa en åtkomstprincip i Key Vault för den programidentitet som du skapade tidigare. Aktivera behörigheten "Hämta" för den här principen. Konfigurera inte det "auktoriserade programmet" eller inställningarna
applicationIdeftersom det inte är kompatibelt med en hanterad identitet.
Åtkomst till nätverksbegränsade valv
Om valvet har konfigurerats med nätverksbegränsningarmåste du också se till att programmet har nätverksåtkomst.
Kontrollera att programmet har utgående nätverksfunktioner konfigurerade, enligt beskrivningen i App Service nätverksfunktionerna och Azure Functions nätverksalternativen.
Linux-program som försöker använda privata slutpunkter kräver dessutom att appen uttryckligen konfigureras så att all trafik dirigeras genom det virtuella nätverket. Detta krav tas bort i en kommande uppdatering. Ange detta genom att använda följande CLI-kommando:
az webapp config set --subscription <sub> -g <rg> -n <appname> --generic-configurations '{"vnetRouteAllEnabled": true}'Kontrollera att valvets konfigurationskonton för nätverket eller undernätet som appen kommer åt det via.
Anteckning
Windows för närvarande inte stöd för Key Vault över VNet-integrering.
Få åtkomst till valv med en användar tilldelad identitet
Vissa appar måste referera till hemligheter när de skapas, när en system tilldelad identitet ännu inte är tillgänglig. I dessa fall kan en användar tilldelad identitet skapas och ges åtkomst till valvet i förväg.
Följ dessa steg när du har beviljat behörigheter till den användar tilldelade identiteten:
Tilldela identiteten till ditt program om du inte redan har gjort det.
Konfigurera appen att använda den här identiteten för Key Vault-referensåtgärder genom att ange egenskapen till
keyVaultReferenceIdentityresurs-ID:t för den användar tilldelade identiteten.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}'}}"
Den här konfigurationen gäller för alla referenser för appen.
Referenssyntax
En Key Vault referens har formen @Microsoft.KeyVault({referenceString}) , där {referenceString} ersätts med något av följande alternativ:
| Referenssträng | Description |
|---|---|
| SecretUri=secretUri | SecretUri ska vara den fullständiga dataplans-URI:en för en hemlighet i Key Vault, eventuellt inklusive en version, t.ex. https://myvault.vault.azure.net/secrets/mysecret/ eller https://myvault.vault.azure.net/secrets/mysecret/ec96f02080254f109c51a1f14cdb1931 |
| VaultName=vaultName; SecretName=secretName; SecretVersion=secretVersion | VaultName är obligatoriskt och bör namnet på din Key Vault resurs. SecretName är obligatoriskt och ska vara namnet på målhemligheten. SecretVersion är valfritt, men om det finns anger den version av hemligheten som ska användas. |
En fullständig referens skulle till exempel se ut så här:
@Microsoft.KeyVault(SecretUri=https://myvault.vault.azure.net/secrets/mysecret/)
Du kan också:
@Microsoft.KeyVault(VaultName=myvault;SecretName=mysecret)
Rotation
Om en version inte anges i referensen använder appen den senaste versionen som finns i nyckelvalvet. När nyare versioner blir tillgängliga, till exempel med en rotationshändelse, uppdateras appen automatiskt och börjar använda den senaste versionen inom 24 timmar. Fördröjningen beror på App Service cachelagrar värdena för nyckelvalvsreferenserna och refetrar dem var 24:e timme. Alla konfigurationsändringar i appen orsakar en omedelbar återanering av alla refererade hemligheter.
Källprogram Inställningar från Key Vault
Key Vault-referenser kan användas som värden för Application Inställningar,så att du kan behålla hemligheter i Key Vault stället för platskonfigurationen. Program Inställningar krypteras säkert i vila, men om du behöver funktioner för hemlighetshantering bör de gå in på Key Vault.
Om du vill Key Vault referens för en programinställninganger du referensen som värdet för inställningen. Din app kan referera till hemligheten via dess nyckel som vanligt. Inga kodändringar krävs.
Tips
De flesta programinställningar som använder Key Vault-referenser ska markeras som fackinställningar, eftersom du bör ha separata valv för varje miljö.
Överväganden vid Azure Files montering
Appar kan använda WEBSITE_CONTENTAZUREFILECONNECTIONSTRING programinställningen för att Azure Files som filsystem. Den här inställningen har ytterligare verifieringskontroller för att säkerställa att appen kan startas korrekt. Plattformen förlitar sig på att ha en innehållsresurs i Azure Files, och den förutsätter ett standardnamn om inget annat anges via WEBSITE_CONTENTSHARE inställningen. För begäranden som ändrar de här inställningarna försöker plattformen verifiera om innehållsresursen finns och försöker skapa den om den inte finns. Om den inte kan hitta eller skapa innehållsresursen blockeras begäran.
När du Key Vault för den här inställningen misslyckas den här valideringskontrollen som standard, eftersom själva hemligheten inte kan matchas vid bearbetning av den inkommande begäran. För att undvika det här problemet kan du hoppa över verifieringen genom att WEBSITE_SKIP_CONTENTSHARE_VALIDATION ange "1". Detta kringgår alla kontroller och innehållsresursen skapas inte åt dig. Du bör se till att den skapas i förväg.
Varning
Om du hoppar över verifieringen och anslutningssträngen eller innehållsresursen är ogiltig kan appen inte starta korrekt och kommer endast att visa HTTP 500-fel.
Som en del av att skapa webbplatsen är det också möjligt att monteringsförsöket av innehållsresursen misslyckas på grund av att behörigheter för hanterad identitet inte sprids eller att integreringen av virtuella nätverk inte konfigureras. Du kan skjuta upp inställningen Azure Files senare i distributionsmallen för att hantera detta. Mer Azure Resource Manager finns i Azure Resource Manager distribution. App Service använder ett standardfilsystem tills Azure Files har ställts in och filer inte kopieras över, så du måste se till att inga distributionsförsök görs under övergångsperioden innan Azure Files monteras.
Azure Resource Manager-distribution
När du automatiserar resursdistributioner via Azure Resource Manager-mallar kan du behöva sekvensera dina beroenden i en viss ordning för att den här funktionen ska fungera. Observera att du måste definiera programinställningarna som en egen resurs i stället för att använda en siteConfig egenskap i platsdefinitionen. Det beror på att platsen måste definieras först så att den system tilldelade identiteten skapas med den och kan användas i åtkomstprincipen.
Ett exempel på en pseudomall för en funktionsapp kan se ut så här:
{
//...
"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]"
}
}
]
}
]
}
Anteckning
I det här exemplet beror källkontrolldistributionen på programinställningarna. Detta är vanligtvis osäkert eftersom uppdateringen av appinställningen beter sig asynkront. Men eftersom vi har inkluderat WEBSITE_ENABLE_SYNC_UPDATE_SITE programinställningen är uppdateringen synkron. Det innebär att distributionen av källkontrollen bara börjar när programinställningarna har uppdaterats fullständigt. Fler appinställningar finns i Miljövariabler och appinställningar i Azure App Service.
Felsöka Key Vault referenser
Om en referens inte matchas korrekt används referensvärdet i stället. Det innebär att för programinställningar skapas en miljövariabel vars värde har @Microsoft.KeyVault(...) syntaxen . Detta kan göra att programmet kastar fel, eftersom det förväntade sig en hemlighet av en viss struktur.
Oftast beror detta på en felaktig konfiguration av Key Vault åtkomstprincip . Men det kan också bero på att en hemlighet inte längre finns eller ett syntaxfel i själva referensen.
Om syntaxen är korrekt kan du visa andra orsaker till fel genom att kontrollera den aktuella lösningsstatusen i portalen. Gå till Program Inställningar och välj "Redigera" för referensen i fråga. Under inställningskonfigurationen bör du se statusinformation, inklusive eventuella fel. Frånvaron av dessa innebär att referenssyntaxen är ogiltig.
Du kan också använda en av de inbyggda detektorerna för att få ytterligare information.
Använda detektorn för App Service
- Navigera till din app i portalen.
- Välj Diagnostisera och lösa problem.
- Välj Tillgänglighet och prestanda och välj Webbappen nere.
- Leta upp Key Vault Application Inställningar Diagnostics och klicka på Mer information.
Använda detektorn för Azure Functions
- Navigera till din app i portalen.
- Gå till Plattformsfunktioner.
- Välj Diagnostisera och lösa problem.
- Välj Tillgänglighet och prestanda och välj Funktionsappen är nere eller rapporterar fel.
- Klicka på Key Vault Application Inställningar Diagnostics.