21.2. ユーザ名マップ #

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-namepg_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のネットワーク内のマシンにログインしている、 オペレーティングシステムのユーザ名でbryanhannrobert以外の誰もが、アクセスを許可されていません。 UnixユーザrobertPostgreSQLユーザであるbobとして接続しようとした時のみ アクセス可能で、 robertや他の名前ではアクセスできません。 annannとして接続した時のみ許可され、bryanhbryanh自身もしくは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