PostgreSQL 10 min read

PostgreSQLの「password authentication failed」 ― サーバーログのDETAILで原因を分ける

※この記事にはアフィリエイト広告(プロモーション)が含まれます。

パスワード認証に失敗すると、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 になりました。

PostgreSQL をもっと深く知るための本

PostgreSQL実践入門 ──アーキテクチャ、運用監視、性能改善

技術評論社・2026年2月

アーキテクチャから運用監視・性能改善までを扱う。付録に PostgreSQL 18 の新機能と設定項目の差分がある。

Amazonで見る

[改訂3版]内部構造から学ぶPostgreSQL ―設計・運用計画の鉄則

技術評論社・2022年11月・PostgreSQL 14 ベース

内部構造の理解から、設計と運用計画の立て方を学ぶ。

Amazonで見る

Amazonのアソシエイトとして、FIRE SE は適格販売により収入を得ています。