FATAL: Peer authentication failed for user "postgres" は、「OS のユーザー名」と「接続しようとした DB のユーザー名(ロール)」が違うため、peer 認証で断られたエラーです。 Ubuntu・Debian の apt で入れた PostgreSQL では、ソケット接続(psql に -h を付けない接続)が peer 認証になっています。

すぐに試す方法 コマンド
postgres として入りたい sudo -u postgres psql(OS の postgres ユーザーになって接続)
アプリのユーザーで、パスワードで入りたい psql -h localhost -U appuser -d appdb(-h を付けると TCP 接続になり、パスワード認証になる)

ログインのエラーは、メッセージで原因が分かれます。

エラー(FATAL の後ろ) 意味 直し方
Peer authentication failed for user "postgres" OS のユーザー名と DB のロール名が違う(peer 認証) sudo -u postgres psql、または -h localhost でパスワード認証にする
password authentication failed for user "appuser" パスワードが違う、またはロールにパスワードが無い ALTER ROLE ... PASSWORD で設定し直す
no pg_hba.conf entry for host "192.0.2.2", user ... 接続元・DB・ユーザーに合う行が pg_hba.conf に無い pg_hba.conf に行を足して再読み込み
role "dev" does not exist -U を付けず、OS のユーザー名(dev)のロールを探した -U でロールを指定する、またはロールを作る
database "appuser" does not exist -d を付けず、ロール名と同じ DB を探した -d で DB を指定する
fe_sendauth: no password supplied パスワードが要る接続で、パスワードを渡していない -W で入力、または ~/.pgpass

確認環境:Ubuntu 24.04、PostgreSQL 16.15(apt でインストール)(確認日 2026年10月10日)。OS の一般ユーザー(dev)と postgres ユーザー、ソケット接続と TCP 接続、別のネットワーク(Docker のネットワーク)からの接続で再現しました。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「Peer authentication failedの直し方|PostgreSQL」

再現:同じ psql でも、誰が・どう接続するかで結果が変わる

== OS の一般ユーザー dev で、postgres として(ソケット接続)
$ psql -U postgres
psql: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed:
  FATAL:  Peer authentication failed for user "postgres"

== OS の postgres ユーザーで
$ sudo -u postgres psql -c "select current_user"
 postgres                                         ← 入れた

== dev で、-U を付けずに
$ psql
FATAL:  role "dev" does not exist

== dev で、-h localhost を付けて(TCP 接続)
$ psql -h localhost -U postgres
fe_sendauth: no password supplied                 ← peer ではなく、パスワード認証に変わった

この違いは、pg_hba.conf の行で決まっています。Ubuntu の初期状態は次のとおりです(コメントを除いたもの)。

# TYPE  DATABASE        USER            ADDRESS                 METHOD
local   all             postgres                                peer
local   all             all                                     peer
host    all             all             127.0.0.1/32            scram-sha-256
host    all             all             ::1/128                 scram-sha-256
列 意味
TYPE local はソケット接続(-h なし)、host は TCP 接続(-h localhost など)
DATABASE・USER どの DB に、どのロールで接続するときの行か(all はすべて)
ADDRESS 接続元の IP アドレスの範囲(local の行には無い)
METHOD 認証のしかた。peer(OS のユーザー名)、scram-sha-256(パスワード)、trust(無条件で許可)

-h なしは local の行(peer)、-h localhost は host の行(scram-sha-256)に当たるので、結果が変わります。

サーバーのログに「どの行に当たったか」が出る

原因が分からないときは、サーバーのログを見ます(Ubuntu は /var/log/postgresql/postgresql-16-main.log)。何行目のどの設定に当たったかが書かれています。

LOG:  provided user name (postgres) and authenticated user name (dev) do not match
FATAL:  Peer authentication failed for user "postgres"
DETAIL:  Connection matched file "/etc/postgresql/16/main/pg_hba.conf" line 118:
         "local   all             postgres                                peer"

provided user name(指定したロール)が postgres、authenticated user name(OS のユーザー)が dev で、一致しないため断られたことが分かります。

直し方1:postgres は peer のまま、アプリ用のロールを作る(おすすめ)

postgres は管理用として sudo -u postgres psql で使い、アプリや自分の作業には、パスワードを持つ別のロールを作ります。

-- sudo -u postgres psql で入って
CREATE ROLE appuser LOGIN PASSWORD '強いパスワード';
CREATE DATABASE appdb OWNER appuser;
$ psql -h localhost -U appuser -d appdb -c "select current_user, inet_server_addr()"
 appuser | 127.0.0.1                                ← TCP 接続、パスワードで入れた

$ psql -U appuser -d appdb
FATAL:  Peer authentication failed for user "appuser" ← -h なしは peer のまま

アプリ(JDBC・Python・Node.js など)は TCP で接続するので、host の行(scram-sha-256)に当たり、このままで接続できます。

自分の OS ユーザーと同じ名前のロールを作る方法

OS のユーザー名と同じ名前のロールなら、peer のまま psql だけで入れます。

CREATE ROLE dev LOGIN;
CREATE DATABASE dev OWNER dev;
$ psql -c "select current_user"
 dev

直し方2:ソケット接続もパスワード認証にする

psql -U appuser(-h なし)でもパスワードで入りたいときは、pg_hba.conf の local all all の行を変えます。postgres の行(local all postgres peer)は残します。残しておけば、sudo -u postgres psql は今までどおり使えます。

# /etc/postgresql/16/main/pg_hba.conf
local   all             postgres                                peer
local   all             all                                     scram-sha-256   ← peer から変更
SELECT pg_reload_conf();   -- 再読み込み(再起動しなくてよい)
$ PGPASSWORD=... psql -U appuser -d appdb -c "select current_user"
 appuser                                          ← ソケット接続でもパスワードで入れた
$ psql -U postgres
FATAL:  Peer authentication failed for user "postgres"   ← postgres は peer のまま
$ sudo -u postgres psql -c "select 'ok'"
 ok
変え方 結果
local all all を scram-sha-256 に 一般のロールはソケットでもパスワードで入れる。postgres は peer のまま
local all postgres も変える postgres にもパスワードが要る。パスワードを設定していないと sudo -u postgres psql でも入れなくなる
trust にする パスワードなしで誰でも入れる。検証用のマシン以外では使わない

別のサーバー・コンテナから接続する:no pg_hba.conf entry

$ psql -h 172.17.0.1 -U appuser -d appdb
FATAL:  no pg_hba.conf entry for host "192.0.2.2", user "appuser", database "appdb", no encryption

host "192.0.2.2" は、PostgreSQL から見た接続元です。この範囲の行を足します。

host    appdb           appuser         192.0.2.0/24            scram-sha-256
確認すること 内容
listen_addresses 初期値は localhost。他のマシンから接続するなら、postgresql.conf で待ち受けるアドレスを設定し、再起動(再読み込みでは変わらない)
pg_hba.conf の行 接続元・DB・ロールに合う host の行。変更後は SELECT pg_reload_conf();

listen_addresses が localhost のままだと、エラーは Connection refused になります(接続そのものが届かない)。確認環境でも、変更前は Connection refused、待ち受けを広げたあとに no pg_hba.conf entry、行を足して再読み込みしたあとに接続できました。

pg_hba.conf の注意点

上から順に見て、最初に合った行だけを使う

PostgreSQL は pg_hba.conf を上から順に見て、最初に合った行で認証します。認証に失敗しても、次の行は試しません(公式マニュアル)。

確認環境で、host all all 127.0.0.1/32 scram-sha-256 の下に host all appuser 127.0.0.1/32 trust を足しても、パスワードなしでは入れませんでした(fe_sendauth: no password supplied)。上の行が先に合うためです。特定のロールだけ扱いを変えるなら、その行を上に書きます。

再読み込みの前に、書き間違いを確かめる

SELECT line_number, type, database, user_name, auth_method, error
FROM pg_hba_file_rules
WHERE error IS NOT NULL;
 line_number |                  error
