Aggiungi i riferimenti di Key Vault alle funzioni di Azure

Questo articolo è stato pubblicato più di un anno fa. Le informazioni potrebbero essere obsolete.
Nell'ottobre di quest'anno, una funzione chiamata Key Vault references era GA 1.
Questa è una funzione per archiviare i segreti gestiti da Azure Functions e il App Service in Key Vault e usarli in modo trasparente dalle applicazioni (usare come variabili di ambiente senza conoscere Key Vault dalle applicazioni).
Questo articolo descrive come ottenere questi Key Vault references . I contenuti di base sono gli stessi descritti nel documento ufficiale di Microsoft 2, ma aggiungerò alcune note e suggerimenti per conto mio.
Inoltre, questo articolo descrive come implementare usando il ARM Template e l' Azure CLI di Azure portal di Azure portal anziché il Azure portal di Azure portal , che ti aiuterà a costruire l'infrastruttura CI / CD.
1. Aggiungi segreti e autorizzazioni a Key Vault
Aggiungi segreti e autorizzazioni di Azure Functions di Azure Functions in Key Vault .
1{2 "$schema": "https://schema.management.azure.com/schemas/2018-05-01/deploymentTemplate.json#",3 "contentVersion": "1.0.0.0",4 "parameters": {5 "keyVaultName": {6 "type": "string",7 "metadata": {8 "description": "Key Vault Name"9 }10 },11 "secretName": {12 "type": "string",13 "metadata": {14 "description": "Secret Name"15 }16 },17 "functionAppName": {18 "type": "string",19 "metadata": {20 "description": "Function App Name"21 }22 },23 "storageAccountName": {24 "type": "string",25 "metadata": {26 "description": "Storage Account Name"27 }28 }29 },30 "variables": {},31 "resources": [32 {33 "name": "[parameters('keyVaultName')]",34 "type": "Microsoft.KeyVault/vaults",35 "apiVersion": "2018-02-14",36 "location": "[resourceGroup().location]",37 "properties": {38 "tenantId": "[subscription().tenantId]",39 "sku": {40 "family": "A",41 "name": "standard"42 },43 "accessPolicies": [44 {45 "tenantId": "[subscription().tenantId]",46 "objectId": "[reference(resourceId('Microsoft.Web/sites', parameters('functionAppName')), '2016-03-01', 'Full').identity.principalId]",47 "permissions": {48 "keys": [],49 "secrets": ["get"],50 "certificates": [],51 "storage": []52 }53 }54 ],55 "enabledForDeployment": false,56 "enabledForDiskEncryption": false,57 "enabledForTemplateDeployment": false58 },59 "resources": [60 {61 "name": "[concat(parameters('keyVaultName'), '/', parameters('secretName'))]",62 "type": "Microsoft.KeyVault/vaults/secrets",63 "apiVersion": "2018-02-14",64 "dependsOn": [65 "[resourceId('Microsoft.KeyVault/vaults', parameters('keyVaultName'))]"66 ],67 "properties": {68 "value": "[concat('DefaultEndpointsProtocol=https;AccountName=',parameters('storageAccountName'),';AccountKey=',listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2015-05-01-preview').key1)]"69 }70 }71 ]72 }73 ]74}I diritti di accesso sono impostati nella parte accessPolicies . Nella proprietà chiamata objectId , specificare l' Managed ID delle Azure Functions destinazione. Managed ID viene descritto in seguito, ma sono ID assegnati alle Azure Functions che possono essere usati per identificare le Azure Functions e gestire i diritti di accesso.
Per le permissions , specificare le autorizzazioni che si desidera concedere. Nell'esempio sopra, le Azure functions avranno l'autorizzazione per visualizzare il segreto. Imposta qui le autorizzazioni in base all'applicazione.
Il segreto è impostato nella risorsa di Microsoft.KeyVault/vaults/secrets . Specifica il valore segreto in value delle properties . In questo esempio, viene impostata la chiave dell'account di archiviazione. Specificare anche qualsiasi segreto qui in base allo scopo.
2. Aggiungere le impostazioni dell'applicazione a Azure Functions
Quindi, implementiamo le impostazioni dell'applicazione. Per semplicità, sono elencate solo le impostazioni relative ai riferimenti di Key Vault references .
1{2 "$schema": "https://schema.management.azure.com/schemas/2018-05-01/deploymentTemplate.json#",3 "contentVersion": "1.0.0.0",4 "parameters": {5 "keyVaultName": {6 "type": "string",7 "metadata": {8 "description": "Key Vault Name"9 }10 },11 "secretName": {12 "type": "string",13 "metadata": {14 "description": "Secret Name"15 }16 },17 "functionAppName": {18 "type": "string",19 "metadata": {20 "description": "Function App Name"21 }22 }23 },24 "variables": {25 "secretResourceId": "[resourceId(resourceGroup().name, 'Microsoft.KeyVault/vaults/secrets', parameters('keyVaultName'), 'parameters('secretName')')]"26 },27 "resources": [28 {29 "name": "[concat(parameters('functionAppName'), '/appsettings')]",30 "type": "Microsoft.Web/sites/config",31 "apiVersion": "2018-11-01",32 "location": "[resourceGroup().location]",33 "properties": {34 "YOUR_SECRET": "[concat('@Microsoft.KeyVault(SecretUri=', reference(variables('secretResourceId'), '2018-02-14').secretUriWithVersion, ')')]"35 }36 }37 ]38}All'interno del ARM Template , impostare i valori come segue:
- Genera
resourceIdindicaresourceIdsegreta (definita nella partevariables) - Ottenere segreto URI è la chiave Vault con la proprietà
secretUriWithVersionper laresourceIddella fase 1 - Aggiungi l'uri alle impostazioni dell'applicazione nel formato di
@Microsoft.KeyVault(SecretUri={secret uri})
L' resourceId e il reference che compaiono negli esempi dei modelli sono chiamati funzioni dei modelli. Per ulteriori informazioni, consultare la documentazione ufficiale di Microsoft 3.
3. Distribuire le risorse con attenzione alle dipendenze
Quando si utilizzano i Key Vault references , tenere presente l'ordine di distribuzione.
L'ordine di base è il seguente:
- Risorse di
Azure Functions(Microsoft.Web/sites) Key Vault- Impostazioni di app di
Azure Functions - Distribuire zip di
Azure Functions(compilare artefatti)
Innanzitutto, distribuire Azure Functions .
Questo perché quando si distribuisce Key Vault nel passaggio 2, l' Managed ID per Azure Functions deve essere stato emesso in anticipo per impostare i criteri di accesso su Key Vault .
Managed ID può essere emesso con il seguente modello.
1{2 "apiVersion": "2016-03-01",3 "name": "[parameters('functionAppName')]",4 "type": "Microsoft.Web/sites",5 "identity": {6 "type": "SystemAssigned"7 },8 "properties": {9 "name": "[parameters('functionAppName')]",10 "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]",11 "hostNameSslStates": [12 {13 "name": "[concat(variables('functionAppName'),'.azurewebsites.net')]",14 "sslState": "Disabled",15 "virtualIP": null,16 "thumbprint": null,17 "toUpdate": null,18 "hostType": "Standard"19 },20 {21 "name": "[concat(variables('functionAppName'),'.scm.azurewebsites.net')]",22 "sslState": "Disabled",23 "virtualIP": null,24 "thumbprint": null,25 "toUpdate": null,26 "hostType": "Repository"27 }28 ],29 "siteConfig": null,30 "clientAffinityEnabled": false,31 "reserved": false,32 "httpsOnly": true33 },34 "location": "[resourceGroup().location]",35 "kind": "functionapp"36}Specificare l' identity della proprietà con il tipo SystemAssigned . Al momento, i Key Vault references sono disponibili solo per il tipo di ID SystemAssigned 2.
Tuttavia, non è ancora possibile distribuire le impostazioni delle app al passaggio 1. Perché a questo punto Key Vault non è distribuito e non è possibile specificare un SecretUri , che è obbligatorio per i Key Vault references .
Dopo aver distribuito Key Vault nel passaggio 2, distribuire le impostazioni Azure Functions app di Azure Functions .
Infine, distribuire gli artefatti di compilazione di Azure Functions . L'avvertenza qui è che è necessario distribuire lo zip dell'applicazione dopo che le app sono state distribuite. Se si distribuiscono prima gli artefatti di build e quindi si distribuiscono le impostazioni delle app, la funzione scomparirà.
Precauzioni durante l'impostazione delle applicazioni usando l' Azure CLI
L'esempio sopra usa il ARM Template , ma ovviamente puoi anche sfruttare l' Azure CLI di Azure CLI .
Mentre ARM Template sovrascrive sempre le impostazioni dell'applicazione esistenti, l' Azure CLI può aggiungere nuove impostazioni alle impostazioni dell'applicazione esistenti, riducendo così i vincoli di dipendenza sopra indicati.
Ad esempio, abbiamo affermato che le impostazioni delle app nel passaggio 3 devono essere successive alla distribuzione di Key Vault nel passaggio 2 e prima di estrarre lo zip nel passaggio 4. Ma se è possibile aggiungere (non sovrascrivere) le impostazioni delle app usando l'interfaccia della Azure CLI comando di Azure CLI , è possibile innanzitutto distribuire le impostazioni dell'applicazione diverse dai Key Vault references al momento del passaggio 1 e dopo aver distribuito Key Vault o aver estratto lo zip, quindi aggiungere il resto delle impostazioni delle app correlate ai Key Vault references usando l'interfaccia della riga di comando di Azure CLI .
Ecco come specificare le impostazioni dell'applicazione per Key Vault nell'interfaccia della Azure CLI di Azure CLI .
1try {2 $ret = az keyvault secret show --vault-name $keyVaultName --name $secretName3}4catch5{6 $message = $_.Exception.message7 throw "Failed to get key vault secret: ${message}."8}9$secretObj = $ret | ConvertFrom-Json10$url = $secretObj.id11$secretUri = '"@Microsoft.KeyVault(SecretUri={0})"' -f $url12 13# Add appsettings for azure functions14az functionapp config appsettings set --name $functionAppName --resource-group $resourceGroup --settings YOUR_SECRET=$secretUriVa notato che è necessario impostare i Key Vault references nel formato di $secretUri = '"@Microsoft.KeyVault(SecretUri={0})"' -f $url . Se scrivi come $secretUri = "@Microsoft.KeyVault(SecretUri=${url})" , l'ultimo ) verrà impostato in modo errato e si verificherà un errore 4.
Un altro punto da notare sono le autorizzazioni necessarie per eseguire i comandi sopra. L'utente o l'entità servizio che esegue questo comando deve disporre dell'autorizzazione di lettura per il segreto di Key Vault . Nel modello di Key Vault sopra descritto, solo le Azure Functions hanno ottenuto l'autorizzazione di lettura, ma concediamo temporaneamente l'autorizzazione di lettura anche all'esecutore del comando.
4. Ottenere un segreto nella tua applicazione
Tutto quello che devi fare è solo accedere alle variabili di ambiente nel codice dell'applicazione.
1// C#2var env = System.Environment.GetEnvironmentVariable("YOUR_SECRET", EnvironmentVariableTarget.Process);3 4// Javascript5let env = process.env["YOUR_SECRET"];6 7// Java8String env = System.getenv("YOUR_SECRET");Sommario
Questo articolo ha descritto come utilizzare i Key Vault references che sono stati GA da ottobre. L'ordine di distribuzione è un po 'complicato, ma per il resto non dovrebbe essere troppo difficile.
Per favore prova ad usarlo.




