Base de datos

FATAL: password authentication failed for user "..."

La contraseña es correcta y aun así se rechaza. En PostgreSQL el método de autenticación depende de desde dónde conectas, y eso lo decide pg_hba.conf.

pg_hba.conf se lee de arriba abajo y gana la primera línea que casa con el trío origen, base de datos y usuario. Una línea de más arriba puede estar aplicando un método distinto del que crees.

Qué comprobar, y en qué orden

En el orden en que lo miramos nosotros. No es un ranking de frecuencia: no publicamos estadísticas que no hemos medido.

  1. 1

    La línea que aplica no es la que piensas, y exige otro método.

    Comprobar

    sudo -u postgres psql -c "SELECT * FROM pg_hba_file_rules WHERE error IS NULL;"

    Corregir

    # Ajustar el orden o el método en pg_hba.conf y recargar:
    sudo systemctl reload postgresql
  2. 2

    La contraseña se guardó con un método distinto del que se exige ahora. Al pasar de md5 a scram-sha-256, las contraseñas antiguas dejan de validar hasta que se vuelven a establecer.

    Comprobar

    sudo -u postgres psql -c "SELECT rolname, substring(rolpassword,1,4) FROM pg_authid WHERE rolcanlogin;"

    Corregir

    sudo -u postgres psql -c "ALTER USER mi_usuario WITH PASSWORD 'la_nueva';"
  3. 3

    La contraseña que viaja no es la que crees. Un carácter especial dentro de una cadena de conexión hay que codificarlo como en una URL, y una variable PGPASSWORD antigua en el entorno gana a lo que escribes.

    Comprobar

    echo "${PGPASSWORD+PGPASSWORD está definida en el entorno}"
    grep -l . ~/.pgpass 2>/dev/null

    Corregir

    # Probar la contraseña aislada del resto, sin cadena de conexión:
    PGPASSWORD='la_contrasena' psql -h 127.0.0.1 -U mi_usuario -d mi_base -c 'SELECT 1;'
    # En una URL, @ : / y ? van codificados: 'p@ss' se escribe 'p%40ss'.
  4. 4

    Se editó pg_hba.conf y no se recargó la configuración.

    Comprobar

    sudo -u postgres psql -c "SELECT pg_conf_load_time();"

    Corregir

    sudo systemctl reload postgresql

Un detalle que ahorra tiempo

pg_hba_file_rules es la forma fiable de saber qué reglas está aplicando el servidor de verdad, incluidos los errores de sintaxis. Leer el fichero a mano lleva a conclusiones equivocadas cuando hay varias líneas que casan.

Los comandos de esta página se ejecutan en tu servidor y algunos modifican la configuración: léelos antes de pegarlos. Las rutas y los nombres de servicio varían entre distribuciones. Así se elabora este catálogo.