Adicionar referências do Key Vault às Funções do Azure

Este artigo foi publicado há mais de um ano. As informações podem estar desatualizadas.
Em outubro deste ano, um recurso chamado Key Vault references foi o GA 1.
Essa é uma função para armazenar segredos manipulados pelo Azure Functions e App Service no Key Vault e usá-los de forma transparente nos aplicativos (use como variáveis de ambiente sem conhecer o Key Vault dos aplicativos).
Este artigo descreve como obter essas Key Vault references . O conteúdo básico é o mesmo descrito no documento oficial da Microsoft 2, mas adicionarei algumas notas e dicas por conta própria.
Além disso, este artigo descreve como implementar usando o ARM Template e a Azure CLI do Azure portal vez do Azure portal do Azure portal , o que ajudará a construir a infraestrutura de CI / CD.
1. Adicione segredos e permissões ao Key Vault
Adicione segredos e permissões do Azure Functions no 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}Os direitos de acesso são definidos na parte accessPolicies . Na propriedade chamada objectId , especifique a Managed ID das Azure Functions destino. Managed ID é descrito posteriormente, mas eles são atribuídos ao Azure Functions que podem ser usados para identificar o Azure Functions e gerenciar os direitos de acesso.
Para permissions , especifique as permissões que você deseja conceder. No exemplo acima, as Azure functions terão permissão para exibir o segredo. Defina aqui as permissões de acordo com o aplicativo.
O segredo é definido no recurso Microsoft.KeyVault/vaults/secrets . Especifique o valor secreto no value das properties . Neste exemplo, a chave da conta de armazenamento está definida. Especifique também qualquer segredo aqui de acordo com a finalidade.
2. Adicione configurações do aplicativo às Azure Functions
Em seguida, vamos implantar as configurações do aplicativo. Para simplificar, apenas as configurações relevantes para as Key Vault references são listadas.
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}No ARM Template , defina os valores da seguinte maneira:
- Gere
resourceIdindicandoresourceIdsecreto (definido na parte devariables) - Obtenha o URI secreto do Key Vault com a propriedade
secretUriWithVersionpara oresourceIdda etapa 1 - Adicione o uri às configurações do aplicativo no formato
@Microsoft.KeyVault(SecretUri={secret uri})
O resourceId e a reference que aparecem nos exemplos de modelo são chamados de funções de modelo. Para mais informações, consulte a documentação oficial da Microsoft 3.
3. Implante recursos com atenção às dependências
Ao usar as Key Vault references , lembre-se da ordem de implantação.
A ordem básica é a seguinte:
- Recursos do
Azure Functions(Microsoft.Web/sites) Key Vault- Configurações de aplicativos do
Azure Functions - Implantar zip do
Azure Functions(artefatos de compilação)
Primeiro, implante o Azure Functions .
Isso ocorre porque, quando você implanta o Key Vault na etapa 2, a Managed ID do Azure Functions deve ter sido emitida com antecedência para definir a política de acesso ao Key Vault .
Managed ID pode ser emitido com o seguinte modelo.
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}Especifique a identity da propriedade com o tipo SystemAssigned . No momento, as Key Vault references estão disponíveis apenas para o tipo de ID SystemAssigned 2.
No entanto, você não pode implantar as configurações de aplicativos ainda na etapa 1. Como neste momento, o Key Vault não está implantado e você não pode especificar um SecretUri , que é obrigatório para as Key Vault references do Key Vault references .
Após a implantação do Key Vault na etapa 2, implante as configurações de aplicativos do Azure Functions .
Finalmente, implante as artefatos de compilação do Azure Functions . A ressalva aqui é que você precisa implantar o zip do aplicativo após a implantação das configurações do apps. Se você implantar os artefatos de construção primeiro e depois implantar as configurações de aplicativos, a função desaparecerá.
Precauções ao definir aplicativos usando a Azure CLI
O exemplo acima usa o ARM Template , mas é claro que você também pode aproveitar a Azure CLI do Azure CLI .
Embora o ARM Template sempre substitua as configurações de aplicativos existentes, a Azure CLI pode adicionar novas configurações às configurações de aplicativos existentes, reduzindo assim as restrições de dependência acima.
Por exemplo, afirmamos que as configurações de aplicativos na etapa 3 devem ocorrer após a implantação do Key Vault na etapa 2 e antes de extrair o zip na etapa 4. Mas se você pode adicionar (não substituir) as configurações de aplicativos usando a Azure CLI do Azure CLI , primeiro é possível implante as configurações do aplicativo que não sejam as Key Vault references do Key Vault references no momento da etapa 1 e depois de implantar o Key Vault ou extrair o zip, adicione o restante das configurações de aplicativos relacionadas às Key Vault references do Key Vault references usando a Azure CLI do Azure CLI .
Veja como especificar configurações de aplicativos para o Key Vault na 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=$secretUriObserve que você precisa definir as Key Vault references no formato $secretUri = '"@Microsoft.KeyVault(SecretUri={0})"' -f $url . Se você escrever como $secretUri = "@Microsoft.KeyVault(SecretUri=${url})" , o último ) será definido incorretamente e ocorrerá um erro 4.
Outro ponto a ser observado é as permissões necessárias para executar os comandos acima. O usuário ou principal de serviço que executa este comando deve ter permissão de leitura para o segredo do Key Vault . No modelo do Key Vault descrito acima, somente as Azure Functions receberam permissão de leitura, mas vamos conceder temporariamente a permissão de leitura também ao executor de comandos.
4. Obtendo um segredo em seu aplicativo
Tudo o que você precisa fazer é acessar as variáveis de ambiente no código do aplicativo.
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");Sumário
Este artigo descreveu como usar as Key Vault references que são do GA desde outubro. A ordem de implantação é um pouco complicada, mas, caso contrário, não deve ser muito difícil.
Por favor, tente usá-lo.

