Compartilhar via


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

  1. Para criar uma entidade de serviço, entre no Azure. Volte para este ponto após autenticar no Azure usando uma conta Microsoft.

  2. 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.
  3. 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 valores appId, password e tenant 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.

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

Após criar uma entidade de serviço, você pode especificar as credenciais dela para o Terraform por meio de variáveis de ambiente.

  1. 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>"
    
  2. Para executar o script ~/.bashrc, execute source ~/.bashrc (ou seu equivalente abreviado . ~/.bashrc). Você também pode sair e reabrir o Cloud Shell para que o script seja executado automaticamente.

    . ~/.bashrc
    
  3. 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.
  4. 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

Próximas etapas