Condividi tramite


Eseguire l'autenticazione in Azure con l'entità servizio

Questo articolo illustra come autenticare Terraform in Azure con un'entità servizio.

In questo articolo vengono illustrate le operazioni seguenti:

  • Creare un'entità servizio
  • Specifica delle credenziali dell'entità servizio nelle variabili di ambiente
  • Specificare le credenziali dell'entità servizio in un blocco di provider Terraform

Creare un'entità servizio

Se non si ha accesso a un'entità servizio, continuare con questa sezione per creare una nuova entità servizio. Se si dispone di un'entità servizio che è possibile usare, passare alla sezione Specificare le credenziali dell'entità servizio.

Gli strumenti automatici che distribuiscono o usano servizi di Azure, come Terraform, devono sempre avere autorizzazioni limitate. Anziché avere applicazioni che accedono come utente con privilegi completi, Azure fornisce entità servizio.

Il modello più comune consiste nell'accedere in modo interattivo ad Azure, creare un'entità servizio, testare l'entità servizio e quindi usare tale entità servizio per l'autenticazione futura (in modo interattivo o dagli script).

  1. Per creare un'entità servizio, accedere ad Azure. Dopo l'autenticazione in Azure tramite un account Microsoft, tornare qui.

  2. Se si crea un'entità servizio da Git Bash, impostare la variabile di ambiente MSYS_NO_PATHCONV. Questo passaggio non è necessario se si usa Cloud Shell.

    export MSYS_NO_PATHCONV=1    
    

    Punti principali:

    • È possibile impostare la variabile di ambiente MSYS_NO_PATHCONV a livello globale (per tutte le sessioni del terminale) o localmente (solo per la sessione corrente). Poiché la creazione di un'entità servizio non è un'operazione eseguita spesso, l'esempio imposta il valore per la sessione corrente. Per impostare questa variabile di ambiente a livello globale, aggiungere l'impostazione al file di ~/.bashrc.
  3. Per creare un'entità servizio, eseguire az ad sp create-for-rbac.

    az ad sp create-for-rbac --name <service_principal_name> --role Contributor --scopes /subscriptions/<subscription_id>
    

    Punti principali:

    • È possibile sostituire <service-principal-name> con un nome personalizzato per l'ambiente o omettere completamente il parametro. Se si omette il parametro, il nome dell'entità servizio viene generato in base alla data e all'ora correnti.
    • Al termine, az ad sp create-for-rbac visualizza diversi valori. I valori appId, password e tenant vengono usati nel passaggio successivo.
    • Se viene persa, questa password non può essere recuperata. Di conseguenza, è consigliabile archiviarla in un luogo sicuro. Se si dimentica la password, è possibile reimpostare le credenziali dell'entità servizio.
    • Per questo articolo viene usata un'entità servizio con un ruolo collaboratore. Per altre informazioni sui ruoli controllo degli accessi in base al ruolo, vedere controllo degli accessi in base al ruolo: ruoli predefiniti.
    • L'output della creazione dell'entità servizio include credenziali riservate. Assicurarsi di non includere queste credenziali nel codice o di controllare le credenziali nel controllo del codice sorgente.
    • Per altre informazioni sulle opzioni per la creazione di un'entità servizio con l'interfaccia della riga di comando di Azure, vedere l'articolo Creare un'entità servizio di Azure con l'interfaccia della riga di comando di Azure.

Specificare le credenziali dell'entità servizio

Esistono due modi per specificare le credenziali dell'entità servizio. Tuttavia, per motivi di sicurezza, è consigliabile non archiviare le credenziali nel blocco del provider. Questa tecnica viene mostrata solo a scopo di completezza e test.

Specificare le credenziali dell'entità servizio nelle variabili di ambiente

Dopo aver creato un'entità servizio, è possibile specificarne le credenziali in Terraform tramite variabili di ambiente.

  1. Modificare il file ~/.bashrc aggiungendo le variabili di ambiente seguenti.

    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. Per eseguire lo script di ~/.bashrc, eseguire source ~/.bashrc (o il relativo . ~/.bashrc equivalente abbreviato). È anche possibile uscire e riaprire Cloud Shell perché lo script venga eseguito automaticamente.

    . ~/.bashrc
    
  3. Dopo aver impostato le variabili di ambiente, è possibile verificarne i valori nel modo seguente:

    printenv | grep ^ARM*
    

    Punti principali:

    • Come per qualsiasi variabile di ambiente, per accedere a un valore di sottoscrizione di Azure dall'interno di uno script Terraform, usare la sintassi seguente: ${env.<environment_variable>}. Ad esempio, per accedere al valore di ARM_SUBSCRIPTION_ID, specificare ${env.ARM_SUBSCRIPTION_ID}.
    • La creazione e l'applicazione di piani di esecuzione terraform apporta modifiche alla sottoscrizione di Azure associata all'entità servizio. Questo fatto può talvolta generare confusione se si è connessi a una sottoscrizione di Azure e le variabili di ambiente puntano a una seconda sottoscrizione di Azure. Esaminiamo l'esempio seguente per spiegarlo. Si supponga di avere due sottoscrizioni di Azure: SubA e SubB. Se la sottoscrizione di Azure corrente è SubA (determinata tramite az account show) mentre le variabili di ambiente puntano a SubB, tutte le modifiche apportate da Terraform si trovano in SubB. È quindi necessario accedere alla sottoscrizione SubB per eseguire i comandi dell'interfaccia della riga di comando di Azure o i comandi di Azure PowerShell per visualizzare le modifiche.
  4. Passare alla sezione Passaggi successivi

Specificare le credenziali dell'entità servizio in un blocco di provider Terraform

Attenzione

La possibilità di specificare le credenziali della sottoscrizione di Azure in un file di configurazione terraform può essere utile, soprattutto durante i test. Tuttavia, non è consigliabile archiviare le credenziali in un file di testo non crittografato che può essere visualizzato da utenti non attendibili.

Il blocco del provider di Azure definisce la sintassi che consente di specificare le informazioni di autenticazione della sottoscrizione di 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

Passaggi successivi