-------------+------------------------------------------
         134 | invalid CIDR mask in address "10.0.0.0/33"

pg_hba_file_rules は今のファイルの中身を読んで表示するので、再読み込みの前に確認できます。書き間違いがあるまま pg_reload_conf() を実行すると、ログに pg_hba.conf was not reloaded と出て、以前の設定のまま動き続けました(サーバーは止まらない)。直したのに変わらないときは、ログを確認します。

password authentication failed:md5 で保存されたパスワード

以前の版の PostgreSQL から移したロールなどで、パスワードが md5 の形式で保存されていると、scram-sha-256 の行では正しいパスワードでも入れません。

FATAL:  password authentication failed for user "oldmd5"
DETAIL:  User "oldmd5" does not have a valid SCRAM secret.
-- 保存形式の確認(postgres で)
SELECT rolname, left(rolpassword, 14) FROM pg_authid WHERE rolname = 'oldmd5';
--  oldmd5 | md5cae99c68428          ← md5 の形式

-- 同じパスワードを設定し直すと、今の形式(scram-sha-256)で保存される
ALTER ROLE oldmd5 PASSWORD '同じパスワード';
--  SCRAM-SHA-256$...               ← これで入れた

Docker の PostgreSQL

公式の postgres イメージでは、POSTGRES_PASSWORD は必須です。また、これらの環境変数はデータの保存先が空のときだけ効きます。一度起動したあとに docker-compose.yml のパスワードを変えても、以前のパスワードのままです。

状況 直し方
パスワードを変えたのに入れない 以前のパスワードで入り ALTER ROLE で変える。データを消してよいならボリュームを削除して作り直す
アプリのコンテナから入れない 接続先のホストは localhost ではなくサービス名
POSTGRES_HOST_AUTH_METHOD=trust パスワードなしで誰でも入れる設定。公式でも推奨されていない

確認の手順(チェックリスト)

順番 確認すること 方法
1 エラーの種類 上の表で、peer・password・no entry・role・database を見分ける
2 -h を付けたかどうか なしは local(peer)、ありは host(パスワード)
3 当たった行 サーバーのログの Connection matched ... line N
4 pg_hba.conf の書き間違い pg_hba_file_rules の error 列
5 変更の反映 SELECT pg_reload_conf();、listen_addresses は再起動
6 パスワードの保存形式 does not have a valid SCRAM secret なら設定し直す

よくある質問

Q. postgres のパスワードは何ですか。 A. Ubuntu の apt 版では、postgres にパスワードは設定されていません。sudo -u postgres psql で入ります。パスワードで入りたいなら ALTER ROLE postgres PASSWORD '...' で設定しますが、アプリ用には別のロールを作るほうが安全です。

Q. pgAdmin や DBeaver から入れません。 A. これらのツールは TCP で接続するため、peer ではなく host の行が使われます。パスワードを設定したロールで接続し、no pg_hba.conf entry と出るなら接続元の行を足します。

Q. pg_hba.conf はどこにありますか。 A. sudo -u postgres psql -c "show hba_file" で表示できます。Ubuntu では /etc/postgresql/16/main/pg_hba.conf です。

まとめ

  • peer 認証は OS のユーザー名とロール名が同じときだけ通る。postgres は sudo -u postgres psql
  • -h なしは local(peer)、-h localhost は host(パスワード)の行に当たる
  • アプリ用のロールを作ってパスワードで接続するのが基本。postgres の行は peer のまま残す
  • pg_hba.conf は上から最初に合った行だけを使う。変更後は pg_reload_conf()
  • ログの Connection matched ... line N と pg_hba_file_rules で、どの行が効いているかを確かめる
  • Docker の POSTGRES_PASSWORD は、データが空のときだけ効く

参考・出典

確認日はいずれも 2026年10月10日です。

  • PostgreSQL 16 Documentation「The pg_hba.conf File」:https://www.postgresql.org/docs/16/auth-pg-hba-conf.html
  • Docker Hub「postgres(Official Image)」:https://hub.docker.com/_/postgres

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「Peer authentication failedの直し方|PostgreSQL」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?