はじめに
にゃーん。趣味でポスグレをやっている者だ。
この記事はPostgreSQL 16 全部ぬこ Advent Calendar 2022 2日目の記事です。
今回はPostgreSQL 16に追加された、pg_hba.confに記述するユーザ名のちょっとした改善内容を書いてみます。
概要
項目 | 内容 |
---|---|
タイトル | make use of regular expressions for the username in pg_hba.conf |
Topic | Miscellaneous |
Last modified | 2022-10-24 |
ステータス | commited |
概要 |
pg_hba.onf のユーザ名に正規表現の指定を可能にする。 |
変更内容
PostgreSQLへの接続を制御するpg_hba.conf
ファイルのユーザ名(user_name)の記述に正規表現での記述を許容します。
正規表現で記述する場合には、先頭にスラッシュ(/
)をつけます。
動作例
ユーザ名に正規表現を使った簡単な例を示します。
ユーザとデータベースの設定
デフォルトユーザ(postgres)以外に、nuko, nuko_mike, nuko_tamaという一般ユーザが作成されているとします。
$ psql -U postgres postgres -c "\du"
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------------------+-----------
nuko | | {}
nuko_mike | | {}
nuko_tama | | {}
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
$
また、データベースnuko
が作成されているとします。
$ psql -U postgres postgres -c "SELECT datname FROM pg_database"
datname
-----------
postgres
nuko
template1
template0
(4 rows)
pg_hba.confの設定
pg_hba.conf
に接続設定を追加します。設定後、PostgreSQLサーバをリロードして、pg_hba_dile_rules
ビューで内容を確認します。
$ psql postgres -c "SELECT type, database, user_name FROM pg_hba_file_rules"
type | database | user_name
-------+----------+-------------
local | {nuko} | {/^nuko_.*}
local | {all} | {postgres}
(2 rows)
database=nukoのエントリのuser_nameの記述に注目。
ここに/^nuko_.*
という正規表現によるユーザ名の指定を書きます。
最初のスラッシュ(/
)は正規表現記述を示すもの(だと思います)。続いて書かれている文字列が正規表現文字列になります。
^nuko_.*
は、「先頭からnuko_
で始まり以降は任意の文字」を示します。
追加したユーザのうち、nuko_mike
とnuko_tama
はこの正規表現に合致するユーザ名となります。nuko
はこの正規表現には合致しません。
接続検証
この設定で、ユーザnuko
,nuko_mike
,nuko_tama
がデータベースnuko
に接続できるか確認します。
ユーザnuko
の場合、^nuko_.*
の正規表現には合致せず、他に合致するエントリがないので接続エラーとなります。
$ psql -U nuko nuko -c "SELECT 1"
2022-10-31 09:03:16.955 JST [354] FATAL: no pg_hba.conf entry for host "[local]", user "nuko", database "nuko", no encryption
psql: error: connection to server on socket "/tmp/.s.PGSQL.16001" failed: FATAL: no pg_hba.conf entry for host "[local]", user "nuko", database "nuko", no encryption
ユーザnuko_mike
,nuko_tama
は接続に成功します。
$ psql -U nuko_mike nuko -c "SELECT 1"
?column?
----------
1
(1 row)
$ psql -U nuko_tama nuko -c "SELECT 1"
?column?
----------
1
(1 row)
おわりに
pg_hba.conf
のユーザ名に正規表現が使えるようになることで、例えば接頭辞が同じで後ろが異なるユーザを特定のデータベースに接続可能にする、といったケースの記述が楽になるかもしれませんね。