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

En este artículo se explica cómo migrar de métodos de autenticación tradicionales a conexiones sin contraseña más seguras con Azure SQL Database.

Las solicitudes de aplicación a Azure SQL Database deben autenticarse. Azure SQL Database proporciona varias maneras diferentes para que las aplicaciones se conecten de forma segura. Una de las maneras es usar contraseñas. Sin embargo, debe priorizar las conexiones sin contraseña en las aplicaciones siempre que sea posible.

Comparación de las opciones de autenticación

Cuando la aplicación se autentica con Azure SQL Database, proporciona un par de nombre de usuario y contraseña para conectarse a la base de datos. En función de dónde se almacenen las identidades, hay dos tipos de autenticación: autenticación de Microsoft Entra y autenticación de Azure SQL Database.

Autenticación de Microsoft Entra

La autenticación de Microsoft Entra es un mecanismo para conectarse a Azure SQL Database mediante identidades definidas en microsoft Entra ID. Con la autenticación de Microsoft Entra, puede administrar las identidades de los usuarios de la base de datos y otros servicios de Microsoft en una ubicación central, lo que simplifica la administración de permisos.

El uso de Microsoft Entra ID para la autenticación proporciona las siguientes ventajas:

  • Autenticación de usuarios en los servicios de Azure de forma uniforme.
  • Administración de directivas de contraseñas y rotación de contraseñas en un solo lugar.
  • Varias formas de autenticación admitidas por el identificador de Entra de Microsoft, que pueden eliminar la necesidad de almacenar contraseñas.
  • Los clientes pueden administrar los permisos de la base de datos con grupos externos (Microsoft Entra ID).
  • La autenticación de Microsoft Entra usa usuarios de azure SQL Database para autenticar identidades en el nivel de base de datos.
  • Compatibilidad con la autenticación basada en tokens para aplicaciones que se conectan a Azure SQL Database.

Autenticación de Azure SQL Database

Puede crear cuentas en Azure SQL Database. Si decide usar contraseñas como credenciales para las cuentas, estas credenciales se almacenarán en la tabla sys.database_principals. Dado que estas contraseñas se almacenan en Azure SQL Database, debe administrar la rotación de las contraseñas por su cuenta.

Aunque es posible conectarse a Azure SQL Database con contraseñas, debe usarlos con precaución. Debe ser diligente para no exponer nunca las contraseñas en una ubicación no segura. Cualquier persona que obtenga acceso a las contraseñas puede autenticarse. Por ejemplo, existe el riesgo de que un usuario malintencionado pueda acceder a la aplicación si un cadena de conexión se comprueba accidentalmente en el control de código fuente, se envía a través de un correo electrónico no seguro, pegado en el chat incorrecto o visto por alguien que no debe tener permiso. En su lugar, considere la posibilidad de actualizar la aplicación para usar conexiones sin contraseña.

Introducción a las conexiones sin contraseña

Con una conexión sin contraseña, puede conectarse a servicios de Azure sin almacenar credenciales en el código de la aplicación, sus archivos de configuración o en variables de entorno.

Muchos servicios de Azure admiten conexiones sin contraseña, por ejemplo a través de Azure Managed Identity. Estas técnicas proporcionan características de seguridad sólidas que puede implementar mediante DefaultAzureCredential desde las bibliotecas cliente de Azure Identity. En este tutorial, aprenderá a actualizar una aplicación existente para usarla DefaultAzureCredential en lugar de alternativas como cadena de conexión s.

DefaultAzureCredential admite varios métodos de autenticación y determina automáticamente qué se debe usar en tiempo de ejecución. Este enfoque permite que la aplicación use diferentes métodos de autenticación en distintos entornos (desarrollo local frente a producción) sin implementar código específico del entorno.

El orden y las ubicaciones en las que DefaultAzureCredential se buscan credenciales se pueden encontrar en la información general de la biblioteca de identidades de Azure. Por ejemplo, al trabajar localmente, DefaultAzureCredential normalmente se autenticará con la cuenta que el desarrollador usó para iniciar sesión en Visual Studio. Cuando la aplicación se implemente en Azure, DefaultAzureCredential cambiará automáticamente para usar una identidad administrada. No se necesitan cambios de código para esta transición.

