Fügen Sie Key Vault-Verweise zu Azure-Funktionen hinzu

⏱️4 Min
Teilen:

Im Oktober dieses Jahres war GA 1 ein Feature mit dem Namen Key Vault references . Dies ist eine Funktion zum Speichern von Geheimnissen, die von Azure Functions und dem App Service in Key Vault gehandhabt werden, und zur transparenten Verwendung in Anwendungen (Verwendung als Umgebungsvariablen, ohne dass Key Vault in Anwendungen Key Vault wird). Dieser Artikel beschreibt, wie Sie diese Key Vault references . Die grundlegenden Inhalte sind die gleichen wie in Microsofts offiziellem Dokument 2 beschrieben, aber ich werde einige Notizen und Tipps selbst hinzufügen. Darüber hinaus wird in diesem Artikel beschrieben, wie Sie mithilfe von ARM Template und Azure CLI anstelle des Azure portal CI / CD-Infrastruktur erstellen.

1. Fügen Sie dem Key Vault Geheimnisse und Berechtigungen hinzu

Fügen Sie Geheimnisse und Berechtigungen für Azure Functions in Key Vault .

json
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": false
58 },
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}

Zugriffsrechte werden im accessPolicies Teil festgelegt. objectId in der Eigenschaft objectId die Managed ID der Azure Functions Zielfunktionen an. Managed ID wird später beschrieben, aber sie sind IDs zugewiesen Azure Functions , die verwendet werden können , identifizieren Azure Functions und Zugriffsrechte verwalten. Geben Sie für permissions die Berechtigungen an, die Sie gewähren möchten. Im obigen Beispiel haben Azure functions die Berechtigung, das Geheimnis anzuzeigen. Legen Sie hier die Berechtigungen entsprechend der Anwendung fest.

Das Geheimnis wird in der Ressource von Microsoft.KeyVault/vaults/secrets . Geben Sie den geheimen Wert für den value von properties . In diesem Beispiel wird der Schlüssel des Speicherkontos festgelegt. Geben Sie hier auch ein beliebiges Geheimnis an, je nach Verwendungszweck.

2. Fügen Sie Azure Functions Anwendungseinstellungen hinzu

Als Nächstes stellen wir die Anwendungseinstellungen bereit. Der Einfachheit halber werden nur die Einstellungen aufgeführt, die für Key Vault references relevant sind.

json
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}

Legen Sie in der ARM Template die folgenden Werte fest:

  1. Generieren Sie eine resourceId ID resourceId auf eine geheime resourceId hinweist (definiert im variables ).
  2. secretUriWithVersion Sie den geheimen URI des Schlüsseldepots mit der Eigenschaft secretUriWithVersion für die resourceId von Schritt 1 ab
  3. Fügen Sie den URL zu den Anwendungseinstellungen im Format von @Microsoft.KeyVault(SecretUri={secret uri})

Die in Vorlagenbeispielen angezeigte resourceId und reference werden als Vorlagenfunktionen bezeichnet. Weitere Informationen finden Sie in der offiziellen Microsoft-Dokumentation 3.

3. Stellen Sie Ressourcen unter Berücksichtigung der Abhängigkeiten bereit

Beachten Sie bei der Verwendung von Key Vault references die Reihenfolge der Bereitstellung. Die Grundreihenfolge ist wie folgt:

  1. Azure Functions ( Microsoft.Web/sites )
  2. Key Vault
  3. Azure Functions App-Einstellungen
  4. Bereitstellen von Azure Functions zip (Erstellen von Artefakten)

Stellen Sie zunächst Azure Functions . Dies liegt daran, dass beim Bereitstellen von Key Vault in Schritt 2 die Managed ID für Azure Functions im Voraus ausgestellt werden muss, um die Zugriffsrichtlinie auf Key Vault festzulegen. Managed ID kann mit der folgenden Vorlage ausgegeben werden.

json
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": true
33 },
34 "location": "[resourceGroup().location]",
35 "kind": "functionapp"
36}

Geben Sie die Eigenschaft identity mit SystemAssigned Typ. Derzeit sind Key Vault references nur für den SystemAssigned Typ SystemAssigned 2 verfügbar.

