Autenticar no Azure com a entidade de serviço
Este artigo explica como autenticar o Terraform no Azure com uma entidade de serviço.
Neste artigo, você aprenderá como:
- Criar uma entidade de serviço
- Especificando credenciais de entidade de serviço em variáveis de ambiente
- Especificar credenciais de entidade de serviço em um bloco de provedor do Terraform
Criar uma entidade de serviço
Se você não tiver acesso a uma entidade de serviço, continue com esta seção para criar uma nova entidade de serviço. Se você tiver uma entidade de serviço que possa usar, pule para a seção Especificar credenciais da entidade de serviço.
Ferramentas automatizadas que implantam ou usam os serviços do Azure, como o Terraform, sempre têm permissões restritas. Em vez de fazer com que os aplicativos entrem como um usuário totalmente privilegiado, o Azure oferece entidades de serviço.
O padrão mais comum é fazer login interativamente no Azure, criar uma entidade de serviço, testar a entidade de serviço e, em seguida, usar essa entidade de serviço para autenticação futura (interativamente ou a partir de seus scripts).
Para criar uma entidade de serviço, entre no Azure. Volte para este ponto após autenticar no Azure usando uma conta Microsoft.
Se estiver criando uma entidade de serviço do Git Bash, defina a variável de ambiente
MSYS_NO_PATHCONV
. (Essa etapa não é necessária se você estiver usando o Cloud Shell).export MSYS_NO_PATHCONV=1
Pontos principais:
- Você pode definir a variável de ambiente
MSYS_NO_PATHCONV
globalmente (para todas as sessões de terminal) ou localmente (apenas para a sessão atual). Como a criação de uma entidade de serviço não é algo que você faz com frequência, o exemplo define o valor para a sessão atual. Para definir essa variável de ambiente globalmente, adicione a configuração ao arquivo~/.bashrc
.
- Você pode definir a variável de ambiente
Para criar uma entidade de serviço, execute az ad sp create-for-rbac.
az ad sp create-for-rbac --name <service_principal_name> --role Contributor --scopes /subscriptions/<subscription_id>
Pontos principais:
- Você pode substituir
<service-principal-name>
por um nome personalizado para o ambiente ou omitir totalmente o parâmetro. Se você omitir o parâmetro, o nome da entidade de serviço será gerado com base na data e hora atuais. - Após a conclusão bem-sucedida,
az ad sp create-for-rbac
exibe vários valores. Os valoresappId
,password
etenant
são usados na próxima etapa. - Se for perdida, a senha não poderá ser recuperada. Por isso, você deve armazenar sua senha em um local seguro. Se esquecer a senha, redefina as credenciais da entidade de serviço.
- Para este artigo, uma entidade de serviço com a função de Colaborador está sendo usada. Para obter mais informações sobre as funções de Controle de acesso baseado em função (RBAC), consulte RBAC: funções internas.
- A saída da criação da entidade de serviço inclui credenciais confidenciais. Não inclua essas credenciais no código nem faça check-in delas no controle do código-fonte.
- Para obter mais informações sobre as opções ao criar uma entidade de serviço com a CLI do Azure, confira o artigo Criar uma entidade de serviço do Azure com a CLI do Azure.
- Você pode substituir
Especificar credenciais da entidade de serviço
Há algumas maneiras de especificar suas credenciais de entidade de serviço. No entanto, por motivos de segurança, sugerimos não armazenar credenciais no bloco do provedor. Essa técnica é mostrada apenas para fins de integridade e teste.
- Especificar credenciais da entidade de serviço em variáveis de ambiente
- Especificar credenciais da entidade de serviço em um bloco do provedor Terraform
Especificar credenciais da entidade de serviço em variáveis de ambiente
Após criar uma entidade de serviço, você pode especificar as credenciais dela para o Terraform por meio de variáveis de ambiente.
Edite o arquivo
~/.bashrc
adicionando as variáveis de ambiente a seguir.export ARM_SUBSCRIPTION_ID="<azure_subscription_id>" export ARM_TENANT_ID="<azure_subscription_tenant_id>" export ARM_CLIENT_ID="<service_principal_appid>" export ARM_CLIENT_SECRET="<service_principal_password>"
Para executar o script
~/.bashrc
, executesource ~/.bashrc
(ou seu equivalente abreviado. ~/.bashrc
). Você também pode sair e reabrir o Cloud Shell para que o script seja executado automaticamente.. ~/.bashrc
Após as variáveis de ambiente terem sido definidas, você pode verificar os valores delas da seguinte forma:
printenv | grep ^ARM*
Pontos principais:
- Para obter mais informações sobre como trabalhar com variáveis de ambiente no Terraform HCL, consulte Lendo e usando variáveis de ambiente em execuções do Terraform.
- Criar e aplicar planos de execução do Terraform faz alterações na assinatura do Azure associada à entidade de serviço. Às vezes, isso pode ser confuso quanto você está conectado a uma assinatura do Azure e as variáveis de ambiente apontam para outra. Vejamos uma explicação no exemplo a seguir. Digamos que você tenha duas assinaturas do Azure: SubA e SubB. Se a assinatura atual do Azure é a SubA (determinada por meio de
az account show
) enquanto as variáveis de ambiente apontam para SubB, as alterações feitas pelo Terraform estão na SubB. Portanto, você precisaria fazer logon na assinatura SubB para executar comandos da CLI do Azure ou do Azure PowerShell para exibir as alterações.
Pule para a seção, Próximos passos
Especificar credenciais de entidade de serviço em um bloco de provedor do Terraform
Cuidado
A possibilidade de especificar as credenciais de assinatura do Azure em um arquivo de configuração do Terraform pode ser conveniente, especialmente ao fazer testes. No entanto, não é aconselhável armazenar credenciais em um arquivo de texto claro que possa ser visualizado por pessoas não confiáveis.
O bloco do provedor do Azure define a sintaxe que permite especificar as informações de autenticação de sua assinatura do Azure.
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~>3.0"
}
}
}
provider "azurerm" {
features {}
subscription_id = "<azure_subscription_id>"
tenant_id = "<azure_subscription_tenant_id>"
client_id = "<service_principal_appid>"
client_secret = "<service_principal_password>"
}
# Your code goes here