Gerir segredos no modelo do ARM ao ler a partir do Azure Key Vault
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:
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.
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.
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çãoContributor
.
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')]"
}
}