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.
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.