pg_hba.confで接続認証を設計する方法|PostgreSQLに接続できない原因の切り分けとscram-sha-256設定

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtipsデーターベース管理 > pg_hba.confで接続認証を設計する方法|PostgreSQLに接続できない原因の切り分けとscram-sha-256設定
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で即時反映できる


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

「接続できない」の大半は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 にルールを追加する のが正しいアプローチです。

pg_hba.confの場所と基本構造

1. ファイルの場所を確認する

pg_hba.confのパスはPostgreSQLのバージョンとディストリビューションによって変わります。正確なパスは psql 接続後に以下のSQLコマンドで確認するのが確実です。

# psqlで接続してから実行 SHOW hba_file;

RHEL 9.4(PostgreSQL 16)での出力例:

postgres=# SHOW hba_file; hba_file ------------------------------------- /var/lib/pgsql/16/data/pg_hba.conf (1 row)

Ubuntu 24.04 LTS(PostgreSQL 16)での出力例:

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;"

RHEL 9.4での出力例:

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)

ネットワーク(192.168.1.x)からの接続ルールが存在しないことを確認できます。

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

注意点: ADDRESSフィールドは必ずCIDR表記で指定してください。単一ホストの場合は末尾に /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))

原因3: postgresql.confの listen_addresseslocalhost のまま(デフォルト)で外部からの接続を受け付けていない。
対処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

パターン2: アプリサーバーから特定データベースへの接続

host mydb appuser 192.168.1.50/32 scram-sha-256

パターン3: 社内ネットワークセグメント全体からの接続

host all all 192.168.10.0/24 scram-sha-256

パターン4: SSL必須の接続(外部からの接続を暗号化)

hostssl all all 0.0.0.0/0 scram-sha-256

パターン5: 特定IPからの接続を明示的に拒否してから許可

# 先頭で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

parse error が出ている場合はpg_hba.confの書式を見直し、バックアップから復元してください。

本記事のまとめ

やりたいこと コマンド・設定
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)
pg_hba.confのエントリは「最初マッチ優先」です。ルールを追加する際は、既存の拒否ルール(reject)より後ろに書いてしまうと効かないことがあります。エントリの順番を意識して設定を組み立てることが、接続問題を防ぐ最大のポイントです。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、20年以上の運用経験を持つ現役エンジニアがpg_hba.conf設定を含むLinuxサーバー上でのデータベース運用スキルを実践形式で教えます。
Linux Master Pro Seminar の詳細を見る >>

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。