Autenticazione con Azure SDK per Go usando un'identità gestita

In questa esercitazione si configurerà una macchina virtuale di Azure con un'identità gestita per l'autenticazione in Azure usando Azure SDK for Go.

Le identità gestite eliminano la necessità di gestire le credenziali fornendo un'identità direttamente a una risorsa di Azure. Le autorizzazioni assegnate all'identità concedono alla risorsa l'accesso ad altre risorse di Azure che supportano le identità gestite. Rimozione della necessità di passare le credenziali all'applicazione.

Seguire questa esercitazione per assegnare un'identità gestita a una macchina virtuale ed eseguire l'autenticazione ad Azure usando un'identità gestita.

Prerequisiti

  • Sottoscrizione di Azure: se non si ha una sottoscrizione di Azure, creare un account gratuito prima di iniziare.

1. Configurare l'ambiente

Prima di iniziare, è necessario configurare l'ambiente.

Distribuire una macchina virtuale

Distribuire una macchina virtuale in Azure. Si eseguirà il codice Go per creare un segreto nell'insieme di credenziali delle chiavi di Azure da tale macchina virtuale.

  1. Crea gruppo di risorse di Azure.

    az group create --name go-on-azure --location eastus
    

    Modificare il --location parametro con il valore appropriato per l'ambiente in uso.

  2. Creare la macchina virtuale di Azure.

    az vm create \
    --resource-group go-on-azure \
    --name go-on-azure-vm \
    --image canonical:ubuntuserver:19.04:latest \
    --admin-username azureuser \
    --admin-password <password>
    

    Sostituire la <password> password.

Per altre informazioni su altri servizi che supportano le identità gestite, vedere Servizi che supportano le identità gestite per le risorse di Azure.

Distribuire un'istanza dell'insieme di credenziali delle chiavi

Creare una nuova istanza di Azure Key Vault eseguendo il comando seguente:

az keyvault create --location eastus --name `<keyVaultName>` --resource-group go-on-azure

Sostituire <keyVaultName> con un nome univoco globale.

2. Creare un'identità gestita

In Azure sono supportati due tipi di identità gestite. assegnata dal sistema e assegnata dall'utente.

Le identità assegnate dal sistema vengono collegate direttamente a una risorsa di Azure e limitate solo a tale risorsa. Le identità assegnate dall'utente sono risorse autonome che possono essere assegnate a una o più risorse di Azure.

Per altre informazioni sulla differenza tra i tipi di identità gestiti assegnati dal sistema e assegnati dall'utente, vedere Tipi di identità gestite.

Scegli una delle opzioni seguenti:

Opzione 1: Creare un'identità assegnata dal sistema

Eseguire i comandi seguenti per creare un'identità gestita assegnata dal sistema:

az vm identity assign -g go-on-azure -n go-on-azure-vm

Opzione 2: Creare un'identità assegnata dall'utente

Eseguire i comandi seguenti per creare un'identità gestita assegnata dall'utente:

az identity create -g go-on-azure -n GoUserIdentity

az vm identity assign -g go-on-azure -n go-on-azure-vm --identities <UserIdentityId>

Sostituire <UserIdentityId> con l'ID dell'identità utente gestita.

Per altre informazioni, vedere Configurare le identità gestite per le risorse di Azure in una macchina virtuale di Azure usando l'interfaccia della riga di comando di Azure.

3. Assegnare un ruolo all'identità gestita

Dopo aver creato un'identità gestita, assegnare i ruoli per concedere le autorizzazioni di identità per accedere ad altre risorse di Azure. In questa esercitazione si assegnerà il ruolo predefinito di Key Vault Contributor all'identità gestita in modo che l'applicazione Go possa creare un segreto all'interno dell'istanza dell'insieme di credenziali delle chiavi.

Scegli una delle opzioni seguenti:

Opzione 1: Assegnare un ruolo a un'identità assegnata dal sistema

Eseguire i comandi seguenti per assegnare il Key Vault Contributor ruolo all'identità gestita assegnata dal sistema:

#output system identity principal ID
az vm identity show --name go-on-azure-vm --resource-group go-on-azure --query 'principalId' -o tsv

