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 が適用されるタイミングを意識しましょう。