Chapter 4. クライアント認証

Table of Contents
4.1. pg_hba.conf ファイル
4.2. 認証メソッド
4.3. 認証問題

クライアントアプリケーションがデータベースサーバに接続すると、 Unix コンピュータに特定のユーザとしてログイン する時と同じように、どのPostgresユーザ名で接続 したいかを指定します。SQL 環境の中では有効なデータベースユーザ名 がデータベースのオブジェクトへのアクセス権限を決めます。それに関する くわしい情報はChapter 7を参照して下さい。 したがって、どのデータベースユーザ名で指定されたクライアントが 接続できるかを制限することは明かに重要なのです。

認証は、データベースサーバがクライアントの 識別情報を確立し、クライアントアプリケーション(もしくは クライアントアプリケーションを実行するユーザ)が要求されたユーザ名 で接続することができるかを決定するプロセスです。

Postgres は(クライアントの)ホストと データベースにより、いくつかの異なる有効な認証メソッドで クライアント認証を提供します。

Postgres データベースユーザ名は サーバが走っているオペレーティングシステムのユーザ名からは論理的に 異なります。もし特定のサーバのすべてのユーザがサーバマシン上にも アカウントを持っている場合、彼らの Unix ユーザ ID と同じ データベースユーザ名を割り当てることは理にかなっています。 しかし、リモート接続を受け入れるサーバは、ローカルアカウントを 持たない多くのユーザを持つかもしれず、そのような場合では データベースユーザ名と Unix ユーザ名の間に関連がある必要は ありません。

4.1. pg_hba.conf ファイル

クライアント認証は、$PGDATA ディレクトリの中のファイル pg_hba.conf で管理されています。 /usr/local/pgsql/data/pg_hba.confは一例です。 ( HBA はホストベースの認証 (host-based authentication) の 略です。) デフォルトのpg_hba.conf ファイル はデータ領域が initdb で初期化されるときに インストールされます。

pg_hba.conf の一般的なフォーマットは レコードの集まりで、一行につき一レコードからなります。空行とハッシュ文字 ("#")で始まる行は無視されます。レコードは スペースもしくはタブで区切られた数字のフィールド によって成り立っています。レコードは行を跨いで続けることはできません。

レコードは次の三つのうちのどれかのフォーマットを持ちます。

local   database authentication-method [ authentication-option ]
host    database IP-address IP-mask authentication-method [ authentication-option ]
hostssl database IP-address IP-mask authentication-method [ authentication-option ]
    
これらのフィールドの意味を以下に示します。

local

このレコードは Unix ドメインソケットの接続の試みに適しています。

host

このレコードは TCP/IP ネットワークの接続の試みに適しています。 サーバが -i オプションで起動されるか 同等な設定パラメータが設定されていない限り、TCP/IP 接続は は完全に不可能であることに注意してください。

hostssl

このレコードは TCP/IP の SSL を使った接続の試みに適しています。 このオプションを使うためには、サーバは SSL サポートができるよう 構築されていなければなりません。更に、SSL は サーバ起動時に -l オプションもしくは同等の設定がされていなければ いけません。

database

このレコードが適用されるデータベースを指定します。 all 値はそれが全てのデータベースに適用される ことを指定し、sameuser は同じ名前を持つデータベース を接続ユーザとして識別します。そうでない場合、これは特定の Postgresデータベースの名前になります。

IP address, IP mask

これらの二つのフィールドは、IP アドレスに基づいて、 どのホストにhost レコードが適用されるかを 管理します。(もちろん IP アドレスは偽ることができますが、 この検討は Postgres の守備範囲外 です。)正確な論理は、

(actual-IP-address xor IP-address-field) and IP-mask-field

がレコードと合うためにはゼロでなければいけないということです。

authentication method

ユーザがそのデータベースに接続する際に自分を認証するために 使わなければならないメソッドを指定します。可能な選択肢は 下記ですが、詳しくは Section 4.2にあります。

trust

接続は無条件で許可されます。このメソッドは、クライアントホスト にログインできるどんなユーザに対しても、 Postgresのユーザをどれでも使って 接続することを許可します。

reject

接続は無条件で拒否されます。これは一般に、特定のホストを グループから"除外"するのに役立ちます。

