Gebruik Key Vault voor App Service en Azure Functions
In dit onderwerp ziet u hoe u werkt met geheimen van Azure Key Vault in uw App Service of Azure Functions-toepassing zonder dat er codewijzigingen nodig zijn. Azure Key Vault is een service die gecentraliseerd geheimenbeheer biedt, met volledige controle over toegangsbeleid en controlegeschiedenis.
Uw app toegang verlenen tot Key Vault
Als u geheimen wilt lezen uit Key Vault, moet u een kluis hebben gemaakt en uw app toestemming geven om er toegang toe te krijgen.
Maak een sleutelkluis door de Key Vault te volgen.
Maak een beheerde identiteit voor uw toepassing.
Key Vault wordt standaard de door het systeem toegewezen identiteit van de app gebruikt, maar u kunt een door de gebruiker toegewezen identiteit opgeven.
Maak een toegangsbeleid in Key Vault voor de toepassings-id die u eerder hebt gemaakt. Schakel de machtiging Geheim 'Get' in voor dit beleid. Configureer de 'geautoriseerde toepassing' of
applicationIdinstellingen niet, omdat dit niet compatibel is met een beheerde identiteit.
Toegang tot kluizen met beperkte netwerktoegang
Als uw kluis is geconfigureerd met netwerkbeperkingen,moet u er ook voor zorgen dat de toepassing netwerktoegang heeft.
Zorg ervoor dat voor de toepassing uitgaande netwerkmogelijkheden zijn geconfigureerd, zoals beschreven in App Service netwerkfuncties en Azure Functions netwerkopties.
Voor Linux-toepassingen die privé-eindpunten proberen te gebruiken, moet de app expliciet worden geconfigureerd zodat al het verkeer via het virtuele netwerk wordt gerouteerd. Deze vereiste wordt verwijderd in een toekomstige update. Gebruik de volgende CLI-opdracht om dit in te stellen:
az webapp config set --subscription <sub> -g <rg> -n <appname> --generic-configurations '{"vnetRouteAllEnabled": true}'Zorg ervoor dat de configuratieaccounts van de kluis voor het netwerk of subnet waarmee uw app toegang krijgt.
Notitie
Windows container biedt momenteel geen ondersteuning voor Key Vault via VNet-integratie.
Toegang tot kluizen met een door de gebruiker toegewezen identiteit
Sommige apps moeten tijdens het maken naar geheimen verwijzen, wanneer een door het systeem toegewezen identiteit nog niet beschikbaar is. In dergelijke gevallen kan een door de gebruiker toegewezen identiteit vooraf worden gemaakt en toegang krijgen tot de kluis.
Nadat u machtigingen hebt verleend voor de door de gebruiker toegewezen identiteit, volgt u deze stappen:
Wijs de identiteit toe aan uw toepassing als u dat nog niet hebt gedaan.
Configureer de app om deze identiteit te gebruiken voor Key Vault referentiebewerkingen door de eigenschap in te stellen op de resource-id van de door de gebruiker
keyVaultReferenceIdentitytoegewezen identiteit.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}'}}"
Deze configuratie is van toepassing op alle verwijzingen voor de app.
Referentiesyntaxis
Een Key Vault heeft de vorm @Microsoft.KeyVault({referenceString}) , waarbij {referenceString} wordt vervangen door een van de volgende opties:
| Referentiereeks | Description |
|---|---|
| SecretUri =secretUri | De SecretUri moet de volledige gegevensvlak-URI zijn van een geheim in Key Vault, eventueel inclusief een versie, https://myvault.vault.azure.net/secrets/mysecret/ bijvoorbeeld of https://myvault.vault.azure.net/secrets/mysecret/ec96f02080254f109c51a1f14cdb1931 |
| VaultName=vaultName; SecretName=secretName; SecretVersion =secretVersion | De VaultName is vereist en moet de naam van uw Key Vault resource. De SecretName is vereist en moet de naam van het doelgeheim zijn. SecretVersion is optioneel, maar als aanwezig is, wordt aangegeven welke versie van het geheim moet worden gebruikt. |
Een volledige verwijzing ziet er bijvoorbeeld als volgt uit:
@Microsoft.KeyVault(SecretUri=https://myvault.vault.azure.net/secrets/mysecret/)
U kunt ook het volgende doen:
@Microsoft.KeyVault(VaultName=myvault;SecretName=mysecret)
Rotatie
Als er geen versie is opgegeven in de verwijzing, gebruikt de app de nieuwste versie die bestaat in de sleutelkluis. Wanneer nieuwere versies beschikbaar komen, zoals bij een rotatiegebeurtenis, wordt de app automatisch bijgewerkt en wordt binnen 24 uur de nieuwste versie gebruikt. De vertraging is omdat App Service waarden van de sleutelkluisverwijzingen in de cache opgeslagen en elke 24 uur opnieuw opsorteert. Eventuele configuratiewijzigingen in de app zorgen ervoor dat alle geheimen waarnaar wordt verwezen, onmiddellijk opnieuw worden opgeslagen.
Brontoepassing Instellingen uit Key Vault
Key Vault kunnen worden gebruikt als waarden voor Application Instellingen,zodat u geheimen in uw Key Vault in plaats van de site-configuratie kunt bewaren. Toepassings Instellingen's worden in rust veilig versleuteld, maar als u mogelijkheden voor geheimbeheer nodig hebt, moeten ze worden Key Vault.
Als u een Key Vault voor een toepassingsinstellingwilt gebruiken, stelt u de verwijzing in als de waarde van de instelling. Uw app kan op de gebruikelijke manier verwijzen naar het geheim via de sleutel. Er zijn geen codewijzigingen vereist.
Tip
De meeste toepassingsinstellingen die Key Vault, moeten worden gemarkeerd als site-instellingen, omdat u afzonderlijke kluizen voor elke omgeving moet hebben.
Overwegingen voor Azure Files-mounting
Apps kunnen de WEBSITE_CONTENTAZUREFILECONNECTIONSTRING toepassingsinstelling gebruiken om een Azure Files als het bestandssysteem. Deze instelling heeft aanvullende validatiecontroles om ervoor te zorgen dat de app goed kan worden gestart. Het platform is afhankelijk van een inhouds share binnen Azure Files, en er wordt uitgenomen dat er een standaardnaam is, tenzij er een is opgegeven via de WEBSITE_CONTENTSHARE instelling. Voor aanvragen die deze instellingen wijzigen, probeert het platform te valideren of deze inhouds share bestaat en wordt geprobeerd deze te maken als dat niet het geval is. Als de inhouds share niet kan worden gevonden of maken, wordt de aanvraag geblokkeerd.
Wanneer u Key Vault voor deze instelling gebruikt, mislukt deze validatiecontrole standaard, omdat het geheim zelf niet kan worden opgelost tijdens het verwerken van de binnenkomende aanvraag. U kunt dit probleem voorkomen door de validatie over te slaan door in te WEBSITE_SKIP_CONTENTSHARE_VALIDATION stellen op 1. Hiermee worden alle controles overgeslagen en wordt de inhouds delen niet voor u gemaakt. U moet ervoor zorgen dat deze van tevoren wordt gemaakt.
Waarschuwing
Als u de validatie overslaat en de connection string of inhouds delen ongeldig zijn, kan de app niet goed worden starten en worden alleen HTTP 500-fouten uitgevoerd.
Als onderdeel van het maken van de site, is het ook mogelijk dat het koppelingspogingen van de inhouds share kan mislukken omdat machtigingen voor beheerde identiteiten niet zijn doorgegeven of de integratie van het virtuele netwerk niet is ingesteld. U kunt het instellen van de Azure Files later in de implementatiesjabloon uitstellen om dit mogelijk te maken. Zie Azure Resource Manager implementatie voor meer informatie. App Service maakt gebruik van een standaardbestandssysteem totdat Azure Files is ingesteld en bestanden niet worden gekopieerd. Daarom moet u ervoor zorgen dat er geen implementatiepogingen plaatsvinden in de tussenperiode voordat Azure Files wordt Azure Files.
Implementatie van Azure Resource Manager
Wanneer u resource-implementaties automatiseerd via Azure Resource Manager sjablonen, moet u mogelijk uw afhankelijkheden in een bepaalde volgorde sequentieën om deze functie te laten werken. Let op: u moet uw toepassingsinstellingen definiëren als hun eigen resource, in plaats van een eigenschap in de siteConfig sitedefinitie te gebruiken. Dit komt doordat de site eerst moet worden gedefinieerd, zodat de door het systeem toegewezen identiteit hiermee wordt gemaakt en kan worden gebruikt in het toegangsbeleid.
Een voorbeeld van een pseudosjabloon voor een functie-app kan er als volgt uitzien:
{
//...
"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]"
}
}
]
}
]
}
Notitie
In dit voorbeeld is de implementatie van broncodebeheer afhankelijk van de toepassingsinstellingen. Dit is normaal gesproken onveilig gedrag, omdat de update van de app-instelling asynchroon werkt. Omdat we de toepassingsinstelling hebben WEBSITE_ENABLE_SYNC_UPDATE_SITE opgenomen, is de update echter synchroon. Dit betekent dat de implementatie van broncodebeheer pas begint wanneer de toepassingsinstellingen volledig zijn bijgewerkt. Zie Omgevingsvariabelen en app-instellingen inAzure App Service voor meer Azure App Service.
Problemen met Key Vault oplossen
Als een verwijzing niet correct wordt opgelost, wordt in plaats daarvan de referentiewaarde gebruikt. Dit betekent dat voor toepassingsinstellingen een omgevingsvariabele wordt gemaakt waarvan de waarde de @Microsoft.KeyVault(...) syntaxis heeft. Dit kan ertoe leiden dat de toepassing fouten veroorzaakt, omdat er een geheim van een bepaalde structuur werd verwacht.
Dit komt meestal door een onjuiste configuratie van het Key Vault toegangsbeleid. Dit kan echter ook het gevolg zijn van een geheim dat niet meer bestaat of een syntaxisfout in de verwijzing zelf.
Als de syntaxis juist is, kunt u andere oorzaken voor fouten bekijken door de huidige oplossingsstatus in de portal te controleren. Navigeer naar Instellingen en selecteer 'Bewerken' voor de referentie in kwestie. Onder de instellingsconfiguratie ziet u statusinformatie, inclusief eventuele fouten. De afwezigheid van deze impliceert dat de verwijzingssyntaxis ongeldig is.
U kunt ook een van de ingebouwde detectoren gebruiken om aanvullende informatie op te halen.
De detector gebruiken voor App Service
- Navigeer in de portal naar uw app.
- Selecteer Problemen vaststellen en oplossen.
- Kies Beschikbaarheid en prestaties en selecteer Web-app omlaag.
- Zoek Key Vault Application Instellingen Diagnostics en klik op Meer informatie.
De detector gebruiken voor Azure Functions
- Navigeer in de portal naar uw app.
- Navigeer naar Platformfuncties.
- Selecteer Problemen vaststellen en oplossen.
- Kies Beschikbaarheid en prestaties en selecteer Functie-app niet beschikbaar of rapporteert fouten.
- Klik op Key Vault Application Instellingen Diagnostics.