identやGSSAPIといった外部の認証システムを使用する場合は、接続を開始したオペレーティングシステムのユーザ名が接続先のデータベースユーザ(ロール)名と同じであるとは限りません。
ユーザ名マップを使用するには、pg_hba.conf
内でmap
=map-name
オプションを指定してください。
このオプションは、外部ユーザ名を受け取るすべての認証方式をサポートしています。
異なる接続に対して、異なるマップが必要となる可能性があります。そのため、それぞれの接続に対して使用されるマップを指定するために、使用するマップの名称はpg_hba.conf
内のmap-name
パラメータで指定されます。
ユーザ名マップはidentマップファイルに定義されています。デフォルトではファイル名はpg_ident.conf
で
クラスタのデータディレクトリに保存されています。(他の場所にも保存できますが、詳細はident_file設定パラメータを参照してください。)
identマップファイルは一般的な形式の行を含んでいます。
map-name
system-username
database-username
コメント、空白、行継続はpg_hba.conf
と同様に扱われます。 map-name
は
pg_hba.conf
内で参照される任意の名称です。
他の2つのフィールドは、どのオペレーティングシステムユーザが、どのデータベースユーザに接続することを許可されているかを指定しています。
同じmap-name
は、1つのマップ内でユーザをマップするために繰り返し使用されます。
どれだけのデータベースユーザがオペレーティングシステムのユーザに対して一致しているか、またその逆に対しても制限はありません。 よってマップ内のエントリは、それらが等しいというよりもむしろ 「このオペレーティングシステムのユーザはこのデータベースユーザとして接続する」という意味になります。 もし外部の認証システムから得られたユーザ名と接続要求を行ったデータベースユーザ名が対となるエントリがマップ内にある場合は、接続は許可されます。
もしsystem-username
フィールドがスラッシュ(/
)で始まっている場合は、
このフィールドの残りは正規表現として扱われます。
(PostgreSQLの正規表現構文の詳細については9.7.3.1を参照してください。)
正規表現は単一検索や括弧を使用した表現、database-username
フィールドで\1
(バックスラッシュ-1)で参照されるような表現を含みます。
これにより、1行で複数のユーザ名のマップが可能となり、簡単な構文で特に使いやすくなります。例を以下に示します。
mymap /^(.*)@mydomain\.com$ \1 mymap /^(.*)@otherdomain\.com$ guest
上記のエントリでは、@mydomain.com
で終わるシステムユーザ名のドメイン部分を削除して、
@otherdomain.com
で終わるシステムユーザ名がguest
としてログインすることを許可します。
デフォルトでは正規表現は、文字列の一部を一致させることに注意してください。
上記の例で示したように、システムユーザ名全体を強制的に一致させるために^
や$
を使用すると有用です。
pg_ident.conf
ファイルは起動時と、メインサーバのプロセスが
SIGHUPを受信したときに読み込まれます。
起動しているシステムで編集した場合は、ファイルを再読み込みするために(pg_ctl reload
の使用、SQL関数pg_reload_conf()
の呼び出し、またはkill -HUP
を使用して)postmasterにシグナルを送信する必要があります。
pg_ident.conf
ファイルは、pg_hba.conf
ファイルと結合して使用されます。
例 21.2に例 21.1の例があります。
この例では、192.168のネットワーク内のマシンにログインしている、
オペレーティングシステムのユーザ名でbryanh
、ann
、robert
以外の誰もが、アクセスを許可されていません。
Unixユーザrobert
はPostgreSQLユーザであるbob
として接続しようとした時のみ
アクセス可能で、 robert
や他の名前ではアクセスできません。
ann
はann
として接続した時のみ許可され、bryanh
はbryanh
自身もしくはguest1
として
アクセスが可能となります。
例21.2 pg_ident.conf
ファイルの例
# MAPNAME SYSTEM-USERNAME PG-USERNAME omicron bryanh bryanh omicron ann ann # bobはこれらのマシン内でrobertというユーザ名を持っています。 omicron robert bob # bryanhはguest1としても接続可能です。 omicron bryanh guest1