Compartir a través de


Autenticación en recursos de Azure desde aplicaciones Python hospedadas en el entorno local

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 de entidad de servicio de 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. 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 Python las pueda usar para autenticar la aplicación en Azure en tiempo de ejecución.

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 asegurarse de que una aplicación implementada en un entorno no se comunique con los recursos de Azure que forman parte de otro entorno.

1: Registro de la aplicación en Azure AD

Una aplicación se puede registrar en Azure mediante Azure Portal o la CLI de Azure.

az ad sp create-for-rbac --name <app-name>

El resultado de este comando será similar al siguiente: Anote estos valores o mantenga esta ventana abierta, ya que necesitará estos valores en los pasos siguientes y no podrá volver a ver el valor de la contraseña (secreto del 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 y en qué recursos y asignar dichos 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 a 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-python-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-python-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 Python 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.

Cuando se usa Gunicorn para ejecutar aplicaciones web de Python en un entorno de servidor UNIX, se pueden especificar variables de entorno para una aplicación mediante la directiva EnvironmentFile del archivo gunicorn.server, como se muestra a continuación.

[Unit]
Description=gunicorn daemon
After=network.target  
  
[Service]  
User=www-user
Group=www-data
WorkingDirectory=/path/to/python-app
EnvironmentFile=/path/to/python-app/py-env/app-environment-variables
ExecStart=/path/to/python-app/py-env/gunicorn --config config.py wsgi:app
            
[Install]  
WantedBy=multi-user.target

El archivo especificado en la directiva EnvironmentFile debe contener una lista de variables de entorno con sus valores, como se muestra a continuación.

AZURE_CLIENT_ID=<value>
AZURE_TENANT_ID=<value>
AZURE_CLIENT_SECRET=<value>

4: Implementación de DefaultAzureCredential en su aplicación

Para autenticar objetos de cliente del SDK de Azure en Azure, la aplicación debe usar la clase DefaultAzureCredential del paquete azure.identity.

Empiece agregando el paquete azure.identity a la aplicación.

pip install azure-identity

A continuación, para cualquier código Python que cree un objeto de cliente del SDK de Azure en la aplicación, querrá:

  1. Importar la clase DefaultAzureCredential desde el módulo azure.identity.
  2. Crear un objeto DefaultAzureCredential.
  3. Pasar el objeto DefaultAzureCredential al constructor de objetos de cliente del SDK de Azure.

En el segmento de código siguiente se muestra un ejemplo de esto.

from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient

# Acquire a credential object
token_credential = DefaultAzureCredential()

blob_service_client = BlobServiceClient(
        account_url="https://<my_account_name>.blob.core.windows.net",
        credential=token_credential)

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.