Migración de una aplicación de Python para usar conexiones sin contraseña con Azure SQL Database

Se aplica a:Azure SQL Database

Las solicitudes de aplicación a Azure SQL Database deben autenticarse. Aunque hay varias opciones para autenticarse en Azure SQL Database, debe priorizar las conexiones sin contraseña en las aplicaciones siempre que sea posible. Los métodos de autenticación tradicionales que usan contraseñas o claves secretas crean riesgos y complicaciones de seguridad. Visite el centro de Conexiones sin contraseña para servicios de Azure para obtener más información sobre las ventajas de pasar a conexiones sin contraseña. El siguiente tutorial explica cómo migrar una aplicación de Python existente para conectarse a Azure SQL Database y utilizar conexiones sin contraseña en lugar de una solución basada en nombre de usuario y contraseña.

Configuración de Azure SQL Database

Las conexiones sin contraseña usan la autenticación de Microsoft Entra para conectarse a los servicios de Azure, incluida la base de datos de Azure SQL. Con la autenticación de Microsoft Entra, puede administrar identidades en una ubicación central para simplificar la administración de permisos. Obtenga más información sobre cómo configurar la autenticación de Microsoft Entra para la base de datos de Azure SQL:

Para esta guía de migración, asegúrese de que tiene asignado un administrador de Microsoft Entra a la base de datos de Azure SQL.

  1. Vaya a la página de Microsoft Entra del servidor lógico.

  2. Seleccione Establecer administrador para abrir el menú de control flotante de Microsoft Entra ID.

  3. En el menú de control flotante de Microsoft Entra ID, busque el usuario que quiere asignar como administrador.

  4. Seleccione el usuario y elija Seleccionar.

    A screenshot showing how to enable Microsoft Entra admin.

Configuración del entorno de desarrollo local

Las conexiones sin contraseña se pueden configurar para que funcionen en entornos locales y hospedados en Azure. En esta sección, se aplican configuraciones para permitir que los usuarios individuales se autentiquen en Azure SQL Database para el desarrollo local.

Inicio de sesión en Azure

Para el desarrollo local, asegúrese de que ha iniciado sesión con la misma cuenta de Azure AD que quiere usar para acceder a Azure SQL Database. Puede autenticarse a través de herramientas de desarrollo populares, como la CLI de Azure o Azure PowerShell. Las herramientas de desarrollo con las que puede autenticarse varían en todos los idiomas.

Inicie sesión en Azure a través de la CLI de Azure mediante el siguiente comando:

az login

Creación del usuario de la base de datos y asignación de roles

Cree un usuario en Azure SQL Database. El usuario debe corresponder a la cuenta de Azure que usó para iniciar sesión localmente en la sección Inicio de sesión en Azure.

  1. En Azure Portal, vaya a la base de datos SQL y seleccione Editor de consultas (versión preliminar).

  2. Seleccione Continuar como <your-username> en el lado derecho de la pantalla para iniciar sesión en la base de datos con su cuenta.

  3. En la vista del editor de consultas, ejecute los siguientes comandos de T-SQL:

    CREATE USER [user@domain] FROM EXTERNAL PROVIDER;
    ALTER ROLE db_datareader ADD MEMBER [user@domain];
    ALTER ROLE db_datawriter ADD MEMBER [user@domain];
    ALTER ROLE db_ddladmin ADD MEMBER [user@domain];
    GO
    

    A screenshot showing how to use the Azure Query editor.

    Al ejecutar estos comandos, se asigna el rol Colaborador de base de datos SQL a la cuenta especificada. Este rol permite que la identidad lea, escriba y modifique los datos y el esquema de la base de datos. Para más información sobre los roles asignados, consulte Roles fijos de base de datos.

Actualización de la configuración de conexión local

El código de aplicación existente que se conecta a Azure SQL Database mediante el controlador SQL de Python: pyodbc sigue funcionando con las conexiones sin contraseña con cambios menores. Por ejemplo, el código siguiente funciona con la autenticación de SQL y las conexiones sin contraseña cuando se ejecutan localmente y cuando se implementan en Azure App Service.

import os
import pyodbc, struct
from azure.identity import DefaultAzureCredential

connection_string = os.environ["AZURE_SQL_CONNECTIONSTRING"]

