pg_hba.confファイル

PostgreSQL 9.1.1文書
前のページ | 巻戻し | 第 19章クライアント認証 | 早送り | 次のページ

# 19.1. `pg_hba.conf`ファイル

クライアント認証はデータベースクラスタのデータディレクトリ内の、伝統的に`pg_hba.conf`という名前の設定ファイルで管理されています （HBAとは、host-based authentication: ホストベース認証の略です）。 デフォルトの`pg_hba.conf`ファイルは、データディレクトリが`initdb`で初期化される時にインストールされます。 しかし、この認証設定ファイルを他の場所に設置することができます。 hba_file設定パラメータを参照してください。

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

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

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

    local      database  user  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]
    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]

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

`local`

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

`host`

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

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

`hostssl`

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

  このオプションを使用するためには、サーバはSSLサポートができるように構築されていなければいけません。 また、 SSLはsslパラメータを設定することによりサーバの起動時に有効になっていなくてはなりません（詳細は項17.9を参照してください）。

`hostnossl`

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

`database`

  このレコードで対応するデータベース名を指定します。 `all` という値は、全てのデータベースと対応することを指定します。 `sameuser`という値は、要求されたデータベースが要求ユーザと同じ名前を持つ場合にレコードが対応することを指定します。 `samerole` という値は、要求ユーザが要求されたデータベースと同じ名前のロールのメンバでなければならないことを指定します。 （以前は`samegroup`と書いていましたが、`samerole`と記述してください） `replication`の値は、もしレプリケーション接続が要求された場合（レプリケーション接続は特定のデータベースを指定しないことに注意して下さい）にレコードが一致することを指定します。 それ以外の場合には、特定のPostgreSQLデータベースの名前になります。 データベースの名前はカンマで区切ることで複数指定できます。 データベース名を含む別のファイルを、そのファイル名の前に`@`を付けることで指定できます。

`user`

  このレコードで対応するデータベースユーザを指定します。 `all`という値は、全てのユーザが対応することを指定します。 それ以外の場合には特定のデータベースユーザの名前もしくは`+`で始まるグループ名のどちらかになります。 （PostgreSQLではユーザとグループの明確な区別がないことを思い出してください。 `+`のマークは"、このロールの直接的もしくは間接的なメンバのどちらかに一致していることを意味しています。"） 重複したユーザ名は、ユーザ名をカンマで区切ることによって使用できるようになります。 ユーザ名を含む別のファイルを、そのファイル名の前に`@`を付けることで指定できます。

`address`

  このレコードに対応しているクライアントマシンのIPアドレス。 このフィールドはホスト名、IPアドレスの範囲と以下に示す特別なキーワードの1つを含んでいます。

  標準のドット区切り10進表記でのIPアドレスとCIDRマスクです。 CIDRマスク長とは、クライアントIPアドレスが一致しなければならない、高位のビット数を表すものです。 指定するIPアドレスのこれより右側のビットには、0を指定しなければなりません。 IPアドレスと`/`、およびCIDRマスク長の間には空白を入れてはいけません。

  この方法で指定される典型的なIPアドレス範囲の例は、単一のホストでは`172.20.143.89/32`、 小規模ネットワークでは`172.20.143.0/24`、 大規模ネットワークでは`10.6.0.0/16`のようなものです。 `0.0.0.0/0`はすべてのIPv4アドレスを意味し、さらに `::/0`はすべてのIPv6のアドレスを意味しています。。 単一ホストを指定するには、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アドレスをサポートしていない場合拒絶されることに注意してください。

  任意のIPアドレスに対応するように`all`という書き方もできます。 任意のIPアドレスを持つサーバに対応するように`samehost`という書き方もできます。 また、サーバが直接接続されている任意のサブネットに対応する`samenet`という書き方もできます。

  ホスト名が指定された場合(IPアドレスや仮想ホスト名として処理された特定のキーワードではない任意のもの)、 名前は、クライアントのIPアドレスの名前解決を逆引きした結果と比較されます(例えば、DNSが使用されている場合はDNSリバースルックアップ)。 ホスト名の比較は大文字、小文字が区別されます。一致するものがある場合、ホスト名に対して名前解決(DNSルックアップ)が実行されます。 これは解決された任意のアドレスがクライアントのIPアドレスに一致するか否かをチェックするためです。 もし2つの名前解決が一致する場合、項目は一致するとみなされます。 (`pg_hba.conf`内で使用されているホスト名は、クライアントIPアドレスのアドレスから名前への解決で返される中の一つでなくてはなりません。) もしそうでない場合は、一致しないでしょう。 ホスト名データベースは、IPアドレスと複数のホスト名とを関連付けることを許可するものもあります。しかし、 オペレーティングシステムはIPアドレスの解決を依頼されると1つのホスト名のみを返します。

  ドット(`.`)で始まるホスト名の仕様は、実際のホスト名のサフィックスと一致します。 そのため、`.example.com`は(`example.com`ではなく)`foo.example.com`と一致します。

  ホスト名が`pg_hba.conf`内に指定されている場合、名前解決が早いことを確認する必要があります。 これは`nscd`といったようなローカルでの名前解決のキャッシュを設定することによる利点です。 また、設定パラメータ`log_hostname`が、ログ内でクライアントのIPアドレスの代わりにホスト名を参照できればいいと思うでしょう。

  これらのフィールドは`host`および`hostssl`、`hostnossl`レコードにのみ適用されます。

`IP-address`
`IP-mask`

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

  このフィールドは`host`および`hostssl`、`hostnossl`レコードにのみ適用されます。

