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

In questa esercitazione viene configurata 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, rimuovendo la necessità di passare le credenziali nell'applicazione. È possibile usare le identità gestite per autenticare e autorizzare le app ospitate in Azure con altre risorse di Azure.

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. Creare risorse di Azure

Prima di iniziare, è necessario creare un nuovo gruppo di risorse, una macchina virtuale e un'istanza dell'insieme di credenziali delle chiavi.

Distribuire una macchina virtuale

Distribuire una macchina virtuale in Azure. Eseguire 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:0001-com-ubuntu-server-jammy:22_04-lts: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 --enable-rbac-authorization

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 GoUserIdentity

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 assegna il ruolo predefinito di Key Vault Secrets Officer 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 Secrets Officer 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
az keyvault show --name <keyVaultName> --query id -o tsv

az role assignment create --assignee <principalId> --role "Key Vault Secrets Officer" --scope <keyVaultId>

Nel secondo comando sostituire <keyVaultName> con il nome dell'insieme di credenziali delle chiavi. Nell'ultimo comando sostituire <principalId> e <keyVaultId> con l'output dei primi due comandi.

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

Eseguire i comandi seguenti per assegnare il Key Vault Secrets Officer 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 <keyVaultName> --query id -o tsv

az role assignment create --assignee <principalId> --role "Key Vault Secrets Officer" --scope <keyVaultId>

Nel secondo comando sostituire <keyVaultName> con il nome dell'insieme di credenziali delle chiavi. Nell'ultimo comando sostituire <principalId> e <keyVaultId> con l'output dei primi due comandi.

Per altre informazioni sui ruoli predefiniti in Azure Key Vault, vedere Fornire l'accesso a chiavi, certificati e segreti di Key Vault con un controllo degli accessi in base al ruolo di Azure. Per altre informazioni sui ruoli predefiniti in Azure, 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.

    mkdir ~/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/security/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/security/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)
        }
    
        params := azsecrets.SetSecretParameters{Value: &secretValue}
        resp, err := client.SetSecret(context.TODO(), secretName, params, 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()
    }
    
    
  6. Creare una variabile di ambiente denominata KEY_VAULT_NAME. Sostituire <keyVaultName> con il nome dell'istanza di Azure Key Vault.

    export KEY_VAULT_NAME=<keyVaultName>
    
  7. Eseguire go run il comando per creare un segreto dell'insieme di credenziali delle chiavi.

    go run main.go
    

    In caso di esito positivo, l'output è simile al seguente:

    Name: https://<keyVaultName>.vault.azure.net/secrets/quickstart-secret/0e0b941824c4493bb3b83045a31b2bf7, Value: createdWithGO
    

È possibile 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.

Nota

Se si usa l'interfaccia della riga di comando di Azure o Azure PowerShell, è necessario assicurarsi che all'account utente di Azure sia assegnato un ruolo che consenta di leggere i segreti nell'insieme di credenziali delle chiavi, ad esempio "Key Vault Secrets Officer" o "Key Vault Secrets User".

5. Pulire le risorse

Se non si vogliono più usare le risorse di Azure create in questo articolo, è consigliabile eliminarle. L'eliminazione di risorse inutilizzate consente di evitare di incorrere in addebiti in corso e di mantenere la sottoscrizione non ordinata. Il modo più semplice per eliminare le risorse usate in questa esercitazione consiste nell'eliminare il gruppo di risorse.

az group delete --name go-on-azure --force-deletion-types Microsoft.Compute/virtualMachines --yes

L'argomento force-deletion-type indica al comando di forzare l'eliminazione delle macchine virtuali nel gruppo di risorse. L'argomento --yes indica al comando di non chiedere conferma.

Il comando precedente esegue un'eliminazione temporanea nell'insieme di credenziali delle chiavi nel gruppo di risorse. Per rimuoverlo definitivamente dalla sottoscrizione, immettere il comando seguente:

az keyvault purge --name <keyVaultName> --no-wait

Sostituire <keyVaultName> con il nome dell'insieme di credenziali delle chiavi.

Passaggi successivi