Partilhar 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, vai aprender a:

  • Criar um principal de serviço
  • Especificando credenciais da entidade de serviço em variáveis de ambiente
  • Especificar credenciais da entidade de serviço em um bloco de provedor Terraform

Criar um principal 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, vá para a seção Especificar credenciais da entidade de serviço.

As ferramentas automatizadas que implantam ou usam serviços do Azure - como o Terraform - sempre devem ter permissões restritas. Em vez de ter as informações de início de sessão das aplicações como um utilizador totalmente privilegiado, o Azure oferece os principais de serviço.

O padrão mais comum é entrar interativamente no Azure, criar uma entidade de serviço, testar a entidade de serviço e 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. Depois de autenticar no Azure através de uma conta Microsoft, regresse aqui.

  2. Se você estiver criando uma entidade de serviço a partir do Git Bash, defina a MSYS_NO_PATHCONV variável de ambiente. (Esta etapa não é necessária se você estiver usando o Cloud Shell.)

    export MSYS_NO_PATHCONV=1    
    

    Pontos principais:

    • Você pode definir a MSYS_NO_PATHCONV variável de ambiente globalmente (para todas as sessões do 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 ~/.bashrc arquivo.
  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 o <service-principal-name> por um nome personalizado para seu ambiente ou omitir o parâmetro completamente. 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 appIdvalores , passworde e tenant são usados na próxima etapa.
    • A senha não pode ser recuperada se perdida. Como tal, deve guardar a sua palavra-passe num local seguro. Se se esquecer da sua palavra-passe, pode repor as credenciais da entidade de serviço.
    • Para este artigo, uma entidade de serviço com uma função de Colaborador está sendo usada. Para obter mais informações sobre funções RBAC (Controle de Acesso Baseado em Função), consulte RBAC: funções internas.
    • A saída da criação da entidade de serviço inclui credenciais confidenciais. Certifique-se de não incluir essas credenciais em seu código ou verifique as credenciais em seu controle de origem.
    • Para obter mais informações sobre opções ao criar uma entidade de serviço com a CLI do Azure, consulte 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 da entidade de serviço. No entanto, por motivos de segurança, sugerimos não armazenar credenciais no bloco do provedor. Esta técnica só é demonstrada para efeitos de exaustividade e de ensaio.

Especificar credenciais da entidade de serviço em variáveis de ambiente

Depois de criar uma entidade de serviço, você pode especificar suas credenciais para Terraform por meio de variáveis de ambiente.

  1. Edite o ~/.bashrc arquivo adicionando as seguintes variáveis de ambiente.

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

    . ~/.bashrc
    
  3. Depois que as variáveis de ambiente tiverem sido definidas, você poderá verificar seus valores da seguinte maneira:

    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. Esse fato às vezes pode ser confuso se você estiver conectado a uma assinatura do Azure e as variáveis de ambiente apontarem para uma segunda assinatura do Azure. Vejamos o exemplo a seguir para explicar. Digamos que você tenha duas assinaturas do Azure: SubA e SubB. Se a assinatura atual do Azure for SubA (determinada via az account show) enquanto as variáveis de ambiente apontarem para SubB, todas as alterações feitas pelo Terraform estarão em SubB. Portanto, você precisaria fazer logon em sua assinatura SubB para executar comandos da CLI do Azure ou comandos do Azure PowerShell para exibir suas alterações.
  4. Saltar para a secção, Próximos passos

Especificar credenciais da entidade de serviço em um bloco de provedor Terraform

Atenção

A capacidade de especificar suas credenciais de assinatura do Azure em um arquivo de configuração do Terraform pode ser conveniente - especialmente durante o teste. No entanto, não é aconselhável armazenar credenciais em um arquivo de texto não criptografado que possa ser visualizado por pessoas não confiáveis.

O bloco de provedor do Azure define a sintaxe que permite especificar as informações de autenticação da 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óximos passos