Cómo solucionar el error FATAL: password authentication failed for user en PostgreSQL
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
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.confpostgres con socket UNIX, restablecer la contraseña con ALTER USER y configurar pg_hba.confLa Solución Paso a Paso
-
1
Paso 1: Conectarse como usuario del sistema postgres mediante socket local
En entornos Linux, el usuario superadministrador predeterminado de PostgreSQL (
postgres) utiliza autenticaciónpeerpor 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 psqlSi 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. -
2
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,postgreso 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. -
3
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 ejecutandoSHOW hba_file;dentro depsqlo buscando en/etc/postgresql/:BASH# Ejemplo para PostgreSQL 15/16 en Ubuntu/Debian sudo nano /etc/postgresql/16/main/pg_hba.confInspecciona las líneas de control de acceso para conexiones locales y TCP/IP (
127.0.0.1/32o::1/128). Asegúrate de que utilicenscram-sha-256omd5en 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 -
4
Paso 4: Recargar la configuración de PostgreSQL
Aplica los cambios en
pg_hba.confrecargando el servicio sin interrumpir las conexiones activas:BASH# Recargar la configuración en el servidor Linux sudo systemctl reload postgresqlPrueba la conexión TCP pasando el parámetro
-h localhosty-U postgres:BASHpsql -h localhost -U postgres -W
Consejo de Prevención
Prácticas de seguridad recomendadas:
- Utilizar
scram-sha-256: Evita usar el métodomd5en versiones modernas de PostgreSQL (13+), ya quescram-sha-256ofrece 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~/.pgpasscon permisos0600en 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 directivalisten_addresses = '*'esté configurada además de permitir la subred enpg_hba.conf.