Sie können die Appsettings jedoch noch nicht in Schritt 1 bereitstellen. Da zu diesem Zeitpunkt Key Vault nicht bereitgestellt wird und Sie kein SecretUri angeben SecretUri , das für die Key Vault references obligatorisch ist. Stellen Sie nach der Bereitstellung von Key Vault in Schritt 2 die Azure Functions App-Einstellungen bereit. Stellen Sie abschließend die Azure Functions Buildartefakte bereit. Die Einschränkung hierbei ist, dass Sie die Anwendungs-Zip-Datei bereitstellen müssen, nachdem die Appsettings bereitgestellt wurden. Wenn Sie zuerst die Build-Artefakte und dann die App-Einstellungen bereitstellen, verschwindet die Funktion.

Vorsichtsmaßnahmen beim Festlegen von Anwendungen mit Azure CLI

Im obigen Beispiel wird die ARM Template . Natürlich können Sie auch die Azure CLI . Während ARM Template immer vorhandene Anwendungseinstellungen überschreibt, kann Azure CLI vorhandene Anwendungseinstellungen um neue Einstellungen erweitern, wodurch die oben genannten Abhängigkeitsbeschränkungen verringert werden. Wir haben beispielsweise angegeben, dass die App-Einstellungen in Schritt 3 nach der Bereitstellung von Key Vault in Schritt 2 und vor dem Extrahieren der ZIP-Datei in Schritt 4 erfolgen müssen. Wenn Sie die App-Einstellungen jedoch mithilfe der Azure CLI hinzufügen (nicht überschreiben) können, müssen Sie dies zuerst tun Stellen Sie zum Zeitpunkt von Schritt 1 andere Anwendungseinstellungen als die Key Vault references bereit, und fügen Sie nach dem Bereitstellen des Key Vault oder dem Extrahieren der ZIP-Datei die restlichen mit den Key Vault references Anwendungseinstellungen mithilfe der Azure CLI .

So legen Sie Anwendungseinstellungen für Key Vault in Azure CLI .

powershell
1try {
2 $ret = az keyvault secret show --vault-name $keyVaultName --name $secretName
3}
4catch
5{
6 $message = $_.Exception.message
7 throw "Failed to get key vault secret: ${message}."
8}
9$secretObj = $ret | ConvertFrom-Json
10$url = $secretObj.id
11$secretUri = '"@Microsoft.KeyVault(SecretUri={0})"' -f $url
12
13# Add appsettings for azure functions
14az functionapp config appsettings set --name $functionAppName --resource-group $resourceGroup --settings YOUR_SECRET=$secretUri

Es ist zu beachten, dass Sie Key Vault references im Format $secretUri = '"@Microsoft.KeyVault(SecretUri={0})"' -f $url . Wenn Sie wie schreiben $secretUri = "@Microsoft.KeyVault(SecretUri=${url})" , das letzte ) wird nicht richtig eingestellt und wird ein Fehler auftreten 4.

Ein weiterer zu beachtender Punkt sind die Berechtigungen, die zum Ausführen der obigen Befehle erforderlich sind. Der Benutzer oder Dienstprinzipal, der diesen Befehl ausführt, muss über Leseberechtigung für das Key Vault Geheimnis verfügen. In der oben beschriebenen Key Vault Vorlage wurde nur Azure Functions die Leseberechtigung erteilt. Lassen Sie uns dem Befehlsausführenden jedoch auch vorübergehend die Leseberechtigung erteilen.

4. Ein Geheimnis in Ihre Bewerbung bringen

Sie müssen lediglich auf die Umgebungsvariablen in Ihrem Anwendungscode zugreifen.

csharp
1// C#
2var env = System.Environment.GetEnvironmentVariable("YOUR_SECRET", EnvironmentVariableTarget.Process);
3
4// Javascript
5let env = process.env["YOUR_SECRET"];
6
7// Java
8String env = System.getenv("YOUR_SECRET");

Zusammenfassung

In diesem Artikel wurde die Verwendung von Key Vault references , die seit Oktober GA sind. Die Reihenfolge der Bereitstellung ist etwas schwierig, ansonsten sollte es nicht allzu schwierig sein. Bitte versuchen Sie es.

Footnotes

  1. Key Vault references in App Service and Azure Functions are now available

  2. Use Key Vault references for App Service and Azure Functions 2

  3. Resource functions for Azure Resource Manager templates

  4. Incorrect config value set

Teilen:

Verwandte Artikel