Compartir vía


Autenticación con Azure SDK para Go mediante una identidad administrada

En este tutorial, configurará una máquina virtual de Azure con una identidad administrada para autenticarse en Azure mediante el SDK de Azure para Go.

Las identidades administradas permiten que no tenga que administrar las credenciales, ya que proporcionan una identidad para el recurso de Azure. Los permisos asignados a la identidad conceden al recurso acceso a otros recursos de Azure que admiten identidades administradas, lo que elimina la necesidad de pasar credenciales en la aplicación. Puede usar identidades administradas para autenticar y autorizar aplicaciones hospedadas en Azure con otros recursos de Azure.

Siga este tutorial para asignar una identidad administrada a una máquina virtual y autenticarse en Azure mediante una identidad administrada.

Requisitos previos

  • Suscripción de Azure: si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.

1. Creación de recursos de Azure

Antes de empezar, debe crear un nuevo grupo de recursos, una máquina virtual y una instancia del almacén de claves.

Implementación de una máquina virtual

Implemente una máquina virtual en Azure. Ejecute el código de Go para crear un secreto en Azure Key Vault desde esa máquina virtual.

  1. Cree un grupo de recursos de Azure.

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

    Cambie el parámetro --location al valor adecuado para su entorno.

  2. Cree la máquina virtual de 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>
    

    Reemplace <password> por su contraseña.

Para más información sobre otros servicios que admiten identidades administradas, consulte Servicios que admiten identidades administradas para recursos de Azure.

Implementación de una instancia de Key Vault

Para crear una nueva instancia de Azure Key Vault ejecute el comando siguiente:

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

Reemplace <keyVaultName> por un nombre único global.

2. Creación de una entidad administrada

Azure admite dos tipos de identidades administradas: las asignadas por el sistema y las asignadas por el usuario.

Las identidades asignadas por el sistema se asocian directamente a un recurso de Azure y se limitan únicamente a ese recurso. Las identidades asignadas por el usuario son recursos independientes que se pueden asignar a uno o varios recursos de Azure.

Para más información sobre la diferencia entre las identidades asignadas por el sistema y las asignadas por el usuario, consulte Tipos de identidad administrada.

Elija una de las siguientes opciones:

Opción 1: Crear una identidad administrada asignada por el sistema.

Ejecute los siguientes comandos para crear una identidad asignada por el sistema:

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

Opción 2: Crear una identidad administrada asignada por el usuario.

Ejecute los siguientes comandos para crear una identidad administrada asignada por el usuario:

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 más información, consulte Configuración de identidades administradas para recursos de Azure en una VM de Azure mediante la CLI de Azure.

3. Asignación de un rol a la identidad administrada

Después de crear una identidad administrada, asigne roles para conceder los permisos de identidad para acceder a otro recurso de Azure. En este tutorial, asignará el rol integrado de Key Vault Secrets Officer a la identidad administrada para que la aplicación Go pueda crear un secreto dentro de la instancia del almacén de claves.

Elija una de las siguientes opciones:

Opción 1: Asignar un rol a una identidad asignada por el sistema

Ejecute los siguientes comandos para asignar el rol Key Vault Secrets Officer a la identidad administrada asignada por el 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>

En el segundo comando, reemplace <keyVaultName> por el nombre del almacén de claves. En el último comando, reemplace <principalId> y <keyVaultId> por la salida de los dos primeros comandos.

Opción 2: Asignar un rol a una identidad asignada por el usuario

Ejecute los comandos siguientes para asignar el rol Key Vault Secrets Officer a la identidad administrada asignada por el usuario:

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

En el segundo comando, reemplace <keyVaultName> por el nombre del almacén de claves. En el último comando, reemplace <principalId> y <keyVaultId> por la salida de los dos primeros comandos.

Para más información sobre los roles integrados en Azure Key Vault, consulte Proporcionar acceso a claves, certificados y secretos de Key Vault con un control de acceso basado en rol de Azure. Para más información sobre los roles integrados en Azure, consulte Roles integrados de Azure.

4. Creación de un secreto de almacén de claves con Go

A continuación, inicie sesión mediante SSH en la máquina virtual de Azure, instale Go y cree el paquete de Go.

Instalación de Go en la máquina virtual de Azure

  1. Obtenga la dirección IP pública de la máquina virtual de Azure.

    az vm show -d -g go-on-azure -n go-on-azure-vm --query publicIps -o tsv
    
  2. Conéctese mediante SSH a la máquina virtual de Azure.

    ssh azureuser@<public-ip>
    

    Reemplace <public-ip> por la dirección IP pública de la máquina virtual de Azure.

  3. Instalación de Go

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

Creación del paquete de Go

  1. Cree un nuevo directorio con el nombre go-on-azure en el directorio principal.

    mkdir ~/go-on-azure
    
  2. Cambie al directorio go-on-azure.

    cd ~/go-on-azure
    
  3. Ejecute go mod init para crear el archivo go.mod.

    go mod init go-on-azure
    
  4. Ejecute go get para instalar los módulos de Go necesarios.

    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. Cree un archivo main.go y copie el siguiente código en él.

    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. Cree una variable de entorno llamada KEY_VAULT_NAME. Reemplace <keyVaultName> por el nombre de la instancia de Azure Key Vault.

    export KEY_VAULT_NAME=<keyVaultName>
    
  7. Ejecute go run el comando para crear un secreto del almacén de claves.

    go run main.go
    

    Si se ejecuta correctamente, la salida es similar a la siguiente:

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

Puede comprobar que el secreto del almacén de claves se creó mediante Azure PowerShell, la CLI de Azure o Azure Portal.

Nota:

Si usa la CLI de Azure o Azure PowerShell, debe asegurarse de que a su cuenta de usuario de Azure se le asigna un rol que le permita leer secretos en el almacén de claves, como "Responsable de secretos de Key Vault" o "Usuario de secretos de Key Vault".

5. Limpieza de recursos

Si ya no desea usar los recursos de Azure que creó en este artículo, se recomienda eliminarlos. La eliminación de recursos sin usar le ayuda a evitar incurrir en cargos continuos y a mantener la suscripción desordenada. La manera más fácil de eliminar los recursos que usó en este tutorial es eliminar el grupo de recursos.

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

El force-deletion-type argumento indica al comando que forzar la eliminación de máquinas virtuales en el grupo de recursos. El --yes argumento indica al comando que no solicite confirmación.

El comando anterior realiza una eliminación temporal en el almacén de claves del grupo de recursos. Para quitarlo permanentemente de la suscripción, escriba el siguiente comando:

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

Reemplace <keyVaultName> por el nombre del almacén de claves.

Pasos siguientes