- データベース
Peer authentication failedの直し方|PostgreSQL
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期連続の黒字決算。