password

クライアントは、そのユーザ用に設定されたパスワードと合う パスワードを、接続を試みる際に要求されます。

passwordキーワードの後で、オプションの ファイル名が指定できます。このファイルは、このレコード が属するユーザのリストを含むはずで、オプションでは 代替パスワードも含みます。

パスワードはクリアテキストで、配線を通して送られます。 よりよい安全性のため、cryptメソッド を使って下さい。

crypt

password メソッドと同様ですが、 パスワードは簡単な挑戦応答プロトコルを使って暗号化された 配線を通して送られます。これは暗号文法的には安全ではありませんが、 偶発的な盗聴問題に対応することができます。ファイル名は このレコードが属するユーザのリストを持つcrypt キーワードを参照しても構いません。

krb4

Kerberos V4 がユーザを認証するために使われます。これは TCP/IP 接続のみに有効です。

krb5

ユーザを認証するために Kerberos V5 が使われます。 これは TCP/IP 接続のみに有効です。

ident

クライアントホスト上の ident サーバは接続しようとする ユーザの識別情報を要求されます。そこで Postgresは、そのように識別された オペレーティングシステムユーザが、要求されたデータベースユーザ として接続することが許可されるかどうかを確認します。 これは TCP/IP 接続のみに有効です。ident キーワードの後の認証オプション で、どのオペレーティングシステムユーザがどのデータベース ユーザと等しいかを指定するident map の名前を指定します。詳しい情報は下記も参照してください。

認証 option

このフィールドは、次に説明されているように、認証メソッドに よって異なった解釈をされます。

接続を試みるクライアント IP アドレスと要求されるデータベース名 に合う最初のレコードが認証過程を行うために使われます。 "通過""バックアップ"はありません。 もし一つのレコードが選ばれ認証が失敗すれば、次のレコードは検討 されません。合うレコードがなければ、アクセスは拒否されます。

pg_hba.conf ファイルは、それぞれの接続の 試みで再読みこみされます。ですから、サーバが動いている間に アクセス権限を変えることは簡単です。ただファイルを 編集すれば良いのです。

pg_hba.conf ファイルの一例が Example 4-1 の中で示されています。 異なる認証メソッドの詳細については下記を参照して下さい。

Example 4-1. pg_hba.confファイルの例

# TYPE       DATABASE    IP_ADDRESS    MASK               AUTHTYPE  MAP

# ローカルシステム上の全てのユーザが、どのデータベースにどのユーザ名
# でも接続することを許可するが、IP 接続を通してのみです。

host         all         127.0.0.1     255.255.255.255    trust     

#  Unix-socket 接続で、同上。

local        all                                          trust


# IP アドレス 192.168.93.x を持つどのホストからのどのユーザも
# データベース "template1" にそのホストのその ident が認識するのと
# 同じユーザ名(典型的には Unix ユーザ名)で接続することを許可します。
 
host         template1   192.168.93.0  255.255.255.0      ident     sameuser


# pg_shadow の中のユーザのパスワードが正しく与えられると、
# ホスト 192.168.12.10 からのユーザがデータベース "template1" 
# に接続することを許可します。

host         template1   192.168.12.10 255.255.255.255    crypt


# 先行する "host" 行がないため、これらの二行は 192.168.54.1 
# (この項目が最初に合うためです)からの全ての接続の試みを拒否しますが、
# インターネットの他の場所からの Kerberos V5 に検証された
# 接続は許可します。ゼロマスクは、ホスト IP アドレスのビットが 
# 検討されず、どのホストにも合うことを意味します。


host         all        192.168.54.1   255.255.255.255    reject
host         all        0.0.0.0        0.0.0.0            krb5


# もし ident チェックに通れば、192.168.x.x ホストからのユーザが
# どのデータベースにでも接続できるよう許可します。例えばもし、ident 
# がユーザは "bryanh" だと言って、彼が PostgreSQL ユーザ "guest1"
# として接続することを要求すると、接続は、"bryanh" が "guest1" として
# 接続することを許すマップ "omicron" の pg_ident.conf 項目があれば、
# 許可されます。


host         all        192.168.0.0    255.255.0.0        ident     omicron