Compartir vía


Autenticación de aplicaciones de Go en servicios de Azure durante el desarrollo local mediante entidades de servicio

Durante el desarrollo local, las aplicaciones deben autenticarse en Azure para acceder a varios servicios de Azure. Dos enfoques comunes para la autenticación local son usar una cuenta de desarrollador o un Principal del servicio. En este artículo se explica cómo usar un principal de servicio de aplicación. En las secciones siguientes, aprenderá:

  • Cómo registrar una aplicación en Microsoft Entra para crear un principal de servicio
  • Uso de grupos de Microsoft Entra para administrar de forma eficaz los permisos
  • Cómo asignar roles a permisos de ámbito
  • Autenticar usando un principal de servicio desde el código de tu aplicación

Mediante el uso de entidades de servicio de aplicaciones dedicadas, puede cumplir el principio de privilegios mínimos al acceder a los recursos de Azure. Limite los permisos a los requisitos específicos de la aplicación durante el desarrollo, lo que impide el acceso accidental a los recursos de Azure destinados a otras aplicaciones o servicios. Este enfoque también ayuda a evitar problemas cuando la aplicación se mueve a producción asegurándose de que no tiene privilegios excesivos en el entorno de desarrollo.

Diagrama que muestra cómo una aplicación go local usa una entidad de servicio para conectarse a los recursos de Azure.

Al registrar la aplicación en Azure, creas un principal de servicio de aplicación. Para el desarrollo local:

  • Cree un registro de aplicación independiente para cada desarrollador que trabaje en la aplicación, por lo que cada desarrollador tiene su propia entidad de servicio de aplicación y no necesita compartir credenciales.
  • Cree un registro de aplicación independiente para cada aplicación para limitar los permisos de la aplicación solo a lo necesario.

Durante el desarrollo local, configure las variables de entorno con la identidad del principal de servicio de la aplicación. La biblioteca de identidades de Azure lee estas variables de entorno para autenticar la aplicación en los recursos de Azure necesarios.

Registro de la aplicación en Azure

Los objetos de entidad principal de servicio de aplicación se crean a través de un registro de aplicaciones en Azure mediante el Portal de Azure o la CLI de Azure.

  1. En Azure Portal, use la barra de búsqueda para ir a la página Registros de aplicaciones.

  2. En la página Registros de aplicaciones, seleccione + Nuevo registro.

  3. En la página Registrar una aplicación :

    • En el campo Nombre , escriba un valor descriptivo que incluya el nombre de la aplicación y el entorno de destino.
    • Para los tipos de cuenta admitidos, seleccione Solo cuentas en este directorio organizativo (Solo cliente de Microsoft dirigido - locatario único) o la opción que mejor se adapte a sus requisitos.
  4. Seleccione Registrar para registrar la aplicación y crear la entidad de servicio.

    Captura de pantalla que muestra cómo crear un registro de aplicación en Azure Portal.

  5. En la página Registro de aplicaciones de la aplicación, copie el identificador de aplicación (cliente) y el identificador de directorio (inquilino) y péguelos en una ubicación temporal para usarlos posteriormente en las configuraciones de código de la aplicación.

  6. Seleccione Agregar un certificado o un secreto para configurar las credenciales de la aplicación.

  7. En la página Certificados y secretos , seleccione + Nuevo secreto de cliente.

  8. En el panel flotante Agregar un secreto de cliente que aparece:

    • En Descripción, escriba un valor de Current.
    • Para el valor Expira, deje el valor recomendado predeterminado de 180 días.
    • Seleccione Agregar para agregar el secreto.
  9. En la página Certificados y secretos , copie la propiedad Value del secreto de cliente para su uso en un paso futuro.

    Nota

    El valor del secreto de cliente solo se muestra una vez después de crear el registro de la aplicación. Puede agregar más secretos de cliente sin invalidar este secreto de cliente, pero no hay ninguna manera de volver a mostrar este valor.

Creación de un grupo de Microsoft Entra para el desarrollo local

