※この記事にはアフィリエイト広告(プロモーション)が含まれます。
パスワード認証に失敗すると、psql は次のメッセージを出します。
psql: error: connection to server at "localhost" (127.0.0.1), port 5432 failed: FATAL: password authentication failed for user "app"
パスワードの誤り、存在しないロール、パスワード未設定のロールのいずれでも、このメッセージは同じです。原因はクライアントには返らず、サーバーログに出ます。
この記事のログは PostgreSQL 18.6(Ubuntu 26.04 の標準パッケージ)で採りました。Ubuntu のサーバーログは /var/log/postgresql/postgresql-18-main.log です。
まず見る(結論)
サーバーログで、同じ時刻の FATAL の次にある DETAIL 行を見ます。
| DETAIL 行 | 原因 | 対処 |
|---|---|---|
Connection matched file ... line N だけ |
パスワードが違う | ALTER ROLE app PASSWORD '...' で設定し直す |
Role "ghost" does not exist. |
ロール名が違う | \du で名前を確かめる |
User "nopw" has no password assigned. |
パスワードが未設定 | ALTER ROLE nopw PASSWORD '...' |
User "oldmd5" does not have a valid SCRAM secret. |
パスワードが MD5 で保存されている | 同じパスワードで ALTER ROLE し直す |
Connection matched file ... line N は、どの pg_hba.conf の行で認証方式が決まったかを示します。どの行にも一致しなかった場合は別のエラー(no pg_hba.conf entry)になります。そちらは「PostgreSQLに外部から接続できない」で扱っています。
サーバーログの例
存在しないロール ghost で接続したときのログです。
ghost@appdb FATAL: password authentication failed for user "ghost"
ghost@appdb DETAIL: Role "ghost" does not exist.
Connection matched file "/etc/postgresql/18/main/pg_hba.conf" line 125: "host all all 127.0.0.1/32 scram-sha-256"
psql の画面にエラーが2回出たときは、サーバーログにも別の PID で2件残っていました。1回の psql の実行で、2回接続を試しています。
MD5 で保存されたパスワード
古いバージョンから移したロールは、パスワードが MD5 で保存されていることがあります。接続が pg_hba.conf の scram-sha-256 の行に一致すると、正しいパスワードでも失敗します。
SELECT rolname, left(rolpassword, 14) FROM pg_authid WHERE rolname IN ('app', 'oldmd5');
rolname | pw
---------+----------------
app | SCRAM-SHA-256$
oldmd5 | md527a253cd598
md5 で始まっていれば MD5 です。password_encryption が既定の scram-sha-256 のまま、同じパスワードで設定し直すと SCRAM で保存され、その後は接続できました。
ALTER ROLE oldmd5 PASSWORD 'OldPass#1';
PostgreSQL 18 では、MD5 でパスワードを設定すると次の警告が出ます。
WARNING: setting an MD5-encrypted password
DETAIL: MD5 password support is deprecated and will be removed in a future release of PostgreSQL.
Peer authentication failed
-h を付けずに psql を実行すると、Unix ソケットで接続します。Ubuntu の既定の pg_hba.conf では、ソケット接続は peer 認証です。
local all postgres peer
local all all peer
host all all 127.0.0.1/32 scram-sha-256
peer は、OS のユーザー名と接続するロール名が一致するかを見ます。パスワードは聞きません。root で psql -U postgres を実行すると失敗します。
psql: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: FATAL: Peer authentication failed for user "postgres"
サーバーログには、一致しなかった2つの名前が出ます。
LOG: provided user name (postgres) and authenticated user name (root) do not match
postgres で入るなら sudo -u postgres psql を使います。アプリ用のロールでパスワード認証するなら -h localhost を付けて、host の行に一致させます。
-U を付けないと、psql は OS のユーザー名をロール名に使います。root で psql とだけ打つと FATAL: role "root" does not exist になります。
認証以外で接続できないとき
次の2つは、認証が通った後で止まっています。
FATAL: database "nodb" does not exist
FATAL: permission denied for database "privdb"
DETAIL: User does not have CONNECT privilege.
2つ目は、REVOKE CONNECT ON DATABASE privdb FROM PUBLIC の後で、ロールに CONNECT を付けていないときに出ます。GRANT CONNECT ON DATABASE privdb TO app で直ります。
.pgpass が読まれない
パスワードを毎回入力したくない場合は、ホームディレクトリの .pgpass に書きます。
localhost:5432:appdb:app:AppPass#1
パーミッションが 0600 より広いと、psql は警告を出してファイルを無視します。
WARNING: password file "/root/.pgpass" has group or world access; permissions should be u=rw (0600) or less
psql: error: connection to server at "localhost" (127.0.0.1), port 5432 failed: fe_sendauth: no password supplied
chmod 600 ~/.pgpass の後は接続できました。ただし、1列目のホスト名は文字列として照合されます。localhost と書いたファイルでは、-h 127.0.0.1 で接続したときに読まれず、fe_sendauth: no password supplied になりました。