Para asegurarse de que las conexiones no tienen contraseña, debe tener en cuenta tanto el desarrollo local como el entorno de producción. Si se requiere una cadena de conexión en cualquier lugar, la aplicación no tiene contraseña.

En el entorno de desarrollo local, puede autenticarse con la CLI de Azure, Azure PowerShell, Visual Studio o complementos de Azure para Visual Studio Code o IntelliJ. En este caso, puede usar esa credencial en la aplicación en lugar de configurar propiedades.

Al implementar aplicaciones en un entorno de hospedaje de Azure, como una máquina virtual, puede asignar una identidad administrada en ese entorno. A continuación, no tendrá que proporcionar credenciales para conectarse a los servicios de Azure.

Nota:

Una identidad administrada proporciona una identidad de seguridad para representar una aplicación o servicio. La identidad está administrada por la plataforma Azure y no requiere que aprovisione o rote los secretos. Puede obtener más información sobre las identidades administradas en la documentación de información general.

Nota:

Dado que el controlador JDBC para Azure SQL Database aún no admite conexiones sin contraseña desde entornos locales, este artículo solo se centrará en las aplicaciones implementadas en entornos de hospedaje de Azure y cómo migrarlas para usar conexiones sin contraseña.

Migración de una aplicación existente para usar conexiones sin contraseña

En los pasos siguientes se explica cómo migrar una aplicación existente para usar conexiones sin contraseña en lugar de una solución basada en contraseña.

0) Preparar el entorno de trabajo

En primer lugar, use el siguiente comando para configurar algunas variables de entorno.

export AZ_RESOURCE_GROUP=<YOUR_RESOURCE_GROUP>
export AZ_DATABASE_SERVER_NAME=<YOUR_DATABASE_SERVER_NAME>
export AZ_DATABASE_NAME=demo
export CURRENT_USERNAME=$(az ad signed-in-user show --query userPrincipalName --output tsv)
export CURRENT_USER_OBJECTID=$(az ad signed-in-user show --query id --output tsv)

Reemplace los marcadores de posición por los valores siguientes, que se usan a lo largo de este artículo:

  • <YOUR_RESOURCE_GROUP>: el nombre del grupo de recursos en el que se encuentran los recursos.
  • <YOUR_DATABASE_SERVER_NAME>: el nombre del servidor de Azure SQL Database. Debe ser único en Azure.

1) Configuración de Azure SQL Database

1.1) Habilitación de la autenticación basada en identificadores de Microsoft Entra

Para usar el acceso de Id. de Microsoft Entra con Azure SQL Database, debe establecer primero el usuario administrador de Microsoft Entra. Solo los usuarios administradores de Microsoft Entra pueden crear y habilitar usuarios para la autenticación basada en Microsoft Entra ID.

Si usa la CLI de Azure, ejecute el siguiente comando para asegurarse de que tiene permisos suficientes:

az login --scope https://graph.microsoft.com/.default

A continuación, ejecute el siguiente comando para establecer el administrador de Microsoft Entra:

az sql server ad-admin create \
    --resource-group $AZ_RESOURCE_GROUP \
    --server $AZ_DATABASE_SERVER_NAME \
    --display-name $CURRENT_USERNAME \
    --object-id $CURRENT_USER_OBJECTID

Este comando establecerá el administrador de Microsoft Entra en el usuario que ha iniciado sesión actual.

Nota:

Solo puede crear un administrador de Microsoft Entra por servidor de Azure SQL Database. La selección de otra sobrescribirá el administrador existente de Microsoft Entra configurado para el servidor.

2) Migración del código de la aplicación para usar conexiones sin contraseña

