6.1. pool_hba.confファイル

PostgreSQLpg_hba.confと同じようにPgpool-IIでもpool_hba.confとよばれる設定ファイルを使った同様のクライアント認証機能をサポートしています。 Pgpool-IIをソースコードからインストールした場合、デフォルトインストール先の設定ファイルディレクトリ("/usr/local/etc")にサンプルのpool_hba.conf.sampleが含まれています。 デフォルトではpool_hbaによる認証は無効になっており、enable_pool_hbaonに設定することで有効になります。 enable_pool_hba設定パラメータをご覧ください。

注意: PostgreSQLの数が1台のみ、あるいはraw mode(項3.3.2参照)では、pool_hba.confは必要なく、enable_pool_hbaはoffのままで構いません。 この場合、クライアントの認証方式はPostgreSQLに完全に任されます。 PostgreSQLの数が複数台、あるいはraw mode以外の場合でも、PostgreSQLでの認証方式がtrustなら、やはりpool_hba.confは必要なく、enable_pool_hbaはoffのままで構いません。

pool_hba.confのフォーマットはPostgreSQLpg_hba.confのものとほとんど同じです。 pool_hba.confファイルの一般的な書式は、1行につき1つのレコードというレコードの集合です。 空行はコメント用の#文字以降の文字と同じく無視されます。 レコードは行をまたいで続けることはできません。 レコードはスペースもしくはタブ、もしくはその両方で区切られた、複数のフィールドで構成されています。 フィールドには、フィールド値が二重引用符付きの場合空白文字を含むことができます。 データベース、ユーザもしくはアドレスフィールド内のキーワード(例:allまたはreplication)の一つを引用符で囲むとその特別な意味が失われ、その名称のデータベース、ユーザもしくはホストと一致するようになります。

それぞれのレコードは接続形式、(接続形式に対して意味を持つのであれば)クライアントのIPアドレス範囲、データベースの名前、ユーザ名およびこれらのパラメータに一致する接続で使用される認証方法を指定します。 接続形式、クライアントアドレス、要求されたデータベース、およびユーザ名に一致する最初のレコードが認証処理に使用されます。 「失敗時の継続」や、 あるいは「バックアップ」はありません。 これは、もしあるレコードが選択されて認証に失敗した場合、後続のレコードは考慮されないということです。 どのレコードも一致しない時はアクセスが拒否されます。

レコードは以下の書式のうちの1つの形式を取ります。

    local      database  user  auth-method  [auth-options]

    host       database  user  IP-address IP-mask  auth-method  [auth-options]
    hostssl    database  user  IP-address IP-mask  auth-method  [auth-options]
    hostnossl  database  user  IP-address IP-mask  auth-method  [auth-options]

    host       database  user  address  auth-method  [auth-options]
    hostssl    database  user  address  auth-method  [auth-options]
    hostnossl  database  user  address  auth-method  [auth-options]
   

フィールドの意味は以下のようになっています。

local

このレコードはUnixドメインソケットを使用する接続に対応します。 この種類のレコードを使用しないと、Unixドメインソケット経由の接続は拒否されます

host

このレコードは、TCP/IPを使用した接続に対応します。 hostレコードは、SSLもしくは非SSL接続のいずれかに対応します。

注意: サーバのデフォルトの動作は、ローカルループバックアドレスであるlocalhostのみTCP/IP接続を監視しています。 よってサーバにおいてlisten_addressesパラメータが適切な値に設定された状態で起動されていない限り、リモートのTCP/IP接続はできません。

hostssl

このレコードは、接続がSSLで暗号化されている場合にのみTCP/IPを使用する接続に対応します。

このオプションを使用するには、Pgpool-IISSLサポートでビルドする必要があります。 また、SSLssl設定パラメータを設定することによって有効にする必要があります。 そうしなければ、hostsslレコードは無視されます。

hostnossl

このレコードは、hostsslと反対の動作で、SSLを使用していないTCP/IPの接続のみに対応します。

database

このレコードで対応するデータベース名を指定します。 allという値は、全てのデータベースと対応することを指定します。

注意: databaseフィールド値として"samegroup"はサポートされません

Pgpool-IIPostgreSQLバックエンドサーバにあるユーザ情報を事前に知る事ができないため、データベース名はpool_hba.confにあるdatabaseフィールドの項目のみと比較されます。

