Autenticación en recursos de Azure desde aplicaciones de Go hospedadas localmente
Las aplicaciones hospedadas fuera de Azure (por ejemplo, locales o en un centro de datos de terceros) deben usar una entidad de servicio de aplicación para autenticarse en Azure al acceder a los recursos de Azure. Los objetos principales de servicio de la aplicación se crean mediante el proceso de registro de aplicaciones en Azure. Cuando se crea una entidad de servicio de aplicación, se generará un id. de cliente y un secreto de cliente para la aplicación. A continuación, el identificador de cliente, el secreto de cliente y el identificador de inquilino se almacenan en variables de entorno para que el SDK de Azure para Go pueda autenticar la aplicación en Azure en tiempo de ejecución.
Se debe crear un registro de aplicación diferente para cada entorno en el que se hospeda la aplicación. Esto permite configurar permisos de recursos específicos del entorno para cada entidad de servicio y garantiza que una aplicación implementada en un entorno no hable con los recursos de Azure que forman parte de otro entorno.
1- Registro de la aplicación en Azure
Una aplicación se puede registrar con Azure mediante Azure Portal o la CLI de Azure.
az ad sp create-for-rbac --name <app-name>
La salida del comando será similar a la siguiente. Anote estos valores o mantenga abierta esta ventana, ya que necesitará estos valores en los pasos siguientes y no podrá volver a ver el valor de contraseña (secreto de cliente).
{
"appId": "00001111-aaaa-2222-bbbb-3333cccc4444",
"displayName": "msdocs-python-sdk-auth-prod",
"password": "Ee5Ff~6Gg7.-Hh8Ii9Jj0Kk1Ll2Mm3_Nn4Oo5Pp6",
"tenant": "aaaabbbb-0000-cccc-1111-dddd2222eeee"
}
2: Asignación de roles a la entidad de servicio de la aplicación
A continuación, debe determinar qué roles (permisos) necesita la aplicación en qué recursos y asignar esos roles a la aplicación. Los roles se pueden asignar a un rol en el ámbito de recurso, grupo de recursos o suscripción. En este ejemplo se muestra cómo asignar roles para la entidad de servicio 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.
Los roles se asignan a las entidades de servicio mediante el comando az role assignment create.
az role assignment create --assignee {appId} \
--scope /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName} \
--role "{roleName}"
Para obtener los nombres de roles a los que se puede asignar una entidad de servicio, use el comando az role definition list.
az role definition list \
--query "sort_by([].{roleName:roleName, description:description}, &roleName)" \
--output table
Por ejemplo, para permitir que la entidad de servicio con el appId de 00001111-aaaa-2222-bbbb-3333cccc4444
lea, escriba y elimine el acceso a los contenedores y datos de blobs de Azure Storage para todas las cuentas de almacenamiento del grupo de recursos msdocs-go-sdk-auth-example en la suscripción con ID aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e
, asignaría el rol de Colaborador de datos de blobs de almacenamiento a la entidad de servicio de la aplicación mediante el siguiente comando.
az role assignment create --assignee 00001111-aaaa-2222-bbbb-3333cccc4444 \
--scope /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-go-sdk-auth-example \
--role "Storage Blob Data Contributor"
Para obtener información sobre cómo asignar permisos en el nivel de recurso o suscripción mediante la CLI de Azure, consulte el artículo Asignación de roles de Azure mediante la CLI de Azure.
3- Configuración de variables de entorno para la aplicación
Debe establecer las variables de entorno AZURE_CLIENT_ID
, AZURE_TENANT_ID
y AZURE_CLIENT_SECRET
para el proceso que ejecuta la aplicación de Go para que las credenciales de la entidad de servicio de la aplicación estén disponibles para la aplicación en tiempo de ejecución. El objeto DefaultAzureCredential
busca la información de la entidad de servicio en estas variables de entorno.
Nombre de variable | Valor |
---|---|
AZURE_CLIENT_ID |
Identificador de aplicación de una entidad de servicio de Azure |
AZURE_TENANT_ID |
ID 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>"
4- Implementar DefaultAzureCredential en la aplicación
Para autenticar objetos de cliente del SDK de Azure en Azure, la aplicación debe usar el tipo DefaultAzureCredential
del paquete de azidentity
.
Empiece agregando el paquete de azidentity
a la aplicación.
go get github.com/Azure/azure-sdk-for-go/sdk/azidentity
A continuación, para cualquier código de Go que instancie un cliente de Azure SDK en tu aplicación, querrás:
- Importe el paquete de
azidentity
. - Cree una instancia de tipo
DefaultAzureCredential
. - Pase la instancia de tipo
DefaultAzureCredential
al constructor del cliente del SDK de Azure.
Un ejemplo de esto se muestra en el siguiente segmento de código.
import (
"context"
"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.NewDefaultAzureCredential(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>)
}
Cuando el código anterior crea una instancia del objeto DefaultAzureCredential
, DefaultAzureCredential
lee las variables de entorno AZURE_TENANT_ID
, AZURE_CLIENT_ID
y AZURE_CLIENT_SECRET
para que la información de la entidad de servicio de la aplicación se conecte a Azure.