A continuación, siga estos pasos para actualizar el código para usar conexiones sin contraseña. Aunque conceptualmente es similar, cada lenguaje usa detalles de implementación diferentes.

  1. Dentro del proyecto, agregue la siguiente referencia al azure-identity paquete. Esta biblioteca contiene todas las entidades necesarias para implementar conexiones sin contraseña.

    <dependency>
         <groupId>com.azure</groupId>
         <artifactId>azure-identity</artifactId>
         <version>1.5.4</version>
    </dependency>
    
  2. Habilite la autenticación de identidad administrada de Microsoft Entra en la dirección URL de JDBC.v Identifique las ubicaciones del código que actualmente crean un java.sql.Connection para conectarse a Azure SQL Database. Actualice su código para que coincida con el ejemplo siguiente:

    String url = "jdbc:sqlserver://$AZ_DATABASE_SERVER_NAME.database.windows.net:1433;databaseName=$AZ_DATABASE_NAME;authentication=ActiveDirectoryMSI;"   
    Connection con = DriverManager.getConnection(url);
    
  3. Reemplace las dos $AZ_DATABASE_SERVER_NAME variables y una $AZ_DATABASE_NAME variable por los valores que configuró al principio de este artículo.

  4. Quite y userpassword de la dirección URL de JDBC.

3) Configuración del entorno de hospedaje de Azure

Una vez configurada la aplicación para usar conexiones sin contraseña, el mismo código se puede autenticar en los servicios de Azure después de implementarla en Azure. Por ejemplo, una aplicación implementada en una instancia de servicio de App de Azure que tiene asignada una identidad administrada puede conectarse a Azure Storage.

En esta sección, ejecutará dos pasos para permitir que la aplicación se ejecute en un entorno de hospedaje de Azure de forma sin contraseña:

  • Asigne la identidad administrada para el entorno de hospedaje de Azure.
  • Asigne roles a la identidad administrada.

Nota:

Azure también proporciona Service Connector, que puede ayudarle a conectar el servicio de hospedaje con SQL Server. Con Service Connector para configurar el entorno de hospedaje, puede omitir el paso de asignar roles a la identidad administrada porque Service Connector lo hará automáticamente. En la sección siguiente se describe cómo configurar el entorno de hospedaje de Azure de dos maneras: una a través de Service Connector y la otra configurando directamente cada entorno de hospedaje.

Importante

Los comandos de Service Connector requieren la CLI de Azure 2.41.0 o posterior.

Asignación de la identidad administrada mediante Azure Portal

En los pasos siguientes se muestra cómo asignar una identidad administrada asignada por el sistema para varios servicios de hospedaje web. La identidad administrada puede conectarse de forma segura a otros servicios de Azure mediante las configuraciones de aplicación que configuró anteriormente.

  1. En la página de información general principal de la instancia de servicio de App de Azure, seleccione Identidad en el panel de navegación.

  2. En la pestaña Asignado por el sistema, asegúrese de establecer el campo Estado en activado. Azure administra internamente una identidad asignada por el sistema y controla las tareas administrativas. Los detalles y los id. de la identidad nunca se exponen en el código.

También puede asignar una identidad administrada en un entorno de hospedaje de Azure mediante la CLI de Azure.

Puede asignar una identidad administrada a una instancia de servicio de App de Azure con el comando az webapp identity assign, como se muestra en el ejemplo siguiente:

export AZ_MI_OBJECT_ID=$(az webapp identity assign \
    --resource-group $AZ_RESOURCE_GROUP \
    --name <service-instance-name> \
    --query principalId \
    --output tsv)

Asignación de roles a la identidad administrada

A continuación, conceda permisos a la identidad administrada que creó para acceder a la base de datos SQL.

Si ha conectado los servicios mediante Service Connector, los comandos del paso anterior ya han asignado el rol, por lo que puede omitir este paso.

Prueba de la aplicación

Después de realizar estos cambios en el código, puede compilar y volver a implementar la aplicación. A continuación, vaya a la aplicación hospedada en el explorador. La aplicación debe poder conectarse correctamente a la base de datos de Azure SQL. Tenga en cuenta que las asignaciones de roles pueden tardar varios minutos en propagarse a través del entorno de Azure. Ahora la aplicación está configurada para ejecutarse localmente y en un entorno de producción sin que los desarrolladores tengan que administrar los secretos en la propia aplicación.

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: