Autenticação com o SDK do Azure para linguagem Go usando uma identidade gerenciada

Neste tutorial, você configura uma máquina virtual do Azure com uma identidade gerenciada para autenticar no Azure usando o SDK do Azure para Go.

As identidades gerenciadas eliminam a necessidade de você gerenciar credenciais, fornecendo uma identidade diretamente para um recurso do Azure. As permissões atribuídas à identidade concedem ao recurso acesso a outros recursos do Azure que dão suporte a identidades gerenciadas, eliminando a necessidade de você passar credenciais em seu aplicativo. Você pode usar identidades gerenciadas para autenticar e autorizar aplicativos hospedados no Azure com outros recursos do Azure.

Siga este tutorial para atribuir uma identidade gerenciada a uma máquina virtual e autenticar-se no Azure usando uma identidade gerenciada.

Pré-requisitos

  • Assinatura do Azure: caso você não tenha uma assinatura do Azure, crie uma conta gratuita antes de começar.

1. Criar recursos do Azure

Antes de começar, você precisa criar um novo grupo de recursos, máquina virtual e instância do cofre de chaves.

Implantar uma máquina virtual

Implante uma máquina virtual no Azure. Você executa o código Go para criar um segredo no cofre de chaves do Azure a partir dessa máquina virtual.

  1. Crie um grupo de recursos do Azure.

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

    Altere o parâmetro --location para o valor adequado para seu ambiente.

  2. Crie a máquina virtual do 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>
    

    Substitua <password> pela sua senha.

Para saber mais sobre outros serviços que dão suporte a identidades gerenciadas, confira Serviços que dão suporte a identidades gerenciadas para recursos do Azure.

Implantar uma instância do cofre de chaves

Crie uma instância do cofre de chaves do Azure executando o seguinte comando:

az keyvault create --location eastus --name <keyVaultName> --resource-group go-on-azure --enable-rbac-authorization

Substitua <keyVaultName> por um valor globalmente único.

2. Criar uma identidade gerenciada

Há suporte para dois tipos de identidades gerenciadas no Azure: atribuída pelo sistema e atribuída pelo usuário.

As identidades atribuídas pelo sistema são diretamente anexadas a um recurso do Azure e limitadas somente a esse recurso. As identidades atribuídas pelo usuário são recursos autônomos que podem ser atribuídos a um ou mais recursos do Azure.

Para saber mais sobre a diferença entre as identidades atribuídas pelo sistema e as atribuídas pelo usuário, confira Tipos de identidade gerenciada.

Escolha uma das seguintes opções:

Opção 1: criar uma identidade atribuída pelo sistema

Execute os seguintes comandos para criar uma identidade gerenciada atribuída pelo sistema:

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

Opção 2: criar uma identidade atribuída pelo usuário

Execute os seguintes comandos para criar uma identidade gerenciada atribuída pelo usuário:

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

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

Para saber mais, confira Configurar identidades gerenciadas para recursos do Azure em uma VM do Azure usando a CLI do Azure.

3. Atribuir uma função à identidade gerenciada

Depois que uma identidade gerenciada é criada, você atribui funções para conceder às permissões de identidade acesso a outros recursos do Azure. Neste tutorial, você atribui a função interna de à identidade gerenciada para que o aplicativo Go possa criar um segredo dentro da instância do cofre de Key Vault Secrets Officer chaves.

Escolha uma das seguintes opções:

Opção 1: atribuir uma função a uma identidade atribuída pelo sistema

Execute os seguintes comandos para atribuir a função Key Vault Secrets Officer à identidade gerenciada atribuída pelo 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>

No segundo comando, substitua <keyVaultName> pelo nome do cofre de chaves. No último comando, substitua <principalId> e <keyVaultId> pela saída dos dois primeiros comandos.

Opção 2: atribuir uma função a uma identidade atribuída pelo usuário

Execute os seguintes comandos para atribuir a função Key Vault Secrets Officer à identidade gerenciada atribuída pelo usuário:

#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>

No segundo comando, substitua <keyVaultName> pelo nome do cofre de chaves. No último comando, substitua <principalId> e <keyVaultId> pela saída dos dois primeiros comandos.

Para saber mais sobre funções internas no cofre de chaves do Azure, consulte Fornecer acesso a chaves, certificados e segredos do Cofre de Chaves com um controle de acesso baseado em função do Azure. Para saber mais sobre funções internas no Azure, consulte Funções internas do Azure.

4. Criar um segredo do cofre de chaves com a linguagem Go

Em seguida, execute o SSH na máquina virtual do Azure, instale o Go e crie o pacote Go.

Instalar o Go na VM do Azure

  1. Obtenha o endereço IP público da máquina virtual do Azure.

    az vm show -d -g go-on-azure -n go-on-azure-vm --query publicIps -o tsv
    
  2. Execute SSH na VM do Azure.

    ssh azureuser@<public-ip>
    

    Substitua <public-ip> pelo endereço IP público de VM do Azure.

  3. Instalar o Go

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

Criar o pacote Go

  1. Crie um diretório com o nome go-on-azure em seu diretório base.

    mkdir ~/go-on-azure
    
  2. Altere para o diretório go-on-azure.

    cd ~/go-on-azure
    
  3. Execute go mod init para criar o arquivo go.mod.

    go mod init go-on-azure
    
  4. Execute go get para instalar os módulos necessários Go.

    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. Crie um arquivo main.go e copie o código a seguir nele.

    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. Crie uma variável de ambiente chamada KEY_VAULT_NAME. Substitua <keyVaultName> pelo nome da instância do cofre de chaves do Azure.

    export KEY_VAULT_NAME=<keyVaultName>
    
  7. Execute go run o comando para criar um segredo do cofre de chaves.

    go run main.go
    

    No sucesso, a saída é semelhante à seguinte:

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

Você pode verificar se o segredo do cofre de chaves foi criado usando o Azure PowerShell, a CLI do Azure ou o portal do Azure.

Observação

Se você usar a CLI do Azure ou o Azure PowerShell, precisará garantir que sua conta de usuário do Azure receba uma função que permita ler segredos no cofre de chaves, como "Oficial de Segredos do Cofre de Chaves" ou "Usuário de Segredos do Cofre de Chaves".

5. Limpar os recursos

Se você não quiser mais usar os recursos do Azure criados neste artigo, é uma boa prática excluí-los. A exclusão de recursos não utilizados ajuda a evitar cobranças contínuas e mantém sua assinatura organizada. A maneira mais fácil de excluir os recursos usados neste tutorial é excluir o grupo de recursos.

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

O force-deletion-type argumento informa ao comando para forçar a exclusão de VMs no grupo de recursos. O --yes argumento diz ao comando para não pedir confirmação.

O comando anterior executa uma exclusão suave no cofre de chaves no grupo de recursos. Para removê-lo permanentemente da sua assinatura, digite o seguinte comando:

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

Substitua <keyVaultName> pelo nome do cofre de chaves.

Próximas etapas