Cree un grupo de Microsoft Entra para encapsular los roles (permisos) que la aplicación necesita en el desarrollo local en lugar de asignar los roles a objetos de entidad de servicio individuales. Este procedimiento ofrece las siguientes ventajas:

  • Cada desarrollador tiene los mismos roles asignados en el nivel de grupo.
  • Si se necesita un nuevo rol para la aplicación, solo debe agregarse al grupo de la aplicación.
  • Si un nuevo desarrollador se une al equipo, se crea un nuevo principal de servicio de la aplicación para el desarrollador y se agrega al grupo, garantizando que el desarrollador tenga los permisos adecuados para trabajar en la aplicación.
  1. Vaya a la página de descripción general de Microsoft Entra ID en el portal de Azure.

  2. Seleccione Todos los grupos en el menú de la izquierda.

  3. En la página Grupos , seleccione Nuevo grupo.

  4. En la página Nuevo grupo , rellene los siguientes campos de formulario:

    • Tipo de grupo: seleccione Seguridad.
    • Nombre del grupo: escriba un nombre para el grupo que incluya una referencia al nombre de la aplicación o del entorno.
    • Descripción del grupo: escriba una descripción que explique el propósito del grupo.

    Captura de pantalla que muestra cómo crear un grupo en Azure Portal.

  5. Seleccione el vínculo Sin miembros seleccionados en Miembros para agregar miembros al grupo.

  6. En el panel flotante que se abre, busque la entidad de servicio que creó anteriormente y selecciónela en los resultados filtrados. Elija el botón Seleccionar situado en la parte inferior del panel para confirmar la selección.

  7. Seleccione Crear en la parte inferior de la página Nuevo grupo para crear el grupo y volver a la página Todos los grupos . Si no ve el nuevo grupo en la lista, espere un momento y actualice la página.

Asignación de roles al grupo

A continuación, determine qué roles (permisos) necesita la aplicación en qué recursos y asigne esos roles al grupo de Microsoft Entra que ha creado. A los grupos se les puede asignar un rol en el ámbito de recurso, grupo de recursos o suscripción. En este ejemplo se muestra cómo asignar roles en el ámbito del grupo de recursos, ya que la mayoría de las aplicaciones agrupan todos sus recursos de Azure en un único grupo de recursos.

  1. En Azure Portal, vaya a la página Información general del grupo de recursos que contiene la aplicación.

  2. Seleccione Control de acceso (IAM) en el panel de navegación izquierdo.

  3. En la página Control de acceso (IAM), seleccione + Agregar y, a continuación, elija Agregar asignación de roles en el menú desplegable. La página Agregar asignación de roles proporciona varias pestañas para configurar y asignar roles.

  4. En la pestaña Rol , use el cuadro de búsqueda para buscar el rol que desea asignar. Seleccione el rol y, a continuación, elija Siguiente.

  5. En la pestaña Miembros :

    • En Asignar acceso al valor, seleccione Usuario, grupo o entidad de servicio .
    • Para el valor Miembros , elija + Seleccionar miembros para abrir el panel flotante Seleccionar miembros .
    • Busque el grupo Microsoft Entra que creó anteriormente y selecciónelo en los resultados filtrados. Elija Seleccionar para seleccionar el grupo y cerrar el panel flotante.
    • Seleccione Revisar y asignar en la parte inferior de la pestaña Miembros .

    Captura de pantalla que muestra cómo asignar un rol al grupo Microsoft Entra.

  6. En la pestaña Revisar y asignar , seleccione Revisar y asignar en la parte inferior de la página.

Establecimiento de las variables de entorno de la aplicación

En tiempo de ejecución, ciertas credenciales de la biblioteca de identidades de Azure, como DefaultAzureCredential, EnvironmentCredentialy ClientSecretCredential, buscan información de entidad de servicio por convención en las variables de entorno. Puede configurar variables de entorno de varias maneras en función de las herramientas y el entorno. Puede crear un .env archivo o usar variables de entorno del sistema para almacenar estas credenciales localmente durante el desarrollo. Dado que la mayoría de los desarrolladores trabajan en varias aplicaciones, use un paquete como godotenv para acceder a variables de entorno desde un .env archivo almacenado en el directorio de la aplicación durante el desarrollo. Este enfoque limita las variables de entorno que se usan para autenticar la aplicación en Azure para que solo esta aplicación pueda usarlas. Nunca compruebe el archivo en el .env control de código fuente, ya que contiene la clave secreta de aplicación para Azure. El archivo .gitignore estándar para Go excluye automáticamente el archivo .env de la protección.

Para usar el godotenv paquete, instale primero el paquete en la aplicación.

go get github.com/joho/godotenv

A continuación, cree un archivo .env en el directorio raíz de la aplicación. Establezca los valores de las variables de entorno con los valores obtenidos del proceso de registro de aplicaciones para un principal del servicio:

  • AZURE_CLIENT_ID: se usa para identificar la aplicación registrada en Azure.
  • AZURE_TENANT_ID: el identificador del inquilino de Microsoft Entra.
  • AZURE_CLIENT_SECRET: credencial secreta que se generó para la aplicación.
AZURE_CLIENT_ID=<your-client-id>
AZURE_TENANT_ID=<your-tenant-id>
AZURE_CLIENT_SECRET=<your-client-secret>

Por último, en el código de inicio de la aplicación, use la biblioteca de godotenv para leer las variables de entorno del archivo .env al iniciarse.

// Imports of fmt, log, and os omitted for brevity 
import "github.com/joho/godotenv"

environment := os.Getenv("ENVIRONMENT")

if environment == "development" {
	fmt.Println("Loading environment variables from .env file")

	// Load the .env file
	err := godotenv.Load(".env")
	if err != nil {
	    log.Fatalf("Error loading .env file: %v", err)
	}
}

Si prefiere establecer las variables de entorno en el entorno del sistema en lugar de usar un .env archivo, puede hacerlo de varias maneras en función del sistema operativo y del shell. En los ejemplos siguientes se muestra cómo establecer las variables de entorno en distintos shells:

export AZURE_CLIENT_ID=<your-client-id>
export AZURE_TENANT_ID=<your-tenant-id>
export AZURE_CLIENT_SECRET=<your-client-secret>

Autenticación en servicios de Azure desde la aplicación

La biblioteca de identidades de Azure proporciona diferentes TokenCredential implementaciones para varios escenarios y flujos de autenticación de Microsoft Entra. Úselo EnvironmentCredential al trabajar con entidades de servicio tanto localmente como en producción. En este escenario, EnvironmentCredential lee las variables de entorno AZURE_CLIENT_ID, AZURE_TENANT_ID y AZURE_CLIENT_SECRET para obtener la información del principal de servicio de la aplicación para conectarse a Azure.

  1. Agregue el azidentity paquete a la aplicación.

    go get github.com/Azure/azure-sdk-for-go/sdk/azidentity
    
  2. Para cualquier código de Go que cree un objeto de cliente de Azure SDK en tu aplicación, quieres:

    1. Importe el paquete de azidentity.
    2. Cree una EnvironmentCredential instancia.
    3. Pase la instancia al constructor de cliente del SDK de Azure.

    El siguiente segmento de código muestra un ejemplo:

    import (
    	"context"
    	"os"
    
    	"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
    	"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob"
    )
    
    const (
    	account       = "https://<replace_with_your_storage_account_name>.blob.core.windows.net/"
    	containerName = "sample-container"
    	blobName      = "sample-blob"
    	sampleFile    = "path/to/sample/file"
    )
    
    func main() {
    	// create a credential
    	cred, err := azidentity.NewEnvironmentCredential(nil)
    	if err != nil {
    	  // TODO: handle error
    	}
    
    	// create a client for the specified storage account
    	client, err := azblob.NewClient(account, cred, nil)
    	if err != nil {
    	  // TODO: handle error
    	}
    
    	// TODO: perform some action with the azblob Client
    	// _, err = client.DownloadFile(context.TODO(), <containerName>, <blobName>, <target_file>, <DownloadFileOptions>)
    }