20.5. Autenticación por contraseña #

Existen varios métodos de autenticación basados en contraseña. Estos métodos funcionan de forma similar pero difieren en cómo se almacenan las contraseñas de los usuarios en el servidor y en cómo se envía la contraseña proporcionada por un cliente a través de la conexión.

scram-sha-256

El método scram-sha-256 realiza la autenticación SCRAM-SHA-256, tal y como se describe en RFC 7677. Se trata de un esquema de desafío-respuesta que evita el rastreo de contraseñas (sniffing) en conexiones no confiables y permite almacenar las contraseñas en el servidor en un formato criptográficamente cifrado (hashing) que se considera seguro.

Este es el más seguro de los métodos proporcionados actualmente, pero no es compatible con las bibliotecas cliente más antiguas.

md5

El método md5 utiliza un mecanismo personalizado de desafío-respuesta menos seguro. Evita el rastreo de contraseñas y evita almacenar las contraseñas en el servidor en texto claro, pero no ofrece ninguna protección si un atacante consigue robar el hash de la contraseña del servidor. Además, hoy en día el algoritmo de hash MD5 ya no se considera seguro frente a ataques decididos.

Para facilitar la transición del método md5 al nuevo método SCRAM, si se especifica md5 como método en pg_hba.conf pero la contraseña del usuario en el servidor está cifrada para SCRAM (ver más abajo), se elegirá automáticamente la autenticación basada en SCRAM en su lugar.

Warning

El soporte para contraseñas cifradas con MD5 está obsoleto y se eliminará en una futura versión de PostgreSQL. Consulta el texto de abajo para obtener detalles sobre cómo migrar a otro tipo de contraseña.

password

El método password envía la contraseña en texto claro y, por lo tanto, es vulnerable a ataques de rastreo de contraseñas. Debería evitarse siempre que sea posible. No obstante, si la conexión está protegida por cifrado SSL, password puede utilizarse de forma segura. (Aunque la autenticación por certificado SSL podría ser una mejor opción si se depende del uso de SSL).

Las contraseñas de la base de datos de PostgreSQL son independientes de las contraseñas de los usuarios del sistema operativo. La contraseña de cada usuario de la base de datos se almacena en el catálogo del sistema pg_authid. Las contraseñas se pueden gestionar con los comandos SQL CREATE ROLE y ALTER ROLE, por ejemplo, CREATE ROLE foo WITH LOGIN PASSWORD 'secret', o el comando de psql \password. Si no se ha configurado ninguna contraseña para un usuario, la contraseña almacenada es nula y la autenticación por contraseña siempre fallará para ese usuario.

La disponibilidad de los distintos métodos de autenticación basados en contraseña depende de cómo esté cifrada (o de forma más precisa, de cómo se le haya aplicado el hash a) la contraseña del usuario en el servidor. Esto se controla mediante el parámetro de configuración password_encryption en el momento en que se establece la contraseña. Si una contraseña se cifró utilizando la configuración scram-sha-256, entonces se puede utilizar para los métodos de autenticación scram-sha-256 y password (pero la transmisión de la contraseña se realizará en texto claro en este último caso). La especificación del método de autenticación md5 cambiará automáticamente al uso del método scram-sha-256 en este caso, como se ha explicado anteriormente, por lo que también funcionará. Si una contraseña se cifró utilizando la configuración md5, entonces solo se puede utilizar para las especificaciones del método de autenticación md5 y password (de nuevo, con la contraseña transmitida en texto claro en este último caso). (Las versiones anteriores de PostgreSQL permitían almacenar la contraseña en el servidor en texto claro. Esto ya no es posible). Para comprobar los hashes de contraseña almacenados actualmente, consulta el catálogo del sistema pg_authid.

Para actualizar una instalación existente de md5 a scram-sha-256, después de asegurarse de que todas las bibliotecas cliente en uso son lo suficientemente recientes como para soportar SCRAM, configura password_encryption = 'scram-sha-256' en postgresql.conf, haz que todos los usuarios establezcan contraseñas nuevas, y cambia las especificaciones del método de autenticación en pg_hba.conf a scram-sha-256.