user

このレコードで対応するデータベースユーザ名を指定します。 allという値は、すべてのユーザが対応することを指定します。 それ以外の場合には特定のデータベースユーザの名前となります。

注意: userフィールド値として"+"を使ったグループ指定はサポートされません

上記の"samegroup"と同じ理由で、ユーザ名は単純にpool_hba.confにあるuserフィールドの項目のみ対してチェックされます。

address

このレコードに対応しているクライアントマシンのアドレスを指定します。 このフィールドはホスト名、IPアドレスの範囲、もしくは下記の特別なキーワードのいずれかを含むことができます。

IPアドレスの範囲は、範囲の開始アドレス、スラッシュ (/) およびCIDRマスク長という標準数値表記を使用して指定します。 CIDRマスク長は、クライアントIPアドレスが一致しなければならない、上位のビット数を表すものです。 指定するIPアドレスの右側のビットには、0を指定しなければなりません。 IPアドレス、 /、およびCIDRマスク長の間に空白を入れてはいけません。

典型的なIPv4アドレス範囲の例は、単一のホストの場合は172.20.143.89/32、小規模ネットワークの場合は172.20.143.0/24、大規模ネットワークの場合は10.6.0.0/16です。 IPv6アドレスの範囲は、単一のホストの場合は::1/128(この場合はIPv6ループバックアドレス)、小規模ネットワークの場合はfe80::7a31:c1ff:0000:0000/96です。 0.0.0.0/0はすべてのIPv4アドレス、::0/0はすべてのIPv6アドレスを意味しています。 単一ホストを指定するには、IPv4の場合は32、IPv6の場合は128のマスク長を使用します。ネットワークアドレスでは、末尾の0を省略できません。

IPv4書式で指定されたエントリは、IPv4接続のみに対応し、IPv6書式で指定されたエントリは、たとえそのアドレスがIPv6内のIPv4の範囲内であったとしてもIPv6接続のみに対応します。 IPv6書式のエントリは、システムのCライブラリがIPv6アドレスをサポートしていない場合拒否されることに注意してください。

すべてのIPアドレスに一致するようにallと書くこともできますし、サーバ自身のどのIPアドレスにも一致するようにsamehostと書くこともできます。 もしくは、サーバが直接接続されているサブネット内のどのアドレスにも一致するようにsamenetと書くこともできます。

もし、ホスト名が指定されている場合 (IPアドレス範囲以外の場合、もしくはホスト名として処理される特別なキーワード)、その名前は、クライアントのIPアドレスの逆引き名前解決の結果 (例えば、もしDNSが使用されている場合は、逆引きDNS検索により解決されるもの) と比較されます。 ホスト名の比較では、大文字と小文字を区別しません。 もし一致するものがあった場合は、ホスト名に対して正引き解決 (例えば正引きDNS検索) が実行され、解決されたアドレスのいずれかがクライアントのIPアドレスと等しいかどうかがチェックされます。 もし両方が一致した場合、エントリは一致するものとみなされます。 (pool_hba.confで使用されているホスト名は、クライアントのIPアドレスの正引き名前解決が返すホスト名の1つでなければなりません。 そうでなければ、この行は一致しません。 1つのIPアドレスを複数のホスト名に関連付けるホスト名データベースもありますが、IPアドレスの解決を要求された場合にオペレーティングシステムは1つのホスト名のみを返します。)

ドット (.) で始まるホスト名の指定は実際のホスト名のサフィックスに一致します。 したがって、.example.comfoo.example.comに一致します (example.comだけでは一致しません)。

pool_hba.confにホスト名が指定されている場合は、名前解決が十分に高速であることを確認する必要があります。 nscdのようなローカル名前解決のキャッシュを設定することは有利かもしれません。

このフィールドはhosthostsslhostnosslレコードにのみ適用されます。

アドレスフィールドにホスト名を指定することは、 Pgpool-II V3.7より前では利用できません。

IP-address
IP-mask

この2つのフィールドはIP-address/mask-length表記の代替として使用可能です。 マスク長を指定する代わりに、実際のマスクを分離した列で指定します。 例えば、255.0.0.0はIPv4のCIDRマスク長8を意味し、255.255.255.255CIDRマスク長32を意味しています。

