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. 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 Python pueda 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 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 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 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": "00000000-0000-0000-0000-000000000000",
  "displayName": "msdocs-python-sdk-auth-prod",
  "password": "abcdefghijklmnopqrstuvwxyz",
  "tenant": "33333333-3333-3333-3333-333333333333"
}

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 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 tenga el appId de 00000000-0000-0000-0000-000000000000 lectura, escritura y eliminación de acceso a contenedores y datos de Blob de Azure Storage en todas las cuentas de almacenamiento del grupo de recursos msdocs-python-sdk-auth-example de la suscripción con el identificador 11111111-1111-1111-1111-111111111111, asignaría la entidad de servicio de aplicación al rol Colaborador de datos de Storage Blob mediante el siguiente comando.

az role assignment create --assignee 00000000-0000-0000-0000-000000000000 \
    --scope /subscriptions/11111111-1111-1111-1111-111111111111/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 AZURE_CLIENT_IDvariables de entorno , AZURE_TENANT_IDy 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 DefaultAzureCredential objeto 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 EnvironmentFile directiva del gunicorn.server archivo, 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 EnvironmentFile directiva 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 DefaultAzureCredential clase del azure.identity paquete.

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

pip install azure-identity

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

  1. Importe la DefaultAzureCredential clase desde el azure.identity módulo.
  2. Crear un objeto DefaultAzureCredential.
  3. Pase el DefaultAzureCredential objeto 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 DefaultAzureCredential objeto , DefaultAzureCredential lee las variables AZURE_TENANT_IDde entorno , AZURE_CLIENT_IDy AZURE_CLIENT_SECRET para que la información de la entidad de servicio de la aplicación se conecte a Azure.