def get_all():
    with get_conn() as conn:
        cursor = conn.cursor()
        cursor.execute("SELECT * FROM Persons")
        # Do something with the data
    return

def get_conn():
    credential = DefaultAzureCredential(exclude_interactive_browser_credential=False)
    token_bytes = credential.get_token("https://database.windows.net/.default").token.encode("UTF-16-LE")
    token_struct = struct.pack(f'<I{len(token_bytes)}s', len(token_bytes), token_bytes)
    SQL_COPT_SS_ACCESS_TOKEN = 1256  # This connection option is defined by microsoft in msodbcsql.h
    conn = pyodbc.connect(connection_string, attrs_before={SQL_COPT_SS_ACCESS_TOKEN: token_struct})
    return conn

Sugerencia

En este código de ejemplo, se usa la variable de entorno WEBSITE_HOSTNAME de App Service para determinar en qué entorno se ejecuta el código. En otros escenarios de implementación, puede usar otras variables de entorno para determinar el entorno.

Para actualizar la cadena de conexión a la que se hace referencia (AZURE_SQL_CONNECTIONSTRING) para el desarrollo local, use el formato de cadena de conexión sin contraseña:

Driver={ODBC Driver 18 for SQL Server};Server=tcp:<database-server-name>.database.windows.net,1433;Database=<database-name>;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30

Prueba de la aplicación

Ejecute la aplicación localmente y compruebe que las conexiones a Azure SQL Database funcionan según lo previsto. Tenga en cuenta que los cambios en los usuarios y roles de Azure pueden tardar varios minutos en propagarse por su entorno de Azure. Ahora la aplicación está configurada para ejecutarse localmente sin que los desarrolladores tengan que administrar los secretos en la propia aplicación.

Configuración del entorno de hospedaje de Azure

Una vez que la aplicación se ha configurado para usar conexiones sin contraseña localmente, el mismo código se puede autenticar en los servicios de Azure SQL Database después de implementarla en Azure. En las secciones siguientes se explica cómo configurar una aplicación implementada para conectarse a Azure SQL Database mediante una identidad administrada. Las identidades administradas proporcionan una identidad administrada automáticamente en Microsoft Entra ID (anteriormente Azure Active Directory) para que las aplicaciones la utilicen al conectarse a los recursos que admiten la autenticación de Microsoft Entra. Más información sobre las identidades administradas:

Creación de la identidad administrada

Cree una identidad administrada asignada por el usuario mediante Azure Portal o la CLI de Azure. La aplicación usa la identidad para autenticarse en otros servicios.

  1. En la parte superior del Azure Portal, busque Identidades administradas. Seleccione el resultado de Identidades administradas.
  2. Seleccione + Crear en la parte superior de la página de información general de Identidades administradas.
  3. En la pestaña Datos básicos, escriba los valores siguientes:
    • Suscripción: Seleccione la opción de suscripción que desee.
    • Grupo de recursos: seleccione el grupo de recursos que desee.
    • Región: seleccione una región cercana a su ubicación.
    • Nombre: Escriba un nombre reconocible para la identidad, como MigrationIdentity.
  4. En la parte inferior de la página, seleccione Revisar y crear.
  5. Cuando finalicen las comprobaciones de validación, seleccione Crear. Azure crea una nueva identidad asignada por el usuario.

Una vez creado el recurso, seleccione Ir al recurso para ver los detalles de la identidad administrada.

A screenshot showing how to create a managed identity using the Azure portal.

Asociación de la identidad administrada a la aplicación web

Configure la aplicación web para que use la identidad administrada asignada por el usuario que ha creado.

Complete los pasos siguientes en Azure Portal para asociar una identidad administrada asignada por el usuario con la aplicación. Estos mismos pasos se aplican a los siguientes servicios de Azure:

  • Azure Spring Apps
  • Azure Container Apps
  • Máquinas virtuales de Azure
  • Azure Kubernetes Service
  • Vaya a la página de información general de la aplicación web.
  1. En el menú de navegación de la izquierda, seleccione Identidad.

  2. En la página Identidad, cambie a la pestaña Asignado por el usuario.

  3. Seleccione + Agregar para abrir el control flotante Agregar identidad administrada asignada por el usuario.

  4. Seleccione la suscripción que usó anteriormente para crear la identidad.

  5. Busque MigrationIdentity por nombre y selecciónelo en los resultados de la búsqueda.

  6. Seleccione Agregar para asociar la identidad a la aplicación.

    A screenshot showing how to assign a managed identity.