#output key vault ID
scope=$(az keyvault show --name go-on-azure-kv --query id -o tsv)

az role assignment create --assignee '<principalId>' --role 'Key Vault Contributor' --scope '<keyVaultId>'

Opzione 2: Assegnare un ruolo a un'identità assegnata dall'utente

Eseguire i comandi seguenti per assegnare il Key Vault Contributor ruolo all'identità gestita assegnata dall'utente:

#output user identity principal ID
az identity show --resource-group go-on-azure --name GoUserIdentity --query 'principalId' -o tsv

#output key vault ID
az keyvault show --name go-on-azure-kv --query id -o tsv

az role assignment create --assignee '<principalId>' --role 'Key Vault Contributor' --scope '<keyVaultId>'

Per altre informazioni sui ruoli predefiniti, vedere Ruoli predefiniti di Azure.

4. Creare un segreto dell'insieme di credenziali delle chiavi con Go

Successivamente, eseguire SSH nella macchina virtuale di Azure, installare Go e compilare il pacchetto Go.

Installare Go nella macchina virtuale di Azure

  1. Ottenere l'indirizzo IP pubblico della macchina virtuale di Azure.

    az vm show -d -g go-on-azure -n go-on-azure-vm --query publicIps -o tsv
    
  2. Ssh nella macchina virtuale di Azure.

    ssh azureuser@<public-ip>
    

    Sostituire <public-ip> con l'indirizzo IP pubblico della macchina virtuale di Azure.

  3. Installare Go

    sudo add-apt-repository ppa:longsleep/golang-backports;
    sudo apt update;
    sudo apt install golang-go -y
    

Creare il pacchetto Go

  1. Creare una nuova directory con il nome go-on-azure nella home directory.

    mkidr ~/go-on-azure
    
  2. Passare alla go-on-azure directory.

    cd ~/go-on-azure
    
  3. Eseguire go mod init per creare il file go.mod.

    go mod init go-on-azure
    
  4. Eseguire go get per installare i moduli Go necessari.

    go get "github.com/Azure/azure-sdk-for-go/sdk/azidentity"
    go get "github.com/Azure/azure-sdk-for-go/sdk/keyvault/azsecrets"
    
  5. Creare un main.go file e copiarne il codice seguente.

    package main
    
    import (
        "context"
        "fmt"
        "log"
        "os"
    
        "github.com/Azure/azure-sdk-for-go/sdk/azidentity"
        "github.com/Azure/azure-sdk-for-go/sdk/keyvault/azsecrets"
    )
    
    func createSecret() {
        keyVaultName := os.Getenv("KEY_VAULT_NAME")
        secretName := "quickstart-secret"
        secretValue := "createdWithGO"
        keyVaultUrl := fmt.Sprintf("https://%s.vault.azure.net/", keyVaultName)
    
        cred, err := azidentity.NewDefaultAzureCredential(nil)
        if err != nil {
            log.Fatalf("failed to obtain a credential: %v", err)
        }
    
        client, err := azsecrets.NewClient(keyVaultUrl, cred, nil)
        if err != nil {
            log.Fatalf("failed to create a client: %v", err)
        }
    
        resp, err := client.SetSecret(context.TODO(), secretName, secretValue, nil)
        if err != nil {
            log.Fatalf("failed to create a secret: %v", err)
        }
    
        fmt.Printf("Name: %s, Value: %s\n", *resp.ID, *resp.Value)
    }
    
    func main() {
        createSecret()
    }
    
    

Prima di eseguire il codice, creare una variabile di ambiente denominata KEY_VAULT_NAME. Impostare il valore della variabile di ambiente sul nome dell'insieme di credenziali delle chiavi di Azure creato in precedenza. Sostituire <KeyVaultName> con il nome dell'istanza di Azure Key Vault.

export KEY_VAULT_NAME=<KeyVaultName>

go run Eseguire quindi il comando per creare un segreto dell'insieme di credenziali delle chiavi.

go run main.go

Verificare che il segreto dell'insieme di credenziali delle chiavi sia stato creato usando Azure PowerShell, l'interfaccia della riga di comando di Azure o il portale di Azure.

Passaggi successivi