`auth-method`

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

  `trust`

    接続を無条件で許可します。 この方式は、PostgreSQLデータベースサーバに接続できる全てのユーザが、任意のPostgreSQLユーザとしてパスワードや他の認証なしでログインすることを許可します。 詳細は項19.3.1を参照してください。

  `reject`

    接続を無条件に拒否します。 特定のホストをあるグループから"除外"するために便利です。 例えば、1行の`reject`は特定のホストが接続することを拒否します。一方、 後ろの行では特定のネットワーク内の残りのホストが接続することを許可します。

  `md5`

    クライアントに対して認証時にMD5暗号化パスワードを要求します。 詳細は項19.3.2を参照してください。

  `password`

    クライアントに対して認証時に平文のパスワードを要求します。 パスワードはネットワークを通じて普通のテキスト形式で送られますので、信頼されていないネットワークでは使用しないでください。 詳細は項19.3.2を参照してください。

  `gss`

    ユーザの認証にGSSAPIを使用します。これはTCP/IP接続を使用するときのみ使用可能です。詳細は項19.3.3を参照してください。

  `sspi`

    ユーザの認証にSSPIを使用します。これはWindowsを使用するときのみ使用可能です。詳細は項19.3.4を参照してください。

  `krb5`

    ユーザ認証にKerberos V5を使用します。 TCP/IP接続の時のみ有効です。 詳細は項19.3.5を参照してください。

  `ident`

    クライアント上のidentサーバに接続し、要求されたデータベース名が一致するかどうかをチェックすることにより クライアントのオペレーティングシステムにおけるユーザ名を取得します。 Ident認証はTCP/IP接続上でのみ使用されます。ローカル接続の場合は、代わりにピア認証が使用されます。 詳細は項19.3.6を参照してください。

  `peer`

    クライアントのオペレーティングシステムユーザ名をオペレーティングシステムから取得し、 要求されたデータベースユーザ名と一致するかチェックします。 これはローカル接続のときにのみ使用可能です。 詳細は項19.3.7を参照してください。

  `ldap`

    LDAPサーバを使用して認証します。 詳細は項19.3.8を参照してください。

  `radius`

    RADIUSサーバを使用して認証します。 詳細は項19.3.9を参照してください。

  `cert`

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

  `pam`

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

`auth-options`

  `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`を使用して）postmasterにファイルをもう一度読み込むようにシグナルを送信する必要があります。

> ティップ: 特定のデータベースに接続するためには、ユーザは`pg_hba.conf`による検査を通過しなければならない他、そのデータベースに対する`CONNECT`権限を持たなければなりません。 どのユーザがどのデータベースに接続できるかを制限したければ、通常、`pg_hba.conf`項目に規則を追加するよりも、`CONNECT`権限の付与・削除を行う方が簡単です。

`pg_hba.conf`ファイルの例をいくつか例19-1に示します。 各種認証方式の詳細についてはその後で説明します。

例 19-1. `pg_hba.conf`の項目の例

    # ローカルシステム上の全てのユーザが、任意のデータベースに
    # 任意のデータベースユーザ名でUnixドメインソケットを使用して接続することを許可
    # （ローカル接続ではデフォルト）。
    #
    # TYPE  DATABASE        USER            ADDRESS                 METHOD
    local   all             all                                     trust

    # ローカルループバックのTCP/IP接続であることを除いて上記に同じ。
    #
    # TYPE  DATABASE        USER            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

    # IPv6以外は上記に同じ
    #
    # TYPE  DATABASE        USER            ADDRESS                 METHOD
    host    all             all             ::1/128                 trust

    # ホスト名を使用する以外は(一般的にIPv4とIPv6共に利用可能)
    #
    # TYPE  DATABASE        USER            ADDRESS                 METHOD
    host    all             all             localhost               trust

    # IPアドレス192.168.93.xを持つ全てのホストの全てのユーザが、
    # identがその接続について報告するのと同じユーザ名（典型的にはオペレーティングシステムのユーザ名）で
    # データベース「postgres」へ接続することを許可。
    #
    # TYPE  DATABASE        USER            ADDRESS                 METHOD
    host    postgres        all             192.168.93.0/24         ident

    # ユーザのパスワードが正しく入力された場合、
    # ホスト192.168.12.10からのどのようなユーザでもデータベース「postgres」へ接続することを許可。
    #
    # TYPE  DATABASE        USER            ADDRESS                 METHOD
    host    postgres        all             192.168.12.10/32        md5

    # Allow any user from hosts in the example.com domain to connect to
    # any database if the user's password is correctly supplied.
    #
    # TYPE  DATABASE        USER            ADDRESS                 METHOD
    host    all             all             .example.com            md5

    # 先行する「host」行がなければ、これら2行によって192.168.54.1からの接続
    # の試みを全て拒否（この項目が最初に照合されるため）。
    # ただし、インターネット上の他の全ての場所からのKerberos 5接続は許可。
    # ゼロマスクは、ホストIPアドレスのビットが考慮されずに
    # どのホストでも照合できることになる。
    #
    # TYPE  DATABASE        USER            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            ADDRESS                 METHOD
    host    all             all             192.168.0.0/16          ident map=omicron

    # ローカル接続に対して、以下のたった3行しか記載がない場合、ローカルユーザは
    # 自分のデータベース（データベースユーザ名と同じ名前のデータベース）にのみ接続許可。
    # ただし管理者とロール「support」のメンバは全てのデータベースに接続可能。
    # $PGDATA/adminsファイルは管理者のリストを含む。
    # 全ての場合にパスワードが必要。
    #
    # TYPE  DATABASE        USER            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

前のページ | ホーム | 次のページ
クライアント認証 | 上に戻る | ユーザ名マップ