クライアント認証はデータベースクラスタのデータディレクトリ内の、伝統的にpg_hba.confという名前の設定ファイルで管理されています (HBAとは、host-based authentication: ホストベース認証の略です)。 デフォルトのpg_hba.confファイルは、データディレクトリがinitdbで初期化される時にインストールされます。 しかし、この認証設定ファイルを他の場所に設置することができます。 hba_file設定パラメータを参照してください。
pg_hba.confファイルの一般的な書式は、1行につき1つのレコードというレコードの集合です。 空行はコメント用の#文字以降の文字と同じく無視されます。 レコードはスペースもしくはタブ、もしくはその両方で区切られた、複数のフィールドで構成されています。 フィールドには、フィールド値が引用符付きの場合空白文字を含むことができます。 レコードは行をまたいで続けることはできません。
それぞれのレコードは接続形式、(接続形式に対して意味を持つのであれば)クライアントのIPアドレス範囲、データベースの名前、ユーザ名およびこれらのパラメータに一致する接続で使用される認証方法を指定します。 接続形式、クライアントアドレス、要求されたデータベース、およびユーザ名に一致する最初のレコードが認証処理に使用されます。 "失敗時の継続"や、 あるいは"バックアップ"はありません。 これは、もしあるレコードが選択されて認証に失敗した場合、後続のレコードは考慮されないということです。 どのレコードも一致しない時はアクセスが拒否されます。
レコードは7つの書式のうちの1つの形式を取ります。
local database user auth-method [auth-options] host database user CIDR-address auth-method [auth-options] hostssl database user CIDR-address auth-method [auth-options] hostnossl database user CIDR-address 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]
フィールドの意味は以下のようになっています。
このレコードはUnixドメインソケットを使用する接続に対応します。 この種類のレコードを使用しないと、Unixドメインソケット経由の接続は拒否されます。
このレコードは、TCP/IPを使用した接続に対応します。 hostレコードは、SSLもしくは非SSL接続のいずれかに対応します。
注意: サーバのデフォルトの動作は、ローカルループバックアドレスであるlocalhostのみTCP/IP接続を監視しています。 よってサーバにおいてlisten_addressesパラメータが適切な値に設定された状態で起動されていない限り、リモートのTCP/IP接続はできません。
このレコードは、接続がSSLで暗号化されている場合にのみTCP/IPネットワークを使用する接続に対応します。
このオプションを使用するためには、サーバはSSLサポートができるように構築されていなければいけません。 また、 SSLはsslパラメータを設定することによりサーバの起動時に有効になっていなくてはなりません(詳細は項17.8を参照してください)。
このレコードは、hostsslと反対の動作で、SSLを使用していないTCP/IPの接続のみに対応します。
このレコードで対応するデータベース名を指定します。 all という値は、全てのデータベースと対応することを指定します。 sameuserという値は、要求されたデータベースが要求ユーザと同じ名前を持つ場合にレコードが対応することを指定します。 samerole という値は、要求ユーザが要求されたデータベースと同じ名前のロールのメンバでなければならないことを指定します。 (以前はsamegroupと書いていましたが、sameroleと記述してください) それ以外の場合には、特定のPostgreSQLデータベースの名前になります。 データベースの名前はカンマで区切ることで複数指定できます。 データベース名を含む別のファイルを、そのファイル名の前に@を付けることで指定できます。
このレコードで対応するデータベースユーザを指定します。 allという値は、全てのユーザが対応することを指定します。 それ以外の場合には特定のデータベースユーザの名前もしくは+で始まるグループ名のどちらかになります。 (PostgreSQLではユーザとグループの明確な区別がないことを思い出してください。 +のマークは"、このロールの直接的もしくは間接的なメンバのどちらかに一致していることを意味しています。") 重複したユーザ名は、ユーザ名をカンマで区切ることによって使用できるようになります。 ユーザ名を含む別のファイルを、そのファイル名の前に@を付けることで指定できます。
このレコードに対応しているクライアントマシンのIPアドレスの範囲。 このフィールドは標準のドット区切り10進表記でのIPアドレスとCIDRマスクの長さを含んでいます (IPアドレスは数値でのみ表され、ドメイン名やホスト名では表されません)。 CIDRマスク長とは、クライアントIPアドレスが一致しなければならない、高位のビット数を表すものです。 指定するIPアドレスのこれより右側のビットには、0を指定しなければなりません。 IPアドレスと/、およびCIDRマスク長の間には空白を入れてはいけません。
典型的なCIDR-addressの例は、単一のホストでは172.20.143.89/32、小規模ネットワークでは172.20.143.0/24、大規模ネットワークでは10.6.0.0/16のようなものです。 単一ホストを指定するには、IPv4では32というCIDRマスクを、IPv6では128を使用してください。 ネットワークアドレスでは末尾の0を省略できません。
IPv4書式で与えられたIPアドレスは、対応するアドレスを持つIPv6接続に対しても対応します。 例えば、127.0.0.1は::ffff:127.0.0.1 IPv6アドレスに対応します。 IPv6書式で与えられた項目は、たとえそのアドレスがIPv6内のIPv4の範囲内であったとしてもIPv6接続のみに対応します。 IPv6書式の項目は、システムのCライブラリがIPv6アドレスをサポートしていない場合拒絶されることに注意してください。
これらのフィールドはhostおよびhostssl、hostnosslレコードにのみ適用されます。
このフィールドはCIDR-address表記の代替として使用可能です。 マスク長を指定する代わりに、実際のマスクを分離した列で指定します。 例えば255.0.0.0はIPv4のCIDRマスク長8を意味し、255.255.255.255はCIDRマスク長32を意味しています。
このフィールドはhostおよびhostssl、hostnosslレコードにのみ適用されます。
接続がこのレコードに一致する場合に使用する認証方式を指定します。 使用できる選択肢は以下にまとめていますが、詳しくは項19.3を参照してください。
接続を無条件で許可します。 この方式は、PostgreSQLデータベースサーバに接続できる全てのユーザが、任意のPostgreSQLユーザとしてパスワードなしでログインすることを許可します。 詳細は項19.3.1を参照してください。
接続を無条件に拒否します。 特定のホストをあるグループから"除外"するために便利です。
クライアントに対して認証時にMD5暗号化パスワードを要求します。 詳細は項19.3.2を参照してください。
クライアントに対して認証時に平文のパスワードを要求します。 パスワードはネットワークを通じて普通のテキスト形式で送られますので、信頼されていないネットワークでは使用しないでください。 詳細は項19.3.2を参照してください。
ユーザの認証にGSSAPIを使用します。これはTCP/IP接続を使用するときのみ使用可能です。詳細は項19.3.3を参照してください。
Use SSPI to authenticate the user. This is only available on Windows. See 項19.3.4 for details.
ユーザ認証にKerberos V5を使用します。 TCP/IP接続の時のみ有効です。 詳細は項19.3.5を参照してください。
クライアントのオペレーティングシステムにおけるユーザ名を(TCP/IP接続ではクライアント上のidentサーバに尋ねることで、ローカル接続ではオペレーティングシステムから)取得し、 ユーザ名が要求されたデータベースユーザ名と一致するか検査します。 詳細は項19.3.6を参照してください。
LDAPサーバを使用して認証します。 詳細は項19.3.7を参照してください。
SSLクライアント証明を使用して認証します。 詳細は項19.3.8を参照してください。
オペレーティングシステムによって提供されるPAM(Pluggable Authentication Modules)サービスを使用した認証です。 詳細は項19.3.9を参照してください。
auth-methodフィールドの後ろに、 認証方式のオプションを指定する、name=valueの形式のフィールドが存在する可能性があります。 どのオプションがどの認証方式に使用できるのか、についての詳細は以下で説明します。
@式により含められるファイルは、空白文字あるいはカンマのどちらかで区切られた名前の列挙として読み込まれます。 コメントは、pg_hba.confと同様に#から始まります。 また、@式を入れ子にすることもできます。 @の後のファイル名が絶対パスでない限り、参照元ファイルが存在するディレクトリから見た相対パスであるとみなされます。
pg_hba.confレコードは接続が試みられる度に順番に検査されますので、レコードの順序はとても大切です。 典型的には、始めの方のレコードには厳しい接続照合パラメータと緩い認証方式があるのに対し、終わりの方のレコードにはより緩い照合パラメータとより厳しい認証方式があります。 例えば、ローカルTCP接続ではtrust認証方式、リモートTCP接続に対してはパスワードを要求したいとします。 この場合、広範囲にわたって許可されるクライアントのIPアドレスに対するパスワード認証を指定するレコードの前に127.0.0.1からの接続に対するtrust認証指定のレコードが置かれなければなりません。
pg_hba.confファイルは起動時と、主サーバプロセスがSIGHUP信号を受け取った時に読み込まれます。 稼働中のシステムでファイルを編集した場合は、(pg_ctl reloadあるいはkill -HUPを使用して)サーバにファイルをもう一度読み込むように信号を出さなければなりません。
ティップ: 特定のデータベースに接続するためには、ユーザはpg_hba.confによる検査を通過しなければならない他、そのデータベースに対するCONNECT権限を持たなければなりません。 どのユーザがどのデータベースに接続できるかを制限したければ、通常、pg_hba.conf項目に規則を追加するよりも、CONNECT権限の付与・削除を行う方が簡単です。
pg_hba.confファイルの例をいくつか例19-1に示します。 各種認証方式の詳細についてはその後で説明します。
例 19-1. pg_hba.confの項目の例
# ローカルシステム上の全てのユーザが、任意のデータベースに # 任意のデータベースユーザ名でUnixドメインソケットを使用して接続することを許可 # (ローカル接続ではデフォルト)。 # # TYPE DATABASE USER CIDR-ADDRESS METHOD local all all trust # ローカルループバックのTCP/IP接続であることを除いて上記に同じ。 # # TYPE DATABASE USER CIDR-ADDRESS METHOD host all all 127.0.0.1/32 trust # ネットマスク列を分けて記載していることを除いて上記に同じ # # TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD host all all 127.0.0.1 255.255.255.255 trust # IPアドレス192.168.93.xを持つ全てのホストの全てのユーザが、 # identがその接続について報告するのと同じユーザ名(典型的にはUnixユーザ名)で # データベース「postgres」へ接続することを許可。 # # TYPE DATABASE USER CIDR-ADDRESS METHOD host postgres all 192.168.93.0/24 ident # ユーザのパスワードが正しく入力された場合、 # ホスト192.168.12.10からのどのようなユーザでもデータベース「postgres」へ接続することを許可。 # # TYPE DATABASE USER CIDR-ADDRESS METHOD host postgres all 192.168.12.10/32 md5 # 先行する「host」行がなければ、これら2行によって192.168.54.1からの接続 # の試みを全て拒否(この項目が最初に照合されるため)。 # ただし、インターネット上の他の全ての場所からのKerberos 5接続は許可。 # ゼロマスクは、ホストIPアドレスのビットを考慮せずに # どのホストでも照合できることを意味する。 # # TYPE DATABASE USER CIDR-ADDRESS METHOD host all all 192.168.54.1/32 reject host all all 0.0.0.0/0 krb5 # 192.168.x.xホストからのユーザが、ident検査に通る場合、 # どのデータベースにでも接続を許可。もし、例えば、identが「bryanh」と認定し # 「bryanh」がPostgreSQLのユーザ「guest1」として # 接続要求を出す場合、「bryanh」は「guest1」として接続が許可されるという # マップ「omicron」に対する記載事項がpg_ident.confにあれば接続を許可。 # # TYPE DATABASE USER CIDR-ADDRESS METHOD host all all 192.168.0.0/16 ident map=omicron # ローカル接続に対して、以下のたった3行しか記載がない場合、ローカルユーザは # 自分のデータベース(データベースユーザ名と同じ名前のデータベース)にのみ接続許可。 # ただし管理者とロール「support」のメンバは全てのデータベースに接続可能。 # $PGDATA/adminsファイルは管理者のリストを含む。 # 全ての場合にパスワードが必要。 # # TYPE DATABASE USER CIDR-ADDRESS METHOD local sameuser all md5 local all @admins md5 local all +support md5 # 上記の最後の2行は1つの行にまとめることが可能。 local all @admins,+support md5 # データベースの列にはリストやファイル名も使用できるが、グループは使用できない。 local db1,db2,@demodbs all md5