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

⏱️5 min
Compartilhar:

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 .

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}

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.

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}

No ARM Template , defina os valores da seguinte maneira:

  1. Gere resourceId indicando resourceId secreto (definido na parte de variables )
  2. Obtenha o URI secreto do Key Vault com a propriedade secretUriWithVersion para o resourceId da etapa 1
  3. 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:

  1. Recursos do Azure Functions ( Microsoft.Web/sites )
  2. Key Vault
  3. Configurações de aplicativos do Azure Functions
  4. 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.

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}

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 .

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

Observe 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.

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");

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.

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

Compartilhar:

Artigos relacionados