Compartir vía


Autenticación de Azure SDK para Go con una entidad de servicio

En este tutorial, usará el SDK de Azure para Go para autenticarse en Azure con una entidad de servicio de Azure mediante un secreto o un certificado.

Las entidades de servicio de Azure definen la directiva de acceso y los permisos en un inquilino de Microsoft Entra, lo que habilita las características principales, como la autenticación durante el inicio de sesión y la autorización durante el acceso a los recursos. Quitan la necesidad de usar cuentas personales para acceder a los recursos de Azure. Puede asignar a una entidad de servicio los permisos exactos necesarios para la aplicación y desarrollarlos con esos permisos, en lugar de usar una cuenta personal, que podría tener más privilegios en el inquilino que la aplicación. También puede usar entidades de servicio para aplicaciones hospedadas en el entorno local que necesitan usar recursos de Azure. El módulo Azure SDK para Go Azure Identity proporciona una manera cómoda de autenticarse en Azure con una entidad de servicio mediante variables de entorno y un secreto o un certificado.

Siga este tutorial para crear una instancia de Azure SDK para Go y autenticarse mediante una entidad de servicio.

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, cree un nuevo grupo de recursos y una instancia del almacén de claves.

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

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

Reemplace <keyVaultName> por un nombre único global.

Anote la id propiedad de la salida del az keyvault create comando. Lo usará en la sección siguiente para definir el ámbito de la autorización para la entidad de servicio. El id valor tiene el formato siguiente: /subscriptions/<subscriptionId>/resourceGroups/go-on-azure/providers/Microsoft.KeyVault/vaults/<keyVaultName>.

2. Creación de una entidad de servicio de Azure

Use una de las técnicas siguientes para crear una entidad de servicio de Azure y asignarle el rol "Responsable de secretos de Key Vault" en el almacén de claves:

Para más información sobre las entidades de servicio de Azure, consulte Objeto de entidad de servicio.

Al asignar el rol "Oficial de secretos de Key Vault" a la entidad de servicio, se autoriza a crear, leer, actualizar y eliminar secretos en el almacén de claves. Para más información sobre los roles integrados para 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.

Opción 1: Creación de una entidad de servicio de Azure con un secreto

Ejecute los comandos siguientes para crear una entidad de servicio de Azure y asígnele el rol "Oficial de secretos de Key Vault" en el almacén de claves.

az ad sp create-for-rbac --name <servicePrincipalName> --role "Key Vault Secrets Officer" --scope <keyVaultId>

Reemplace <servicePrincipalName> y <keyVaultId> por los valores adecuados.

Anote las passwordpropiedades , tenanty appId de la salida. Los necesitará en la siguiente sección.

Después de la creación, no se puede recuperar la contraseña de la entidad de servicio. Si olvida la contraseña, puede restablecer las credenciales de la entidad de servicio.

Opción 2: Creación de una entidad de servicio de Azure con un certificado

Ejecute los siguientes comandos para crear una entidad de servicio de Azure que use un certificado y asígnele el rol "Oficial de secretos de Key Vault" en el almacén de claves.

az ad sp create-for-rbac --name <servicePrincipalName> --create-cert --role "Key Vault Secrets Officer" --scope <keyVaultId>

Reemplace <servicePrincipalName> y <keyVaultId> por los valores adecuados.

Anote las fileWithCertAndPrivateKeypropiedades , tenantIdy appId de la salida. Los necesitará en la siguiente sección.

3. Autenticación en Azure con una entidad de servicio

DefaultAzureCredentialMediante , puede evitar escribir código específico del entorno para autenticarse en Azure. Con DefaultAzureCredential, puede configurar las credenciales de la entidad de servicio mediante la definición de variables de entorno.

Elija una de las siguientes opciones para configurar las credenciales de la entidad de servicio:

Para más información sobre DefaultAzureCredential, consulte Autenticación de Azure con Azure SDK para Go

Opción 1: Autenticación con un secreto

Defina las siguientes variables de entorno:

Nombre de la variable Valor
AZURE_CLIENT_ID Identificador de aplicación de una entidad de servicio de Azure
AZURE_TENANT_ID Identificador del inquilino de Microsoft Entra de la aplicación
AZURE_CLIENT_SECRET Contraseña de la entidad de servicio de Azure
export AZURE_TENANT_ID="<active_directory_tenant_id>"
export AZURE_CLIENT_ID="<service_principal_appid>"
export AZURE_CLIENT_SECRET="<service_principal_password>"

Opción 2: Autenticación con un certificado

Nombre de la variable Valor
AZURE_CLIENT_ID Identificador de aplicación de una entidad de servicio de Azure
AZURE_TENANT_ID Identificador del inquilino de Microsoft Entra de la aplicación
AZURE_CLIENT_CERTIFICATE_PATH Ruta de acceso a un archivo de certificado PEM o PKCS12, incluida la clave privada. Si ha seguido los pasos de la CLI de Azure, el archivo no está protegido con contraseña. Si ha seguido los pasos de Azure PowerShell, el archivo está protegido con contraseña y también tendrá que establecer la AZURE_CLIENT_CERTIFICATE_PASSWORD variable de entorno.
AZURE_CLIENT_CERTIFICATE_PASSWORD La contraseña que especificó al crear la entidad de servicio. Solo es necesario si ha seguido los pasos de Azure PowerShell.
export AZURE_TENANT_ID="<active_directory_tenant_id>"
export AZURE_CLIENT_ID="<service_principal_appid>"
export AZURE_CLIENT_CERTIFICATE_PATH="<azure_client_certificate_path>"

Uso de DefaultAzureCredential para autenticar un cliente de recursos

Después de establecer las variables de entorno, puede usar DefaultAzureCredential en el módulo Azure Identity para autenticar un cliente de recursos. En el código siguiente se muestra cómo obtener una instancia de DefaultAzureCredential.

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

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

Use el ejemplo de código siguiente para comprobar que la entidad de servicio se autentica en Azure y tiene los permisos adecuados para el almacén de claves.

  1. Cree un directorio denominado 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 llamado main.go y agregue el siguiente código.

    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(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)
    	}
    
        params := azsecrets.SetSecretParameters{Value: &value}
        resp, err := client.SetSecret(context.TODO(), name, 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("ExamplePassword", "hVFkk965BuUv")
    }
    
    
  6. Cree una variable de entorno llamada KEY_VAULT_NAME. Establezca el valor de la variable de entorno en el nombre de la instancia de Azure Key Vault que creó previamente.

    export KEY_VAULT_NAME=<keyVaultName>
    

    Reemplace por <keyVaultName> el nombre de la instancia de Azure Key Vault.

  7. Ejecute el go run comando para crear el nuevo 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/ExamplePassword/1e697f71d0014761a65641226f2f057b, Value: hVFkk965BuUv
    

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

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.

Por último, debe quitar el registro de aplicaciones y la entidad de servicio.

az ad app delete --id <servicePrincipalAppId>

Reemplace por <servicePrincipalAppId> el identificador de aplicación de la entidad de servicio.

Pasos siguientes