identやGSSAPIといった外部の認証システムを使用する場合は、接続を開始したオペレーティングシステムのユーザ名が接続先のデータベースユーザ(ロール)名と同じであるとは限りません。
ユーザ名マップを使用するには、pg_hba.conf
内でmap
=map-name
オプションを指定してください。
このオプションは、外部ユーザ名を受け取るすべての認証方式をサポートしています。
異なる接続に対して、異なるマップを必要とする可能性があります。そのため、それぞれの接続に対して使用されるマップを指定するために、使用するマップの名称はpg_hba.conf
内のmap-name
パラメータで指定されます。
《マッチ度[]》ユーザ名マップはidentマップファイルに定義されています。デフォルトではファイル名はpg_ident.conf
で
クラスタのデータディレクトリに保存されています。(他の場所にも保存できますが、詳細はident_file設定パラメータを参照してください。)
identマップファイルは一般的な形式の行を含んでいます。
《機械翻訳》ユーザ名マップは、デフォルトではpg_ident.conf
という名前のidentマップファイルに定義されており、クラスタのデータディレクトリに格納されます。
(マップファイルは他の場所に配置することもできますが、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
に関しては、同じルールに従って、このファイルの行に指示子を含めることができます。
《マッチ度[58.724428]》どれだけのデータベースユーザがオペレーティングシステムのユーザに対して一致しているか、またその逆に対しても制限はありません。
よってマップ内のエントリは、それらが等しいというよりもむしろ
「このオペレーティングシステムのユーザはこのデータベースユーザとして接続する」という意味になります。
もし外部の認証システムから得られたユーザ名と接続要求を行ったデータベースユーザ名が対となるエントリがマップ内にある場合は、接続は許可されます。
《機械翻訳》特定のデータベースが対応できるオペレーティングシステムユーザユーザの数に関する制限はなく、その逆もありません。
したがって、マップ内のエントリは、同等であることを意味するのではなく、意味として考える必要があります「このオペレーティングシステムユーザはこのデータベースユーザとして接続することが許可されます」。
外部認証システムから取得したユーザ名前と、ユーザが接続を要求したデータベースユーザ名前をペアにするマップエントリがある場合、コネクションは許可されます。
値all
をデータベース-username
として使用して、システム-ユーザ
が一致する場合、このユーザは既存のユーザのいずれかとしてアドバタイズできるように指定できます。
all
を引用符で囲むと、キーワードの特別な意味が失われます。
ログデータベース
《機械翻訳》データベース-ユーザ名
が+
文字で始まる場合、+
で始まるオペレーティングシステムユーザ名が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
としてログインすることを許可します。
Quoting a database-username
containing
\1
does not make
\1
lose its special meaning.
《機械翻訳》データベース-ユーザ名
フィールドがスラッシュ(/
)で始まる場合、フィールドの残りは正規表現として扱われます。
PostgreSQLの正規表現構文の詳細については、9.7.3.1を参照してください。
システム-ユーザ名
の正規表現に対して、データベース-ユーザ名
の正規表現からのキャプチャを使用するために\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