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
include
file
include_if_exists
file
include_dir
directory
コメント、空白、行継続はpg_hba.conf
と同様に扱われます。 map-name
は
pg_hba.conf
内で参照される任意の名称です。
他の2つのフィールドは、どのオペレーティングシステムユーザが、どのデータベースユーザに接続することを許可されているかを指定しています。
同じmap-name
は、1つのマップ内でユーザをマップするために繰り返し使用されます。
pg_hba.conf
に関しては、同じ規則に従って、このファイルの行にincludeディレクティブを書くことができます。
どれだけのデータベースユーザがオペレーティングシステムのユーザに対して一致しているか、またその逆に対しても制限はありません。
よってマップ内のエントリは、それらが等しいというよりもむしろ「このオペレーティングシステムのユーザはこのデータベースユーザとして接続する」という意味になります。
もし外部の認証システムから得られたユーザ名と接続要求を行ったデータベースユーザ名が対となるエントリがマップ内にある場合は、接続は許可されます。
値all
をdatabase-username
として使用して、system-username
が一致する場合、このユーザは既存のデータベースユーザのいずれかとしてログインできるように指定できます。
all
を引用符で囲むと、キーワードはその特別な意味を失います。
database-username
が+
文字で始まる場合、オペレーティングシステムユーザはそのロールに属するユーザとしてログインできます。これは+
で始まるユーザ名のpg_hba.conf
での扱い方と同様です。
したがって、+
マークは「このロールの直接または間接的なメンバであるロールのいずれかに一致した」ことを意味し、+
マークのない名前はその特定のロールにのみ一致します。
+
で始まるユーザ名を引用符で囲むと、+
はその特別な意味を失います。
もし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
としてログインすることを許可します。
\1
を含むdatabase-username
を引用符で括っても、\1
はその特別な意味を失いません。
database-username
フィールドがスラッシュ(/
)で始まる場合、フィールドの残りは正規表現として扱われます(PostgreSQLの正規表現構文の詳細については、9.7.3.1を参照してください)。
system-username
の正規表現からのキャプチャを使用するためにdatabase-username
での正規表現に対して\1
を使用することはできません。
デフォルトでは正規表現は、文字列の一部を一致させることに注意してください。
上記の例で示したように、システムユーザ名全体を強制的に一致させるために^
や$
を使用すると有用です。
pg_ident.conf
ファイルは起動時と、メインサーバのプロセスが
SIGHUPを受信したときに読み込まれます。
起動しているシステムで編集した場合は、ファイルを再読み込みするために(pg_ctl reload
の使用、SQL関数pg_reload_conf()
の呼び出し、またはkill -HUP
を使用して)postmasterにシグナルを送信する必要があります。
pg_ident.conf
に対する変更を事前にテストする際、あるいはそのファイルをロードしても期待していた結果が得られなかった場合には、システムビューpg_ident_file_mappings
が役に立ちます。
そのビューのerror
フィールドがNULLでない行は、そのファイルの該当行に問題があることを示しています。
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