Creación de un usuario de base de datos para la identidad y asignación de roles

Cree un usuario de SQL Database que vuelva a asignarse a la identidad administrada asignada por el usuario. Asigna los roles SQL necesarios al usuario para permitir que la aplicación lea, escriba y modifique los datos y el esquema de la base de datos.

  1. En Azure Portal, vaya a la base de datos SQL y seleccione Editor de consultas (versión preliminar).

  2. Seleccione Continuar como <username> en el lado derecho de la pantalla para iniciar sesión en la base de datos con su cuenta.

  3. En la vista del editor de consultas, ejecute los siguientes comandos de T-SQL:

    CREATE USER [user-assigned-identity-name] FROM EXTERNAL PROVIDER;
    ALTER ROLE db_datareader ADD MEMBER [user-assigned-identity-name];
    ALTER ROLE db_datawriter ADD MEMBER [user-assigned-identity-name];
    ALTER ROLE db_ddladmin ADD MEMBER [user-assigned-identity-name];
    GO
    

    A screenshot showing how to use the Azure Query editor to create a SQL user for a managed identity.

    Al ejecutar estos comandos, se asigna el rol Colaborador de base de datos SQL a la identidad administrada asignada por el usuario. Este rol permite que la identidad lea, escriba y modifique los datos y el esquema de la base de datos.


Importante

Tenga cuidado al asignar roles de usuario de base de datos en entornos de producción empresarial. En esos escenarios, la aplicación no debe realizar todas las operaciones con una única identidad con privilegios elevados. Intente implementar el principio de privilegios mínimos configurando varias identidades con permisos específicos para tareas específicas.

Puede consultar más información sobre cómo configurar roles de base de datos y seguridad en los siguientes recursos:

Actualización de la cadena de conexión

Actualice la configuración de la aplicación de Azure para usar el formato de cadena de conexión sin contraseña. El formato debe ser el mismo que se usa en el entorno local.

Las cadenas de conexión se pueden almacenar como variables de entorno en el entorno de hospedaje de aplicaciones. Las instrucciones siguientes se centran en App Service, pero otros servicios de hospedaje de Azure proporcionan configuraciones similares.

Driver={ODBC Driver 18 for SQL Server};Server=tcp:<database-server-name>.database.windows.net,1433;Database=<database-name>;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30

<database-server-name> es el nombre del servidor de Azure SQL Database y <database-name> es el nombre de la instancia de Azure SQL Database.

Creación de una configuración de aplicación para el identificador de cliente de la identidad administrada

Para usar la identidad administrada asignada por el usuario, cree una variable de entorno AZURE_CLIENT_ID y establézcala en el identificador de cliente de la identidad administrada. Puede establecer esta variable en la sección Configuración de la aplicación en Azure Portal. El identificador de cliente se encuentra en la sección Información general del recurso de identidad administrada en Azure Portal.

Guarde los cambios y reinicie la aplicación si no lo hace automáticamente.

Nota

El código de conexión de ejemplo que se muestra en esta guía de migración usa la clase DefaultAzureCredential cuando se implementa. En concreto, usa DefaultAzureCredential sin pasar el identificador de cliente de identidad administrada asignada por el usuario al constructor. En este escenario, la reserva consiste en comprobar la variable de entorno AZURE_CLIENT_ID. Si la variable de entorno AZURE_CLIENT_ID no existe, se usará una identidad administrada asignada por el sistema si está configurada.

Si pasa el identificador de cliente de identidad administrada en el constructor DefaultAzureCredential, el código de conexión se puede seguir usando en el entorno local y se puede implementar, ya que el proceso de autenticación vuelve a la autenticación interactiva en el escenario local. Para más información, consulte la biblioteca cliente de Azure Identity para Python.

Prueba de la aplicación

Pruebe la aplicación para asegurarse de que todo sigue funcionando. Los cambios pueden tardar unos minutos en propagarse a través del entorno de Azure.

Pasos siguientes

En este tutorial, ha aprendido a migrar una aplicación a conexiones sin contraseña.

Puede leer los siguientes recursos para explorar los conceptos que se describen en este artículo con más detalle: