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

Neste tutorial, você configurará 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. Remover a necessidade de você passar credenciais para seu aplicativo.

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.
  • Go instalado: versão 1.18 ou superior

1. Configurar seu ambiente

Antes de começar, você precisará configurar seu ambiente.

Implantar uma máquina virtual

Implante uma máquina virtual no Azure. Você executará o código Go para criar um segredo no cofre de chaves do Azure 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:ubuntuserver:19.04: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

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

Substitua <UserIdentityId> pela ID da identidade de usuário gerenciada.

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ê atribuirá a função interna do Key Vault Contributor à identidade gerenciada para que o aplicativo Go possa criar um segredo dentro da instância do cofre de 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 Contributor à 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
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>'

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 Contributor à 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 go-on-azure-kv --query id -o tsv

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

Para saber mais sobre as funções internas, confira 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.

    mkidr ~/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/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/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()
    }
    
    

Antes de executar o código, crie uma variável de ambiente chamada KEY_VAULT_NAME. Defina o valor da variável de ambiente para o nome do Azure Key Vault criado anteriormente. Substitua pelo <KeyVaultName> nome da instância do Cofre de Chaves do Azure.

export KEY_VAULT_NAME=<KeyVaultName>

Em seguida, execute go run o comando para criar um segredo do cofre de chaves.

go run main.go

Verifique se o segredo do cofre de chaves foi criado usando o Azure PowerShell, a CLI do Azure ou o portal do Azure.

Próximas etapas