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_ID
variables de entorno , 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 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á:
- Importe la
DefaultAzureCredential
clase desde elazure.identity
módulo. - Crear un objeto
DefaultAzureCredential
. - 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_ID
de entorno , 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.
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de