FATAL: no pg_hba.conf entry for host "192.168.1.100", user "appuser", database "mydb"」というエラーが出てPostgreSQLへの接続が通らない。そんなトラブルに直面したことがあるエンジニアは少なくないはずです。PostgreSQLはすべての接続を pg_hba.conf(Host-Based Authentication)というファイルで管理しています。このファイルに一致するルールが存在しない限り、どれだけ正しいパスワードを入力しても接続は拒否されます。
この記事では、pg_hba.confの構造・認証方式の種類・scram-sha-256の設定手順を、RHEL 9.4 / Ubuntu 24.04 LTSの実環境出力例を交えて解説します。接続できない原因をFATALエラーメッセージ別に切り分けるフローも紹介します。
この記事のポイント
・pg_hba.confのエントリが一致しない限り接続は即拒否される
・PostgreSQL 10以降の推奨認証はscram-sha-256(md5は非推奨)
・接続FATALエラーはメッセージ文言で原因をすぐ特定できる
・設定変更後は再起動不要。pg_ctl reloadで即時反映できる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
「接続できない」の大半はpg_hba.confのルール不一致が原因
PostgreSQLが接続要求を受け取ると、まず pg_hba.conf の先頭から順にエントリを照合します。接続元のIPアドレス・対象データベース名・ユーザー名が合致するエントリを見つけた時点で、その行に書かれた認証方式(METHOD)でパスワードを検証します。問題は、合致するエントリが1つも見つからない場合です。この場合、PostgreSQLはパスワードの正否に関係なく即座に接続を拒否し、ログに以下のメッセージを記録します。
2026-08-23 10:15:43.821 JST [2894] FATAL: no pg_hba.conf entry for host "192.168.1.100", user "appuser", database "mydb", SSL off
pg_hba.confの場所と基本構造
1. ファイルの場所を確認する
pg_hba.confのパスはPostgreSQLのバージョンとディストリビューションによって変わります。正確なパスは psql 接続後に以下のSQLコマンドで確認するのが確実です。# psqlで接続してから実行 SHOW hba_file;
postgres=# SHOW hba_file; hba_file ------------------------------------- /var/lib/pgsql/16/data/pg_hba.conf (1 row)
postgres=# SHOW hba_file; hba_file -------------------------------------- /etc/postgresql/16/main/pg_hba.conf (1 row)
2. ファイルの基本構造を理解する
pg_hba.confは1エントリ1行の形式で、先頭から順に照合されます。RHEL 9.4のデフォルト設定を例に見ていきましょう。# TYPE DATABASE USER ADDRESS METHOD # # "local" は UNIXドメインソケット接続のみ local all all peer # IPv4ローカル接続: host all all 127.0.0.1/32 scram-sha-256 # IPv6ローカル接続: host all all ::1/128 scram-sha-256
・TYPE: 接続種別。
local(UNIXソケット)、host(TCP/IP)、hostssl(SSL必須)、hostnossl(SSL不可)・DATABASE: 接続先データベース。
allで全DB、または特定のDB名・USER: 接続ユーザー。
allで全ユーザー、または特定のユーザー名・ADDRESS: 接続元IPアドレス(CIDR形式)。
localタイプでは省略・METHOD: 認証方式。次のセクションで詳しく解説します
エントリは先頭行から順に照合され、最初にマッチした行が使われます。それ以降のエントリは評価されません。この「最初マッチ優先」の仕組みが、設定ミスの多くを生み出す原因にもなります。
認証方式(METHOD)の種類と選び方
scram-sha-256(推奨・PostgreSQL 10以降)現在の標準的な認証方式。SHA-256ベースのチャレンジレスポンス認証で、パスワードがネットワーク上に平文で流れません。PostgreSQL 14以降ではデフォルトの認証方式として採用されており、新規環境ではこれを選ぶのが正解です。
md5(旧来の方式・非推奨)
MD5ハッシュ認証。後方互換性のために残っていますが、現代の環境では使わないことを推奨します。古いクライアントライブラリとの互換性が必要な特別な事情がない限り、scram-sha-256に置き換えましょう。
peer(ローカルUNIXソケット専用)
OSのユーザー名とPostgreSQLのロール名が一致していることを確認する方式。
localタイプのエントリでのみ使用できます。Linuxサーバー上で sudo -u postgres psql がパスワードなしで動くのはこの仕組みのおかげです。trust(開発環境限定・本番禁止)
パスワードなしで接続を許可します。ローカル開発環境でのみ使用を検討する方式であり、ネットワーク越しのエントリに
trust を設定することは重大なセキュリティリスクになります。reject(明示的な接続拒否)
マッチした接続を無条件に拒否します。特定のIPからの接続を全てブロックしたい場合に、より広いマッチルールより前の行に配置して使います。
scram-sha-256認証を設定する手順
「アプリサーバー(192.168.1.50)から "appuser" で "mydb" データベースに接続したい」という実務でよくあるケースを例に手順を解説します。1. 現在のpg_hba.confの設定を確認する
編集前に現状を把握します。postgresユーザーに切り替えてからpg_hba_file_rules ビューで確認するのが確実です。# rootからpostgresユーザーへ切り替え sudo -i -u postgres # 現在有効なルール一覧を確認 psql -c "SELECT line_number, type, database, user_name, address, auth_method FROM pg_hba_file_rules ORDER BY line_number;"
line_number | type | database | user_name | address | auth_method -------------+-------+----------+-----------+-----------+---------------- 1 | local | {all} | {all} | | peer 2 | host | {all} | {all} | 127.0.0.1 | scram-sha-256 3 | host | {all} | {all} | ::1 | scram-sha-256 (3 rows)
2. バックアップを取ってからpg_hba.confを編集する
# RHEL 9.4の場合 cp /var/lib/pgsql/16/data/pg_hba.conf /var/lib/pgsql/16/data/pg_hba.conf.bak.$(date +%Y%m%d) # Ubuntu 24.04 LTSの場合 cp /etc/postgresql/16/main/pg_hba.conf /etc/postgresql/16/main/pg_hba.conf.bak.$(date +%Y%m%d)
# アプリサーバー(192.168.1.0/24)から mydb へ appuser が scram-sha-256 で接続するのを許可 host mydb appuser 192.168.1.0/24 scram-sha-256
host all all 192.168.1.0/24 scram-sha-256
/32 を付けます(例: 192.168.1.50/32)。3. 設定をリロードして接続テストする
pg_hba.confの変更はPostgreSQLの再起動なしに反映できます。# RHEL 9.4(systemd経由) sudo systemctl reload postgresql-16 # Ubuntu 24.04 LTS(pg_ctlcluster経由) sudo pg_ctlcluster 16 main reload # またはpsqlから直接 sudo -u postgres psql -c "SELECT pg_reload_conf();"
# アプリサーバーから接続テスト(DBサーバーIPが192.168.1.10の例) psql -h 192.168.1.10 -U appuser -d mydb Password for user appuser: psql (16.4) Type "help" for help. mydb=>
mydb=> が表示されれば接続成功です。接続できない原因のエラーメッセージ別切り分け
PostgreSQLのエラーは、クライアント側の出力とサーバーログの両方を確認するのが基本です。journalctl -u postgresql-16 --since "5 minutes ago" でサーバー側のログを確認しながら、メッセージ別の原因を特定しましょう。1. FATAL: no pg_hba.conf entry for host...
原因: 接続元のIPアドレス・データベース・ユーザーのいずれかが pg_hba.conf のどのエントリにも合致していない。対処: pg_hba.conf に適切なエントリを追加し、pg_ctl reload を実行する。前述の「scram-sha-256認証を設定する手順」を参照してください。
2. FATAL: password authentication failed for user "xxx"
原因1: パスワードが間違っている。対処1:
ALTER USER appuser WITH PASSWORD 'newpassword'; でパスワードをリセットする。原因2: pg_hba.confのMETHODが
scram-sha-256 なのに、PostgreSQL内のパスワードハッシュが古い md5 形式のままになっている。対処2: パスワードを再設定することで、現在の
password_encryption 設定に従った形式で保存し直されます。# ハッシュ形式の確認 sudo -u postgres psql postgres=# SELECT rolname, left(rolpassword, 20) AS passwd_type FROM pg_authid WHERE rolname = 'appuser'; rolname | passwd_type ---------+--------------------- appuser | SCRAM-SHA-256$4096: (1 row) # md5... で始まっていたらパスワードを再設定してscram形式に変換 postgres=# ALTER USER appuser WITH PASSWORD '新しいパスワード'; ALTER ROLE
3. FATAL: Peer authentication failed for user "xxx"
原因:localタイプのエントリのMETHODが peer に設定されているが、接続しようとしているOSユーザー名とPostgreSQLロール名が一致していない。対処: OSユーザー名と一致するPostgreSQLロールを作成するか、pg_hba.confの
local エントリのMETHODを scram-sha-256 に変更してパスワード認証に切り替える。4. could not connect to server: Connection refused
原因1: PostgreSQLサービスが停止している。対処1:
systemctl status postgresql-16 でサービスの状態を確認し、停止していれば起動する。原因2: PostgreSQLがポート5432で待ち受けていない、またはファイアウォールでブロックされている。ssコマンドでサーバー側のポート状態を確認しましょう。Linux ポート確認の全コマンドを参考にしてください。
# PostgreSQLがポート5432で待ち受けているか確認 sudo ss -tlnp | grep 5432 # 出力例(待ち受け中) LISTEN 0 128 0.0.0.0:5432 0.0.0.0:* users:(("postgres",pid=1523,fd=5))
listen_addresses が localhost のまま(デフォルト)で外部からの接続を受け付けていない。対処3: postgresql.confを編集して
listen_addresses = '*' に変更後、PostgreSQLを再起動する。この設定はreloadでは反映されない点に注意してください。# listen_addressesの現在の設定を確認 sudo -u postgres psql -c "SHOW listen_addresses;" listen_addresses ------------------ localhost (1 row) # postgresql.conf を編集して '*' に変更後、再起動(reload不可) sudo systemctl restart postgresql-16
5. FATAL: role "xxx" does not exist
原因: pg_hba.confのルールは正しいが、指定したロール名がPostgreSQLに存在しない。対処:
CREATE ROLE appuser WITH LOGIN PASSWORD 'password'; でロールを作成する。よくある設定パターン早見表
実務でよく使うpg_hba.confの設定パターンをまとめます。パターン1: ローカルホストのみ(アプリとDBが同一サーバー)
local all postgres peer local all all scram-sha-256 host all all 127.0.0.1/32 scram-sha-256 host all all ::1/128 scram-sha-256
host mydb appuser 192.168.1.50/32 scram-sha-256
host all all 192.168.10.0/24 scram-sha-256
hostssl all all 0.0.0.0/0 scram-sha-256
# 先頭でrejectしてから社内セグメントを許可(先頭行優先のルールを活用) host all all 203.0.113.99/32 reject host all all 192.168.1.0/24 scram-sha-256
設定ミスを防ぐための確認手順
pg_hba_file_rules ビューでリロード後の有効ルールを確認するファイルを直接読まなくても、PostgreSQLが現在読み込んでいるルールをビューで確認できます。
error 列に値が入っている行は書式が不正です。sudo -u postgres psql -c " SELECT line_number, type, database, user_name, address, auth_method, error FROM pg_hba_file_rules ORDER BY line_number;"
# RHEL 9.4の場合 sudo journalctl -u postgresql-16 --since "1 minute ago" # 正常なリロード時のログ Aug 23 10:20:05 dbserver postgres[1423]: LOG: received SIGHUP, reloading configuration files
本記事のまとめ
| やりたいこと | コマンド・設定 |
|---|---|
| pg_hba.confのパスを確認する | SHOW hba_file; |
| 現在有効なルール一覧を確認する | SELECT * FROM pg_hba_file_rules; |
| ネットワーク接続をscram-sha-256で許可する | host DB USER IPアドレス/CIDR scram-sha-256 |
| 設定をリロードする(再起動不要) | systemctl reload postgresql-16 |
| パスワードをscram-sha-256形式で再設定する | ALTER USER ユーザー名 WITH PASSWORD 'パスワード'; |
| 外部接続を受け付ける設定(要再起動) | listen_addresses = '*'(postgresql.conf) |
reject)より後ろに書いてしまうと効かないことがあります。エントリの順番を意識して設定を組み立てることが、接続問題を防ぐ最大のポイントです。
Linux Master Pro Seminar の詳細を見る >>
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:psqlでロールとデータベースを管理する方法|postgresユーザーへの切り替えと権限付与の基本
- この記事の属するカテゴリ:データーベース管理へ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます