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

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

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

これらの2つのフィールドは、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 アドレスと要求されるデータベース名 に一致する最初のレコードが認証過程に使われます。 "通過""バックアップ"はありません。 もし1つのレコードが選ばれ認証が失敗すれば、次のレコードは検討 されません。もし、一致するレコードがなければ、アクセスは拒否されます。

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


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


host         all        192.168.0.0    255.255.0.0        ident     omicron