Autenticação do SDK do Azure para Go com uma entidade de serviço

Neste tutorial, você usará o SDK do Azure para Go para autenticar no Azure com uma entidade de serviço do Azure usando um segredo ou um certificado.

As entidades de serviço do Azure definem a política de acesso e as permissões em um locatário do Microsoft Entra. Habilitando recursos principais, como autenticação durante o logon e autorização durante o acesso a recursos. Removendo a necessidade de usar contas pessoais para acessar recursos do Azure. O módulo Identidade do Azure SDK for Go fornece uma maneira conveniente de autenticar com o Azure usando uma entidade de serviço usando variáveis de ambiente, um segredo ou um certificado

Siga este tutorial para criar e autenticar com o SDK do Azure para Go usando uma entidade de serviço.

Pré-requisitos

  • Subscrição do Azure: se não tem uma subscrição do Azure, crie uma conta gratuita antes de começar.
  • Go instalado: Versão 1.18 ou superior

1. Configure seu ambiente

Antes de começar, crie um novo grupo de recursos e uma nova instância do cofre de chaves.

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

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

Substitua <keyVaultName> por um nome globalmente exclusivo. Além disso, tome nota da saída, você a usará para o escopo da Id conta de serviço.

2. Criar uma entidade de serviço do Azure

Use uma das seguintes técnicas para criar uma entidade de serviço do Azure:

Para saber mais sobre entidades de serviço do Azure, consulte Objeto principal de serviço.

Opção 1: Criar uma entidade de serviço do Azure com um segredo

Execute os seguintes comandos para criar uma entidade de serviço do Azure.

az ad sp create-for-rbac --name `<servicePrincipalName>` --role Contributor --scope <resourceGroupId>

Substitua <servicePrincipalName> e <resourceGroupId> com os valores apropriados.

Certifique-se de copiar o valor da senha - ele não pode ser recuperado. Se você esquecer a senha, redefina as credenciais da entidade de serviço.

Opção 2: Criar uma entidade de serviço do Azure com um certificado

az ad sp create-for-rbac --name <servicePrincipal> --create-cert --role Contributor --scope <resourceGroupId>

Substitua <servicePrincipalName> e <resourceGroupId> com os valores apropriados.

3. Autenticar no Azure com uma entidade de serviço

Usando o DefaultAzureCredential, você pode evitar escrever código específico do ambiente para autenticar no Azure.

Use o DefaultAzureCredential para configurar suas credenciais de entidade de serviço definindo variáveis de ambiente.

Escolha uma das seguintes opções para configurar suas credenciais da entidade de serviço:

Para saber mais sobre o , confira a autenticação do Azure com o DefaultAzureCredentialSDK do Azure para Go

Opção 1: Autenticar com um segredo

Defina as seguintes variáveis de ambiente:

Nome da variável valor
AZURE_CLIENT_ID ID do aplicativo de uma entidade de serviço do Azure
AZURE_TENANT_ID ID do locatário do Microsoft Entra do aplicativo
AZURE_CLIENT_SECRET Senha da entidade de serviço do Azure
export AZURE_TENANT_ID="<active_directory_tenant_id"
export AZURE_CLIENT_ID="<service_principal_appid>"
export AZURE_CLIENT_SECRET="<service_principal_password>"

Opção 2: Autenticar com um certificado

Nome da variável valor
AZURE_CLIENT_ID ID do aplicativo de uma entidade de serviço do Azure
AZURE_TENANT_ID ID do locatário do Microsoft Entra do aplicativo
AZURE_CLIENT_CERTIFICATE_PATH Caminho para um arquivo de certificado, incluindo chave privada (sem proteção por senha)
export AZURE_TENANT_ID="<active_directory_tenant_id"
export AZURE_CLIENT_ID="<service_principal_appid>"
export AZURE_CLIENT_CERTIFICATE_PATH="<azure_client_certificate_path>"

Use DefaultAzureCredential para autenticar ResourceClient

Use a NewDefaultAzureCredential função do módulo Identidade do Azure para autenticar um ResourceClient.

cred, err := azidentity.NewDefaultAzureCredential(nil)
if err != nil {
    log.Fatalf("failed to obtain a credential: %v", err)
}

4. Código de exemplo

Use o exemplo de código a seguir para verificar se sua entidade de serviço se autentica no Azure e tem as permissões apropriadas para o grupo de recursos.

  1. Crie um novo diretório chamado go-on-azure em seu diretório pessoal.

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

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

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

    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 chamado main.go e adicione o código a seguir.

    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(name, value string) {
    	keyVaultName := os.Getenv("KEY_VAULT_NAME")
    	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(), name, value, 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("ExamplePassword", "hVFkk965BuUv")
    }
    
    
  6. Crie uma variável de ambiente chamada KEY_VAULT_NAME. Defina o valor da variável de ambiente como o nome do Cofre de Chaves do Azure criado anteriormente.

    export KEY_VAULT_NAME=<KeyVaultName>
    

    Substitua <KeyVaultName> pelo nome da sua instância do Azure Key Vault.

  7. Execute o comando para criar o go run novo segredo do cofre de chaves.

     go run main.go
    

Próximos passos