Autenticación de aplicaciones de Python en servicios de Azure durante el desarrollo local mediante entidades de servicio
Artículo
Tiempo de lectura: 12 minutos
Al crear aplicaciones en la nube, los desarrolladores deben depurar y probar aplicaciones en su estación de trabajo local. Cuando una aplicación se ejecuta en la estación de trabajo de un desarrollador durante el desarrollo local, todavía debe autenticarse en los servicios de Azure usados por la aplicación. En este artículo se explica cómo configurar objetos de entidad de servicio de aplicación dedicados que se usarán durante el desarrollo local.
Las entidades de servicio de aplicaciones dedicadas para el desarrollo local permiten seguir el principio de privilegios mínimos durante el desarrollo de aplicaciones. Dado que los permisos se limitan exactamente a lo que se necesita para la aplicación durante el desarrollo, se impide que el código de la aplicación acceda accidentalmente a un recurso de Azure destinado a su uso por otra aplicación. Esto también impide que se produzcan errores cuando la aplicación se mueve a producción porque la aplicación se ha sobreprivilegado en el entorno de desarrollo.
Se configura una entidad de servicio de aplicación para la aplicación cuando la aplicación está registrada en Azure. Al registrar aplicaciones para el desarrollo local, se recomienda:
Cree registros de aplicaciones independientes para cada desarrollador que trabaje en la aplicación. Esto creará entidades de servicio de aplicación independientes para que cada desarrollador la use durante el desarrollo local y evitará la necesidad de que los desarrolladores compartan credenciales para una sola entidad de servicio de aplicación.
Cree registros de aplicaciones independientes por aplicación. Esto limita los permisos de la aplicación solo a lo que necesita la aplicación.
Durante el desarrollo local, las variables de entorno se establecen con la identidad de la entidad de servicio de la aplicación. El SDK de Azure para Python lee estas variables de entorno y usa esta información para autenticar la aplicación en los recursos de Azure que necesita.
1 - Registro de la aplicación en Azure
Los objetos de entidad de servicio de aplicación se crean con un registro de aplicación en Azure. Esto se puede hacer mediante el Azure Portal o la CLI de Azure.
Inicie sesión en el Azure Portal y siga estos pasos.
Instrucciones
Instantánea
En Azure Portal:
Escriba registros de aplicaciones en la barra de búsqueda de la parte superior del Azure Portal.
Seleccione el elemento etiquetado Registros de aplicaciones en el encabezado Servicios del menú que aparece debajo de la barra de búsqueda.
En la página Registros de aplicaciones, seleccione + Nuevo registro.
En la página Registrar una aplicación , rellene el formulario como se indica a continuación.
Nombre → Escriba un nombre para el registro de la aplicación en Azure. Se recomienda que este nombre incluya el nombre de la aplicación, el usuario para el que está el registro de la aplicación y un identificador como "dev" para indicar que el registro de la aplicación es para su uso en el desarrollo local.
Los tipos de cuenta admitidos → solo las cuentas de este directorio organizativo.
Seleccione Registrar para registrar la aplicación y crear la entidad de servicio de la aplicación.
En la página Registro de aplicaciones de la aplicación:
Id. de aplicación (cliente) → Este es el identificador de aplicación que usará la aplicación para acceder a Azure durante el desarrollo local. Copie este valor en una ubicación temporal en un editor de texto, ya que lo necesitará en un paso futuro.
Identificador de directorio (inquilino) → La aplicación también necesitará este valor cuando se autentique en Azure. Copie este valor en una ubicación temporal en un editor de texto que también lo necesitará en un paso futuro.
Credenciales de cliente → Debe establecer las credenciales de cliente de la aplicación para poder autenticarse en Azure y usar los servicios de Azure. Seleccione Agregar un certificado o un secreto para agregar credenciales para la aplicación.
En la página Secretos de & certificados, seleccione + Nuevo secreto de cliente.
El cuadro de diálogo Agregar un secreto de cliente aparecerá en el lado derecho de la página. En este cuadro de diálogo:
Descripción → Escriba un valor de Current.
Expira → Seleccione un valor de 24 meses.
Seleccione Agregar para agregar el secreto.
En la página Secretos de certificados&, se mostrará el valor del secreto de cliente.
Copie este valor en una ubicación temporal en un editor de texto, ya que lo necesitará en un paso futuro.
IMPORTANTE: Esta es la única vez que verá este valor. Una vez que deje o actualice esta página, no podrá volver a ver este valor. Puede agregar un secreto de cliente adicional sin invalidar este secreto de cliente, pero no volverá a ver este valor.
En primer lugar, use el comando az ad sp create-for-rbac para crear una nueva entidad de servicio para la aplicación. Esto también creará el registro de la aplicación para la aplicación al mismo tiempo.
az ad sp create-for-rbac --name {service-principal-name}
La salida de este comando tendrá un aspecto similar al siguiente. Se recomienda copiar esta salida en un archivo temporal en un editor de texto, ya que necesitará estos valores en un paso futuro, ya que este es el único lugar en el que se ve el secreto de cliente (contraseña) de la entidad de servicio. Sin embargo, puede agregar una nueva contraseña más adelante sin invalidar la entidad de servicio o las contraseñas existentes si es necesario.
2 - Creación de un grupo de seguridad de Azure AD para el desarrollo local
Puesto que normalmente hay varios desarrolladores que trabajan en una aplicación, se recomienda crear un grupo de Azure AD 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. Esto ofrece las siguientes ventajas.
Se garantiza que todos los desarrolladores tengan asignados los mismos roles, ya que los roles se asignan en el nivel de grupo.
Si se necesita un nuevo rol para la aplicación, solo debe agregarse al grupo de Azure AD de la aplicación.
Si un nuevo desarrollador se une al equipo, se crea una nueva entidad de servicio de aplicación para el desarrollador y se agrega al grupo, lo que garantiza que el desarrollador tiene los permisos adecuados para trabajar en la aplicación.
Vaya a la página de Azure Active Directory en el Azure Portal escribiendo Azure Active Directory en el cuadro de búsqueda de la parte superior de la página y seleccionando Azure Active Directory en los servicios.
En la página Azure Active Directory, seleccione Grupos en el menú de la izquierda.
En la página Todos los grupos , seleccione Nuevo grupo.
En la página Nuevo grupo :
Tipo de grupo → Seguridad
Nombre del grupo → Un nombre para el grupo de seguridad, normalmente creado a partir del nombre de la aplicación. También resulta útil incluir una cadena como local-dev en el nombre del grupo para indicar el propósito del grupo.
Descripción del grupo → Descripción del propósito del grupo.
Seleccione el vínculo No members selected (No miembros) seleccionado en Miembros para agregar miembros al grupo.
En el cuadro de diálogo Agregar miembros :
Use el cuadro de búsqueda para filtrar la lista de nombres principales de la lista.
Seleccione las entidades de servicio de la aplicación para el desarrollo local de esta aplicación. A medida que se seleccionan los objetos, se atenuarán y se moverán a la lista Elementos seleccionados en la parte inferior del cuadro de diálogo.
Cuando termine, seleccione el botón Seleccionar .
De nuevo en la página Nuevo grupo , seleccione Crear para crear el grupo.
El grupo se creará y se le devolverá a la página Todos los grupos . El grupo puede tardar hasta 30 segundos en aparecer y es posible que tenga que actualizar la página debido al almacenamiento en caché en el Azure Portal.
El comando az ad group create se usa para crear grupos en Azure Active Directory. Los parámetros --display-name y --main-nickname son obligatorios. El nombre asignado al grupo debe basarse en el nombre de la aplicación. También es útil incluir una frase como "local-dev" en el nombre del grupo para indicar el propósito del grupo.
az ad group create \
--display-name MyDisplay \
--mail-nickname MyDisplay \
--description \<group-description>
Para agregar miembros al grupo, necesitará el identificador de objeto de la entidad de servicio de la aplicación, que es diferente al identificador de la aplicación. Use az ad sp list para enumerar las entidades de servicio disponibles. El --filter comando parameter acepta filtros de estilo OData y se puede usar para filtrar la lista como se muestra. El --query parámetro limita a las columnas solo a las de interés.
az ad sp list \
--filter "startswith(displayName, 'msdocs')" \
--query "[].{objectId:objectId, displayName:displayName}" \
--output table
az ad group member add \
--group \<group-name> \
--member-id \<object-id> \
3- Asignación de roles a 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. En este ejemplo, los roles se asignarán al grupo de Azure Active Directory creado en el paso 2. A los roles se les puede asignar un rol en un á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.
Busque el grupo de recursos de la aplicación; para ello, busque el nombre del grupo de recursos mediante el cuadro de búsqueda situado en la parte superior del Azure Portal.
Vaya al grupo de recursos seleccionando el nombre del grupo de recursos en el encabezado Grupos de recursos del cuadro de diálogo.
En la página del grupo de recursos, seleccione Control de acceso (IAM) en el menú de la izquierda.
En la página Control de acceso (IAM):
Seleccione la pestaña Asignaciones de roles.
Seleccione + Agregar en el menú superior y, a continuación, Agregar asignación de roles en el menú desplegable resultante.
En la página Agregar asignación de roles se enumeran todos los roles que se pueden asignar al grupo de recursos.
Use el cuadro de búsqueda para filtrar la lista por un tamaño más fácil de administrar. En este ejemplo se muestra cómo filtrar por Storage roles de blob.
Seleccione el rol que desea asignar.
Seleccione Siguiente para ir a la pantalla siguiente.
La siguiente página Agregar asignación de roles permite especificar a qué usuario asignar el rol.
Seleccione Usuario, grupo o entidad de servicio en Asignar acceso a.
Seleccione + Seleccionar miembros en Miembros.
Se abrirá un cuadro de diálogo en el lado derecho del Azure Portal.
En el cuadro de diálogo Seleccionar miembros :
El cuadro de texto Seleccionar se puede usar para filtrar la lista de usuarios y grupos de la suscripción. Si es necesario, escriba los primeros caracteres del grupo de desarrollo local Azure AD que creó para la aplicación.
Seleccione el grupo de desarrollo local Azure AD asociado a la aplicación.
Seleccione Seleccionar en la parte inferior del cuadro de diálogo para continuar.
El grupo Azure AD ahora se mostrará como seleccionado en la pantalla Agregar asignación de roles.
Seleccione Revisar y asignar para ir a la página final y, después, Revisar y asignar de nuevo para completar el proceso.
A una entidad de servicio de aplicación se le asigna un rol en Azure mediante el comando az role assignment create .
az role assignment create --assignee "{appId}" \
--scope /subscriptions/"{subscriptionName}" \
--role "{roleName}" \
--resource-group "{resourceGroupName}"
Para obtener los nombres de rol 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 de la aplicación tenga el appId de acceso de 00000000-0000-0000-0000-000000000000 lectura, escritura y eliminación a Azure Storage contenedores de blobs y datos a todas las cuentas de almacenamiento del grupo de recursos msdocs-python-sdk-auth-example, asignaría la entidad de servicio de la aplicación al rol colaborador de datos de blobs Storage mediante el siguiente comando.
az role assignment create --assignee "00000000-0000-0000-0000-000000000000" \
--scope /subscriptions/"Storage Blob Data Subscriber" \
--role "Storage Blob Data Contributor" \
--resource-group "msdocs-python-sdk-auth-example"
4- Establecimiento de variables de entorno de desarrollo local
El DefaultAzureCredential objeto buscará la información de la entidad de servicio en un conjunto de variables de entorno en tiempo de ejecución. Dado que la mayoría de los desarrolladores trabajan en varias aplicaciones, se recomienda usar un paquete como python-dotenv para acceder al entorno desde un .env archivo almacenado en el directorio de la aplicación durante el desarrollo. Esto limita las variables de entorno que se usan para autenticar la aplicación en Azure, de modo que esta aplicación solo las pueda usar.
El .env archivo nunca se comprueba en el control de código fuente, ya que contiene la clave secreta de la aplicación para Azure. El archivo .gitignore estándar para Python excluye automáticamente el .env archivo de la comprobación.
Para usar el paquete python-dotenv, instale primero el paquete en la aplicación.
pip install python-dotenv
A continuación, cree un .env archivo en el directorio raíz de la aplicación. Establezca los valores de la variable de entorno con los valores obtenidos del proceso de registro de la aplicación de la siguiente manera:
AZURE_CLIENT_ID → El valor del identificador de la aplicación.
AZURE_TENANT_ID → El valor del identificador de inquilino.
AZURE_CLIENT_SECRET → La contraseña o credencial generada para la aplicación.
Por último, en el código de inicio de la aplicación, use la python-dotenv biblioteca para leer las variables de entorno del archivo en el .env inicio.
from dotenv import load_dotenv
if ( os.environ['ENVIRONMENT'] == 'development'):
print("Loading environment variables from .env file")
load_dotenv(".env")
5- Implementar DefaultAzureCredential en la 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. En este escenario, DefaultAzureCredential detectará las variables AZURE_CLIENT_IDde entorno , AZURE_TENANT_IDy se establecerán y AZURE_CLIENT_SECRET leerán esas variables para obtener la información de la entidad de servicio de la aplicación con la que conectarse a Azure.
Para empezar, agregue 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 de Azure SDK en la aplicación, querrá:
Importe la DefaultAzureCredential clase desde el azure.identity módulo.
Crear un objeto DefaultAzureCredential.
Pase el DefaultAzureCredential objeto al constructor de objetos de cliente del SDK de Azure.
Un ejemplo de esto se muestra en el siguiente segmento de código.
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)