pg_hba.confの場所を探すコマンド(show hba_file)

pg_hba.confはPostgreSQLのクライアント認証を設定するファイルで、どのホストからどのユーザーがどのデータベースに、どの認証方式で接続できるかを定義する。
postgresql.confと同様にOSやインストール方法によって配置場所が異なる。

稼働しているPostgreSQLが読み込んでいるpg_hba.confの場所を確認するには、psqlのプロンプトでshow hba_file;を実行する。

show hba_file;
               hba_file
--------------------------------------
 /var/lib/postgresql/data/pg_hba.conf
(1 row)

上記の例では/var/lib/postgresql/data/pg_hba.confに認証設定ファイルが見つかる。

hba_fileは起動中のPostgreSQLが実際に読み込んでいるパスを返すため、複数バージョンのPostgreSQLが同居する環境でも編集すべきファイルを間違えずに済む。

参考: 【PostgreSQL】postgresql.confの場所を探す(show config_file)

関連する設定ファイルの場所もまとめて確認する

pg_hba.confのほかに、OSのユーザー名とデータベースのユーザー名のマッピングを定義するpg_ident.confの場所もshow ident_file;で確認できる。設定ファイルの場所はpg_settingsからまとめて取得すると分かりやすい。

SELECT name, setting FROM pg_settings
WHERE name IN ('config_file', 'hba_file', 'ident_file', 'data_directory');

      name      |                 setting
----------------+------------------------------------------
 config_file    | /var/lib/postgresql/data/postgresql.conf
 data_directory | /var/lib/postgresql/data
 hba_file       | /var/lib/postgresql/data/pg_hba.conf
 ident_file     | /var/lib/postgresql/data/pg_ident.conf
(4 rows)

多くの環境では3つの設定ファイルがdata_directory直下に置かれる。ただしDebian系のパッケージでインストールした場合は/etc/postgresql/17/main/のようにdata_directoryと別の場所に配置されるため、hba_fileの値を直接確認する。

参考: 【PostgreSQL】SHOW ALLやpg_settingsで設定値を一覧・検索する

pg_hba_file_rulesで読み込み済みのルールを確認する

pg_hba_file_rulesビューを参照すると、PostgreSQLが解釈した認証ルールをfile_nameline_number付きで確認できる。ファイルの場所と中身を同時に把握したい場合に便利である。

SELECT rule_number, file_name, line_number, type, database, user_name, address, auth_method
FROM pg_hba_file_rules;

 rule_number |              file_name               | line_number | type  | database | user_name |  address  | auth_method
-------------+--------------------------------------+-------------+-------+----------+-----------+-----------+-------------
           1 | /var/lib/postgresql/data/pg_hba.conf |         117 | local | {all}    | {all}     |           | trust
           2 | /var/lib/postgresql/data/pg_hba.conf |         119 | host  | {all}    | {all}     | 127.0.0.1 | trust
           3 | /var/lib/postgresql/data/pg_hba.conf |         121 | host  | {all}    | {all}     | ::1       | trust
(3 rows)

PostgreSQL 16以降はpg_hba.confincludeディレクティブを使える。別ファイルを読み込んでいる場合、file_nameにはルールが書かれた実際のファイルのパスが入る。pg_hba.conf本体だけを見ても分からない設定を追う場合に役立つ。

記述ミスがある行はerrorカラムにエラー内容が入る。

SELECT line_number, error FROM pg_hba_file_rules WHERE error IS NOT NULL;

 line_number |                   error
-------------+-------------------------------------------
         130 | invalid authentication method "badmethod"
(1 row)

権限に関する注意

hba_fileの参照とpg_hba_file_rulesの参照にはスーパーユーザー権限が必要である。権限のないユーザーが実行するとエラーになる。

ERROR:  permission denied to examine "hba_file"
DETAIL:  Only roles with privileges of the "pg_read_all_settings" role may examine this parameter.

一般ユーザーにhba_fileを参照させる場合はpg_read_all_settingsロールを付与する。

GRANT pg_read_all_settings TO tarou;

なおpg_read_all_settingsではpg_hba_file_rulesビューを参照できないため、ビューを参照させる場合は別途GRANT SELECTが必要である。

psqlで接続できない場合の探し方

認証設定の不備でPostgreSQLに接続できずshow hba_file;を実行できない場合は、ファイルシステムから探す。

$ sudo find / -name pg_hba.conf 2>/dev/null
/var/lib/postgresql/data/pg_hba.conf

サーバプロセスの起動オプションからデータディレクトリを特定する方法もある。

$ ps -ef | grep "postgres -D"
postgres  1234     1  0 10:00 ?  00:00:01 /usr/lib/postgresql/17/bin/postgres -D /var/lib/postgresql/17/main

-Dで指定されたディレクトリがデータディレクトリである。pg_hba.confはその直下か、postgresql.confhba_fileで指定された場所にある。

編集後の反映

pg_hba.confの変更はPostgreSQLの再起動なしで反映できる。設定を読み込み直すにはpg_reload_conf()を実行する。

SELECT pg_reload_conf();
 pg_reload_conf
----------------
 t
(1 row)

pg_hba.confに記述ミスが1行でもあると、その行だけが無視されるのではなくファイル全体の読み込みが失敗する。サーバログには以下のように出力され、リロード前の設定がそのまま使われ続ける。

LOG:  invalid authentication method "badmethod"
CONTEXT:  line 129 of configuration file "/var/lib/postgresql/data/pg_hba.conf"
LOG:  /var/lib/postgresql/data/pg_hba.conf was not reloaded

pg_hba_file_rulesはディスク上のファイルを解析した結果を返すため、リロード前にerrorカラムを確認すれば読み込み失敗を未然に防げる。

参考: PostgreSQL: Documentation: The pg_hba.conf File