identやGSSAPIといった外部の認証システムを使用する場合は、接続を開始したオペレーティングシステムのユーザ名が接続先のデータベースユーザ(ロール)名と同じであるとは限りません。
ユーザ名マップを使用するには、pg_hba.conf内でmap=map-nameオプションを指定してください。
このオプションは、外部ユーザ名を受け取るすべての認証方式をサポートしています。
異なる接続に対して、異なるマップを必要とする可能性があります。そのため、それぞれの接続に対して使用されるマップを指定するために、使用するマップの名称はpg_hba.conf内のmap-nameパラメータで指定されます。
ユーザ名マップはidentマップファイルに定義されています。デフォルトではファイル名はpg_ident.confで、クラスタのデータディレクトリに保存されています。
(マップファイルを他の場所にも保存できますが、詳細はident_file設定パラメータを参照してください。)
identマップファイルは以下のような一般的な形式の行を含んでいます。
map-namesystem-usernamedatabase-usernameincludefileinclude_if_existsfileinclude_dirdirectory
コメント、空白、行継続は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