Gerir segredos no modelo do ARM ao ler a partir do Azure Key Vault

Concluído

A infraestrutura como código (IaC) refere-se à descrição dos requisitos de infraestrutura como ficheiros de texto legíveis. Os modelos do Azure Resource Manager (ARM) são uma forma de IaC.

Tal como o código da aplicação, pode gerir o código da infraestrutura num sistema de controlo de versões, como o Git. Ao fazê-lo, pode colaborar com outras pessoas e controlar as alterações aos requisitos de infraestrutura à medida que evoluem.

Tal como o código de aplicação, não deve codificar as informações confidenciais, como palavras-passe e chaves de API, nos modelos do ARM. Caso contrário, qualquer pessoa com acesso de leitura ao repositório terá acesso a estas informações secretas.

Embora apenas pessoas autorizadas na sua organização devam ter acesso a informações confidenciais, os modelos do ARM também requerem estas informações. O Azure Key Vault é uma forma de ajudar a proteger as informações confidenciais.

O Azure Key Vault ajuda a proteger informações confidenciais

O Azure Key Vault é um serviço cloud que funciona como um arquivo de segredos seguro. O Key Vault permite-lhe criar vários contentores seguros, chamados "cofres". Estes cofres são apoiados por módulos de segurança de hardware (HSMs). Os cofres centralizam o armazenamento dos segredos das aplicações, o que ajuda a reduzir as possibilidades de perda acidental de informações de segurança. Os cofres também controlam e registam o acesso a tudo o que está armazenado nos mesmos.

O Key Vault consegue armazenar chaves e segredos. As suas inúmeras funcionalidades tornam-no numa boa escolha para gerir os segredos, mas também é ideal para o processo de implementação.

  • Controlo de acesso baseado em funções. Pode gerir o cofre de chaves com várias funções para garantir que pode ser utilizado por aplicações, bem como por diferentes níveis de administradores.

  • Permitir utilizadores e aplicações. Pode configurar o cofre de chaves para que aplicações e utilizadores específicos possam ter acesso ao mesmo. Para aplicações, cria um principal de serviço. Na verdade, pode configurar o cofre de chaves para que apenas principais de serviço tenham acesso.

    Nota

    Um principal de serviço é uma identidade criada para utilização com aplicações, serviços alojados e ferramentas automatizadas para aceder aos recursos do Azure. Restringe o acesso aos recursos ao atribuir apenas ao principal uma função ou subconjunto de funções com direitos de acesso limitados. Esta abordagem proporciona-lhe um controlo mais granular sobre o quê e o quanto alguém pode aceder aos recursos.

  • Pode interagir com um modelo do ARM. Durante a implementação de um modelo do ARM, pode ler a partir de um cofre de chaves. É necessário efetuar uma pequena configuração para o fazer funcionar. A próxima secção fornece mais detalhes.

Configurar permissões

Escolheu o Key Vault como o serviço onde vai armazenar as credenciais. Em seguida, quer conseguir ler segredos durante a implementação para que possa, por exemplo, definir a palavra-passe de uma máquina virtual.

Existem vários passos de configuração que tem de seguir para configurar o Key Vault para que seja possível ler a partir do mesmo durante a implementação. Os passos são:

  1. Ativar o Key Vault para implementação. É necessário ter permissão de leitura no Key Vault durante a implementação. Pode ignorar esta definição durante a criação ou alterá-la mais tarde.

  2. O utilizador precisa de permissão de implementação no grupo de recursos. Não é diferente de outras implementações. No entanto, se não tiver criado o grupo de recursos, poderá atribuir uma função para garantir que consegue implementá-lo.

  3. O utilizador precisa de acesso adequado ao cofre de chaves. Tem de garantir que tem o acesso adequado ao cofre de chaves quando for ler a partir do mesmo durante a implementação. Quando criar o cofre de chaves, este criará uma política de acesso que concede ao utilizador direitos para gerir todos os segredos, chaves e certificados.

Configurar o Key Vault para implementação

Configurar a instância do Key Vault para que as credenciais possam ser lidas a partir da mesma durante a implementação de um modelo do ARM.

Para ativar o Key Vault para implementação, existe uma definição que pode transmitir, seja durante a criação da instância do Key Vault ou algo que pode corrigir mais tarde. No PowerShell, é um comutador chamado -EnabledForTemplateDeployment. Na CLI do Azure, é um argumento chamado --enabled-for-template-deployment que precisa que o valor true também seja transmitido.

Nota

A CLI do Azure requer adicionalmente que transmita um Booleano com o valor true.

O utilizador precisa da permissão de implementação no Key Vault e no grupo de recursos

Antes de tentar implementar e ler segredos do cofre de chaves, tem de garantir que tem permissão de implementação. Existem duas funções que disponibilizam esta permissão:

  • Owner: Se você criou o cofre de chaves, você automaticamente tem essa função.
  • Contributor: Esta função dá-lhe acesso para gerir todos os segredos. Se não criou o cofre de chaves, a abordagem mais fácil será atribuir-lhe a função Contributor.

Outra opção é criar e atribuir uma função personalizada e garantir que contém a permissão Microsoft.KeyVault/vaults/deploy/action.

Configurar um ficheiro de parâmetro de implementação

Em vez de especificar cada parâmetro e os valores correspondentes como pares chave-valor durante a implementação, pode utilizar um ficheiro de parâmetros.

Neste ficheiro de parâmetro, especifica qual o cofre de chaves e qual o segredo nesse cofre de chaves que lhe interessam. Para o fazer, modifica um parâmetro e, em seguida, atualiza o modelo de implementação para utilizar este parâmetro.

Nota

O modelo não tem qualquer noção de um cofre de chaves nem do seu segredo. A configuração que está a fazer ocorre no ficheiro de parâmetro.

Configurar um cofre de chaves e o segredo de um parâmetro

No ficheiro de parâmetros, e para um parâmetro específico, aponte para um cofre de chaves para o qual tem permissão de implementação. Em seguida, especifique qual é o segredo que lhe interessa. Aponte o segredo por nome. Durante a implementação, esta configuração será resolvida no valor do segredo. Segue-se um parâmetro chamado myPassword que está a ser configurado para utilizar um cofre de chaves específico e um segredo chamado databaseSecret.

"myPassword" : {
  "reference": {
    "keyVault": {
      "id": "/subscriptions/<subscription-id>/resourceGroups/<rg-name>/providers/Microsoft.KeyVault/vaults/<vault-name>",
      "secretName": "databaseSecret"
    }
  }
}

No JSON anterior, especifica o ID completo para o cofre de chaves e pede o segredo databaseSecret. O valor deste segredo é extraído e atribuído ao parâmetro myPassword.

Atribuir o parâmetro à palavra-passe do recurso

Este passo não está relacionado com o cofre de chaves. Tem o objetivo de garantir que o recurso pretendido utiliza o parâmetro configurado para ler o valor do segredo a partir do cofre de chaves. Segue-se um fragmento abreviado de uma VM, no ficheiro de modelo, que mostra o elemento adminPassword a ser lido a partir do parâmetro myPassword. O valor do segredo será lido a partir do cofre de chaves no momento da implementação e atribuído ao elemento adminPassword.

{
  "osProfile": {
    "adminPassword": "[parameters('myPassword')]"
  }
}