ぱと隊長日誌

ブログ運用もエンジニアとしての生き方も模索中

pg_hba.conf の変更は確立済みのコネクションに影響しない

PostgreSQL はクライアント認証の設定を pg_hba.conf ファイルで管理しています。このマニュアルには下記の記載があります。

pg_hba.confレコードは接続が試みられる度に順番に検査されます

21.1. pg_hba.confファイル

接続を試みる度に検査する、ということは、接続済みであれば検査されない、とも取れます。そして実際にそのような挙動となります。

PostgreSQL 15.3 で試してみます。

pg_hba.conf の一部を抜粋します。

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     trust

この設定であれば Unix ドメインソケットを使用する接続が可能です。

$ psql -d testdb

=# SELECT relname FROM pg_class LIMIT 1;
 relname
----------
 t_random
(1 row)

この後の検証のため、psql のコネクションは維持したままとします。

ここで、Unix ドメインソケットを使用する接続を拒否します。

まず、pg_hba.conf を書き換えます。

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     reject

次に、設定ファイルの再読み込みを実行します。

$ pg_ctl reload -D /usr/local/pgsql/data/

先ほどの psql のコネクションが引き続き利用可能かを確認します。

=# SELECT relname FROM pg_class LIMIT 1;
 relname
----------
 t_random
(1 row)

コネクションが切断されることなく、利用可能なことが分かりました。

続いて、psql を再接続してみます。

=# \q

$ psql -d testdb
psql: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: FATAL:  pg_hba.conf rejects connection for host "[local]", user "postgres", database "testdb", no encryption

pg_hba.conf の設定に従い、psql の再接続は拒否されました。

このように、pg_hba.conf の設定は接続を試みるタイミングで検査されます。確立済みの接続には影響しません。コネクションプーリングのように接続が維持された環境下で pg_hba.conf を検証するとき、この挙動は混乱の元になるかもしれません。pg_hba.conf が適用されるタイミングを意識しましょう。