1.

PostgreSQLのpg_hba.confの設定を反映させる方法

編集
この記事の要点
  • pg_hba.conf は PostgreSQL のクライアント認証設定ファイル
  • 変更を反映するには再起動不要SELECT pg_reload_conf(); でリロード可能
  • または pg_ctl reload / systemctl reload postgresql
  • 設定ファイルの場所は SHOW hba_file; で確認
  • 構文エラーがあるとリロード失敗、ログ確認

 

pg_hba.conf とは

PostgreSQL のクライアント認証ルールを記述するファイル (Host-Based Authentication)。「どのクライアント (IP) からどのユーザがどのデータベースに、どの認証方式でアクセス可能か」を定義します。

# pg_hba.conf の例
# TYPE  DATABASE  USER  ADDRESS         METHOD
local   all       all                   peer
host    all       all   127.0.0.1/32    scram-sha-256
host    all       all   ::1/128         scram-sha-256
host    mydb      app   192.168.1.0/24  scram-sha-256
host    all       all   0.0.0.0/0       reject  # 危険、参考のみ

変更を反映する 3 つの方法

方法 1: SQL でリロード(推奨・再起動不要)

-- psql で接続して実行
$ psql -U postgres

postgres=# SELECT pg_reload_conf();
 pg_reload_conf
----------------
 t
(1 row)

-- 結果が t (true) ならリロード成功
-- f (false) ならファイル構文エラー、ログ確認

方法 2: pg_ctl reload(コマンドライン)

# PostgreSQL データディレクトリを指定
$ sudo -u postgres pg_ctl reload -D /var/lib/postgresql/15/main
server signaled

# データディレクトリ不明な場合
$ sudo -u postgres pg_ctl reload

方法 3: systemd で reload

# Ubuntu/Debian
$ sudo systemctl reload postgresql
$ sudo systemctl reload postgresql@15-main  # バージョン別

# CentOS/RHEL
$ sudo systemctl reload postgresql-15

# 確認
$ sudo systemctl status postgresql

変更が反映されているか確認

-- 現在の認証設定を確認 (PostgreSQL 10+)
postgres=# SELECT * FROM pg_hba_file_rules;
 line_number | type  | database | user_name |  address  |          netmask           | auth_method | options | error
-------------+-------+----------+-----------+-----------+----------------------------+-------------+---------+-------
          84 | local | {all}    | {all}     |           |                            | peer        |         |
          86 | host  | {all}    | {all}     | 127.0.0.1 | 255.255.255.255            | scram-sha-256 |         |
          88 | host  | {all}    | {all}     | ::1       | ffff:ffff:ffff:ffff:...    | scram-sha-256 |         |
(3 rows)

-- error カラムが NULL でなければ構文エラー

-- 現在の hba ファイルパス
postgres=# SHOW hba_file;
        hba_file
-------------------------
 /etc/postgresql/15/main/pg_hba.conf

pg_hba.conf の主要要素

① TYPE(接続方式)

TYPE意味
localUnix ソケット接続(同一マシン内のみ)
hostTCP/IP(SSL あり/なし問わず)
hostsslSSL 接続のみ
hostnossl非 SSL 接続のみ
hostgssencGSSAPI 暗号化のみ (12+)

② METHOD(認証方式)

METHOD意味
trust認証なし(開発のみ、本番禁止)
reject常に拒否
scram-sha-256パスワード認証(推奨、PostgreSQL 10+)
md5古いパスワード認証(非推奨)
password平文パスワード(非推奨、SSL 必須)
peerOS ユーザ名と一致確認 (local のみ)
identident 経由のユーザ確認
certSSL クライアント証明書認証
ldapLDAP サーバで認証
radiusRADIUS 認証

よくある設定例

例 1: 開発環境(緩い)

# 開発用 - 全許可 (本番で絶対禁止)
local   all   all                   trust
host    all   all   127.0.0.1/32    trust
host    all   all   ::1/128         trust

例 2: 本番環境(厳格)

# 本番用
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

# アプリサーバから特定 DB のみ許可
hostssl mydb         app_user     10.0.1.0/24          scram-sha-256

# レプリケーション用
host    replication  repl_user    10.0.1.10/32         scram-sha-256

# その他は明示的に拒否
host    all          all          0.0.0.0/0            reject

リモート接続を許可する手順

  1. listen_addresses 設定: postgresql.conf で TCP リッスンを有効化(下記)
  2. pg_hba.conf に許可ルール追加(下記)
  3. リロード: SELECT pg_reload_conf();
  4. ファイアウォール: 5432 を許可(下記)

① postgresql.conf

# postgresql.conf
listen_addresses = '*'  # または '192.168.1.10'  特定 IP のみ
port = 5432

# 反映には PostgreSQL 再起動が必要
$ sudo systemctl restart postgresql

② pg_hba.conf

# pg_hba.conf
host    mydb   app   192.168.1.0/24   scram-sha-256

④ ファイアウォール

$ sudo ufw allow from 192.168.1.0/24 to any port 5432

トラブルシュート

接続エラー: FATAL: no pg_hba.conf entry for host

pg_hba.conf にそのクライアント IP のルールがない:

# 適切なルールを追加
host  mydb  app  192.168.1.50/32  scram-sha-256

# 反映
SELECT pg_reload_conf();

接続エラー: FATAL: password authentication failed

  • パスワードが違う
  • scram-sha-256 と md5 の不一致 (PostgreSQL 14+ はデフォルト scram)
  • SELECT rolname, rolpassword FROM pg_authid; で確認

リロードが効かない

-- ファイル構文エラー確認
SELECT * FROM pg_hba_file_rules WHERE error IS NOT NULL;

-- ログ確認
$ tail -f /var/log/postgresql/postgresql-15-main.log

関連記事

編集
Post Share
子ページ

子ページはありません

同階層のページ

同階層のページはありません