Inicio » Cómo solucionar el error FATAL: password authentication failed for user en PostgreSQL
Sistemas y Servidores

Cómo solucionar el error FATAL: password authentication failed for user en PostgreSQL

El Diagnóstico Rápido

El error FATAL: password authentication failed for user ocurre en PostgreSQL cuando el servidor de base de datos rechaza la conexión de un cliente debido a una contraseña incorrecta, la falta de un método de autenticación válido en pg_hba.conf o una discrepancia entre el usuario del sistema operativo y el rol de PostgreSQL.

🔍 El Diagnóstico Rápido

Síntoma Causa Raíz Solución
psql: error: FATAL: password authentication failed for user "postgres" Contraseña incorrecta, usuario no existente o método de autenticación (scram-sha-256 / md5 / peer) desconfigurado en pg_hba.conf Acceder mediante el usuario local del sistema postgres con socket UNIX, restablecer la contraseña con ALTER USER y configurar pg_hba.conf

🚀 Cómo solucionar el error paso a paso

Paso 1: Conectarse como usuario del sistema postgres mediante socket local

En entornos Linux, el usuario superadministrador predeterminado de PostgreSQL (postgres) utiliza autenticación peer por defecto a través de sockets de UNIX locales. Accede directamente cambiando al usuario del sistema:

BASH
# Cambiar al usuario de sistema postgres e ingresar a psql
sudo -u postgres psql

Si el comando anterior funciona y te otorga acceso al prompt postgres=#, no hay ningún problema grave en el motor; el fallo se limita a la autenticación por contraseña vía TCP/IP.

Paso 2: Restablecer la contraseña del rol de PostgreSQL

Desde la consola interactiva psql, asigna una nueva contraseña segura para el rol afectado (por ejemplo, postgres o tu usuario de aplicación):

SQL
-- Cambiar la contraseña del usuario postgres
ALTER USER postgres WITH PASSWORD 'TuNuevaContraseniaSegura123!';

Sal de la consola con \q.

Paso 3: Configurar el archivo de autenticación pg_hba.conf

Abre el archivo de configuración de autenticación de clientes de PostgreSQL (pg_hba.conf). Puedes encontrar su ubicación exacta ejecutando SHOW hba_file; dentro de psql o buscando en /etc/postgresql/:

BASH
# Ejemplo para PostgreSQL 15/16 en Ubuntu/Debian
sudo nano /etc/postgresql/16/main/pg_hba.conf

Inspecciona las líneas de control de acceso para conexiones locales y TCP/IP (127.0.0.1/32 o ::1/128). Asegúrate de que utilicen scram-sha-256 o md5 en lugar de métodos restrictivos:

CONFIG
# TYPE  DATABASE        USER            ADDRESS                 METHOD
# Conexiones locales por socket de UNIX
local   all             postgres                                peer
local   all             all                                     md5

# Conexiones IPv4 en localhost (TCP/IP)
host    all             all             127.0.0.1/32            scram-sha-256

# Conexiones IPv6 en localhost
host    all             all             ::1/128                 scram-sha-256

Paso 4: Recargar la configuración de PostgreSQL

Aplica los cambios en pg_hba.conf recargando el servicio sin interrumpir las conexiones activas:

BASH
# Recargar la configuración en el servidor Linux
sudo systemctl reload postgresql

Prueba la conexión TCP pasando el parámetro -h localhost y -U postgres:

BASH
psql -h localhost -U postgres -W

Consejo de Prevención

Prácticas de seguridad recomendadas:

  • Utilizar scram-sha-256: Evita usar el método md5 en versiones modernas de PostgreSQL (13+), ya que scram-sha-256 ofrece mayor protección frente a ataques de fuerza bruta y sniffing de contraseñas.
  • Usar variables de entorno o .pgpass: Para scripts automatizados, almacena las credenciales en un archivo local ~/.pgpass con permisos 0600 en lugar de exponer contraseñas en texto plano dentro de la línea de comandos.
  • Verificar el archivo postgresql.conf: Si intentas conectarte de forma remota, asegúrate de que la directiva listen_addresses = '*' esté configurada además de permitir la subred en pg_hba.conf.