このフィールドはhosthostsslhostnosslレコードにのみ適用されます。

auth-method

接続がこのレコードに一致する場合に使用する認証方式を指定します。 使用できる選択肢は以下にまとめていますが、詳しく項6.2を参照してください。

trust

接続を無条件で許可します。 この方式は、Pgpool-IIに接続できる全てのユーザを許可します。

reject

接続を無条件に拒否します。 特定のホストをあるグループから「除外」するために便利です。 例えば、1行のrejectは特定のホストが接続することを拒否します。

md5

クライアントに対して認証時に二重MD5ハッシュ化パスワードを要求します。

注意: md5認証を使うには、ユーザ名とパスワードをpool_passwdというパスワードファイルに登録する必要があります。 詳細は項6.2.3を参照してください。 なお、pool_passwdでパスワードを管理したくない場合は、allow_clear_text_frontend_authを使うこともできます。

scram-sha-256

ユーザのパスワードを確認するため、SCRAM-SHA-256認証を行います。

注意: scram-sha-256認証を使用するためには、pool_passwdファイルにユーザ名とパスワードを登録する必要があります。 詳細は項6.2.4を参照してください。 なお、pool_passwdでパスワードを管理したくない場合は、allow_clear_text_frontend_authを使うこともできます。

cert

SSLクライアント証明書を使って認証します。 詳細は項6.2.5を参照してください。

pam

オペレーティングシステムによって提供されるPAM(Pluggable Authentication Modules)サービスを使用した認証です。 詳細は項6.2.6を参照してください

Pgpool-IIが稼働するホスト上のユーザ情報を使ったPAM認証を利用することができます。 PAMサポートを有効にするには、Pgpool-II"--with-pam"をつけてconfigureされていなければなりません。

PAM認証を有効にするには、Pgpool-IIのサービス設定ファイルをシステムのPAM設定ディレクトリ(通常は"/etc/pam.d"にあります)に作成しなければなりません。 サービス設定ファイルのサンプルはインストールディレクトリ下に"share/pgpool.pam"としてインストールされています。

auth-options

auth-methodフィールドの後ろに、認証方式のオプションを指定する、name=valueの形式のフィールドが存在する可能性があります。

pool_hba.confレコードは接続が試みられる度に順番に検査されますので、レコードの順序はとても大切です。 典型的には、始めの方のレコードには厳しい接続照合パラメータと緩い認証方式があるのに対し、終わりの方のレコードにはより緩い照合パラメータとより厳しい認証方式があります。 例えば、ローカルTCP接続ではtrust認証方式、リモートTCP接続に対してはパスワードを要求したいとします。 この場合、広範囲にわたって許可されるクライアントのIPアドレスに対するパスワード認証を指定するレコードの前に127.0.0.1からの接続に対するtrust認証指定のレコードが置かれなければなりません。

ティップ: ここで説明された全てのpool_hba認証のオプションはクライアントとPgpool-IIの間についてだということに注意してください。 クラインアントは依然として、PostgreSQLによる認証を通過しなければなりませんし、バックエンドPostgreSQLサーバ上のデータベースに対してCONNECT権限を持っていなければなりません。

pool_hbaにとってはクライアントに指定されたユーザ名やデータベース名(例. psql -U testuser testdb)が実際にバックエンド上に存在するかどうかは問題ではありません。 pool_hbaはpool_hba.confの値とマッチするかどうかのみを気にします。

pool_hba.confファイルの例をいくつか以下に示します。 各種認証方式の詳細については次の節をご覧ください。

例 6-1. pool_hba.confの項目の例

    # Allow any user on the local system to connect to any database with
    # any database user name using Unix-domain sockets (the default for local
    # connections).
    #
    # TYPE  DATABASE        USER            ADDRESS                 METHOD
    local   all             all                                     trust

    # The same using local loopback TCP/IP connections.
    #
    # TYPE  DATABASE        USER            ADDRESS                 METHOD
    host    all             all             127.0.0.1/32            trust

    # Allow any user from host 192.168.12.10 to connect to database
    # "postgres" if the user's password is correctly supplied.
    #
    # TYPE  DATABASE        USER            ADDRESS                 METHOD
    host    postgres        all             192.168.12.10/32        md5