Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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 Database for PostgreSQL.
Las solicitudes de aplicación a Azure Database for PostgreSQL deben autenticarse. Azure Database for PostgreSQL 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 Database for PostgreSQL, proporciona un par de nombre de usuario y contraseña para conectar 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 PostgreSQL.
Autenticación de Microsoft Entra
La autenticación de Microsoft Entra es un mecanismo para conectarse a Azure Database for PostgreSQL mediante identidades definidas en Microsoft Entra ID. Con la autenticación de Microsoft Entra, puede administrar identidades de usuario de 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 permisos de base de datos mediante grupos externos (Id. de Microsoft Entra).
- La autenticación de Microsoft Entra usa usuarios de base de datos postgreSQL 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 Database for PostgreSQL.
Autenticación de PostgreSQL
Puede crear cuentas en PostgreSQL. Si decide usar contraseñas como credenciales para las cuentas, estas credenciales se almacenarán en la user tabla. Dado que estas contraseñas se almacenan en PostgreSQL, debe administrar la rotación de las contraseñas por su cuenta.
Aunque es posible conectarse a Azure Database for PostgreSQL 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 una 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 cadenas de conexión.
DefaultAzureCredential admite varios métodos de autenticación y determina automáticamente qué se debe usar en tiempo de ejecución. Este enfoque permite a la aplicación usar diferentes métodos de autenticación en entornos diferentes (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 requieren 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 se administra mediante la plataforma Azure y no requiere que aprovisione ni gire ningún secreto. Puede obtener más información sobre las identidades administradas en la documentación de información general .
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 AZ_POSTGRESQL_AD_NON_ADMIN_USERNAME=<YOUR_AZURE_AD_NON_ADMIN_USER_DISPLAY_NAME>
export AZ_LOCAL_IP_ADDRESS=<YOUR_LOCAL_IP_ADDRESS>
export CURRENT_USERNAME=$(az ad signed-in-user show --query userPrincipalName --output tsv)
Reemplace los marcadores de posición por los siguientes valores, que se usan en 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 postgreSQL. Debe ser único en Azure. -
<YOUR_AZURE_AD_NON_ADMIN_USER_DISPLAY_NAME>: nombre para mostrar del usuario que no es administrador de Microsoft Entra. Asegúrese de que el nombre es un usuario válido en el inquilino de Microsoft Entra. -
<YOUR_LOCAL_IP_ADDRESS>: la dirección IP del equipo local, desde la que ejecutará la aplicación Spring Boot. Una manera cómoda de encontrarlo es abrir whatismyip.akamai.com.
1) Configuración de Azure Database for PostgreSQL
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 Database for PostgreSQL, primero debe establecer el usuario administrador de Microsoft Entra. Solo un usuario administrador de Microsoft Entra puede crear o habilitar usuarios para la autenticación basada en identificadores de Microsoft Entra.
Para configurar un administrador de Microsoft Entra después de crear el servidor, siga los pasos descritos en Administración de roles de Microsoft Entra en Azure Database for PostgreSQL: servidor flexible.
Nota:
Servidor flexible de PostgreSQL puede crear varios administradores de Microsoft Entra.
2) Configuración de Azure Database for PostgreSQL para el desarrollo local
2.1) Configuración de una regla de firewall para la dirección IP local
Las instancias de Azure Database for PostgreSQL están protegidas de forma predeterminada. Tienen un firewall que no permite ninguna conexión entrante. Para poder usar la base de datos, debe agregar una regla de firewall que permita que la dirección IP local acceda al servidor de bases de datos.
Dado que configuró la dirección IP local al principio de este artículo, puede abrir el firewall del servidor ejecutando el siguiente comando:
az postgres flexible-server firewall-rule create \
--resource-group $AZ_RESOURCE_GROUP \
--name $AZ_DATABASE_SERVER_NAME \
--rule-name $AZ_DATABASE_SERVER_NAME-database-allow-local-ip \
--start-ip-address $AZ_LOCAL_IP_ADDRESS \
--end-ip-address $AZ_LOCAL_IP_ADDRESS \
--output tsv
Si se conecta al servidor postgreSQL desde el subsistema de Windows para Linux (WSL) en un equipo Windows, debe agregar el identificador de host de WSL al firewall.
Para obtener la dirección IP de la máquina host, ejecute el siguiente comando en WSL:
cat /etc/resolv.conf
Copie la dirección IP que sigue al término nameservery, a continuación, use el siguiente comando para establecer una variable de entorno para la dirección IP de WSL:
export AZ_WSL_IP_ADDRESS=<the-copied-IP-address>
A continuación, use el siguiente comando para abrir el firewall del servidor en la aplicación basada en WSL:
az postgres flexible-server firewall-rule create \
--resource-group $AZ_RESOURCE_GROUP \
--name $AZ_DATABASE_SERVER_NAME \
--rule-name $AZ_DATABASE_SERVER_NAME-database-allow-local-ip \
--start-ip-address $AZ_WSL_IP_ADDRESS \
--end-ip-address $AZ_WSL_IP_ADDRESS \
--output tsv
2.2) Creación de un usuario que no es administrador de PostgreSQL y concesión de permiso
A continuación, cree un usuario que no sea administrador de Microsoft Entra y conceda todos los permisos en la $AZ_DATABASE_NAME base de datos. Puede cambiar el nombre $AZ_DATABASE_NAME de la base de datos para que se ajuste a sus necesidades.
Cree un script SQL denominado create_ad_user_local.sql para crear un usuario que no sea administrador. Agregue el siguiente contenido y guárdelo localmente:
cat << EOF > create_ad_user_local.sql
select * from pgaadauth_create_principal('$AZ_POSTGRESQL_AD_NON_ADMIN_USERNAME', false, false);
EOF
A continuación, use el siguiente comando para ejecutar el script SQL para crear el usuario que no es administrador de Microsoft Entra:
psql "host=$AZ_DATABASE_SERVER_NAME.postgres.database.azure.com user=$CURRENT_USERNAME dbname=postgres port=5432 password=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken) sslmode=require" < create_ad_user_local.sql
Ahora use el siguiente comando para quitar el archivo de script SQL temporal:
rm create_ad_user_local.sql
Nota:
Puede leer información más detallada sobre la creación de usuarios de PostgreSQL en Creación de usuarios en Azure Database for PostgreSQL.
3) Iniciar sesión y migrar el código de la aplicación para usar conexiones sin contraseña
Para el desarrollo local, asegúrese de que está autenticado con la misma cuenta de Microsoft Entra a la que asignó el rol en PostgreSQL. Puede autenticarse a través de la CLI de Azure, Visual Studio, Azure PowerShell u otras herramientas como IntelliJ.
Inicie sesión en Azure a través de la CLI de Azure mediante el comando siguiente:
az login
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.
Dentro del proyecto, agregue la siguiente referencia al
azure-identity-extensionspaquete. Esta biblioteca contiene todas las entidades necesarias para implementar conexiones sin contraseña.<dependency> <groupId>com.azure</groupId> <artifactId>azure-identity-extensions</artifactId> <version>1.0.0</version> </dependency>Habilite el complemento de autenticación de Azure PostgreSQL en la dirección URL de JDBC. Identifique las ubicaciones del código que actualmente crean un
java.sql.Connectionpara conectarse a Azure Database for PostgreSQL. Actualiceurlyuseren el archivo application.properties para que coincida con los siguientes valores:url=jdbc:postgresql://$AZ_DATABASE_SERVER_NAME.postgres.database.azure.com:5432/$AZ_DATABASE_NAME?sslmode=require&authenticationPluginClassName=com.azure.identity.extensions.jdbc.postgresql.AzurePostgresqlAuthenticationPlugin user=$AZ_POSTGRESQL_AD_NON_ADMIN_USERNAMEReemplace y
$AZ_POSTGRESQL_AD_NON_ADMIN_USERNAMElas dos$AZ_DATABASE_SERVER_NAMEvariables por el valor que configuró al principio de este artículo.
Ejecución local de la aplicación
Después de realizar estos cambios en el código, ejecute la aplicación localmente. La nueva configuración debe recoger las credenciales locales si ha iniciado sesión en un IDE compatible o una herramienta de línea de comandos, como la CLI de Azure, Visual Studio o IntelliJ. Los roles asignados al usuario de desarrollo local en Azure permitirán a la aplicación conectarse al servicio de Azure localmente.
4) Configuración del entorno de hospedaje de Azure
Una vez configurada la aplicación para usar conexiones sin contraseña y se ejecuta localmente, el mismo código se puede autenticar en los servicios de Azure después de implementarse en Azure. Por ejemplo, una aplicación implementada en una instancia de Azure App Service que tenga 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 PostgreSQL. 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.
En la página de información general principal de la instancia de Azure App Service, seleccione Identidad en el panel de navegación.
En la pestaña Asignado por el sistema , asegúrese de establecer el campo Estadoen activado. Azure administra internamente una identidad asignada por el sistema y controla las tareas administrativas. Los detalles e identificadores 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 Azure App Service 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 asignó para acceder a la instancia de PostgreSQL.
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.
Pruebas de la aplicación
Antes de implementar la aplicación en el entorno de hospedaje, debe realizar un cambio más en el código porque la aplicación se va a conectar a PostgreSQL mediante el usuario creado para la identidad administrada.
Actualice el código para usar el usuario creado para la identidad administrada:
Nota:
Si usó el comando Service Connector, omita este paso.
properties.put("user", "$AZ_POSTGRESQL_AD_MI_USERNAME");
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 postgreSQL. Tenga en cuenta que las asignaciones de roles pueden tardar varios minutos en propagarse a través del entorno de Azure. La aplicación ahora está configurada para ejecutarse localmente y en un entorno de producción sin que los desarrolladores tengan que administrar 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 descritos en este artículo con más detalle: