4.2. 認証メソッド

以下では認証メソッドについて詳細に説明します。

4.2.1. パスワード認証

Postgres データベースパスワードはどのオペレーティング システムのユーザパスワードとも別のものです。通常、それぞれの データベースユーザのパスワードは pg_shadow システムカタログテーブル の中に格納されます。パスワードは問い合わせ言語のコマンド CREATE USERALTER USER、 例えばCREATE USER foo WITH PASSWORD 'secret';、を使って管理できます。デフォルトでは もしパスワードが設定されない場合、格納されるパスワードは NULLになり、そのユーザのパスワード認証は 常に失敗します。

特定のデータベースに接続することを許可するユーザの集合を 制限するために、pg_hba.conf があるのと 同じディレクトリに、別のファイルとしてユーザの集合を リストし(一行に一ユーザ)、pg_hba.confの中の password もしくは crypt キーワード のいずれかの後ろに(基本)ファイル名を挙げます。もしこの機能を 使わなければ、データベースシステムに認識されるすべてのユーザは すべてのデータベースに接続することができます(もちろん、そのユーザ がパスワード認証を通る限りはです)。

これらのファイルは、異なるパスワードの集合を特定のデータベース もしくはその集合に適用するために使われます。その場合、 ファイルは標準 Unix パスワードファイル/etc/passwd に似たフォーマットを持ち、下記のようになります。

username:password
パスワードの後にコロンで区切られたフィールドがあっても全て無視されます。 パスワードはシステムの crypt() 関数 を使って暗号化されることになっています。 Postgres と一緒にインストールされる ユーティリティ・プログラム pg_passwd が、これらのパスワードファイルを管理するために使うことが できます。

パスワードがある行とない行は、二次のパスワードファイルの中では 混在させることができます。パスワードがない行は、 CREATE USERALTER USERによって 管理される pg_shadow の中のメインパスワード を使用することを示します。パスワードがある行はそのパスワード が使われるようになります。"+" というパスワード 入力もやはり pg_shadow のパスワードが使われることを意味します。

crypt メソッドを使う場合、代替パスワードを使うことは できません。ファイルは通常通り評価されますが、パスワードフィールド は単に無視され pg_shadow のパスワードが使われます。

このように代替パスワードを使うことは、パスワードを変更するために ALTER USER を使うことができなくなることを 意味します。一見できているように見えますが、変えられたパスワード はシステムが最終的に使うことになるパスワードではありません。

4.2.2. Kerberos 認証

Kerberos は業界標準の安全な認証 システムで、公的ネットワークを越えた分散計算システムに 適しています。Kerberos システム の説明はこの文書の範囲外で、全般的にとても複雑(しかし強力な)もの になりえます。Kerberos FAQ もしくは MIT アテネプロジェクト は探策を始めるのによい場所となるでしょう。Kerberos いくつか配布版のソースが存在します。

Kerberos を使うためには、構築時にそのサポート が使用可能になっていなければなりません。Kerberos 4 と 5 の両方とも サポートされています(./configure --with-krb4 もしくは ./configure --with-krb5 のどちらかです)。

Postgres は通常の Kerberos サービスと同じように 動作するはずです。ビルド時に変えなければ、 サービスプリンシパルの名前は普通 postgresです。 サーバキーファイルが Postgres サーバアカウントから読み込み可能 (読み込みのみ可能なのが好ましい)であることを確認してください (Section 3.1参照)。キーファイルの場所は krb_server_keyfile 実行時設定パラメータで指定 されます。(Section 3.4も参照して下さい。) デフォルトでは、Kerberos 4 を使っている場合は /etc/srvtab で、Kerberos 5 を使う場合は FILE:/usr/local/pgsql/etc/krb5.keytab (もしくは ビルド時に sysconfdir が指定したディレクトリ)です。

keytab ファイルを作成するためには、例えば(version 5 では)下記のように します。

kadmin% ank -randkey postgres/server.my.domain.org
kadmin% ktadd -k krb5.keytab postgres/server.my.domain.org
詳細はKerberosのドキュメントを読んで下さい。

Kerberos 5 のフックの中では、ユーザとサービスの 名前について以下が仮定されます。

パラメータ
userfrew@S2K.ORG
useraoki/HOST=miyu.S2K.Berkeley.EDU@S2K.ORG
hostpostgres_dbms/ucbvax@S2K.ORG

もし Apache ウェブサーバ上で mod_auth_krb と mod_perl を使う場合、 mod_perl スクリプトで AuthType KerberosV5SaveCredentials を 使うことができます。これは、ウェブ上で安全なデータベースアクセス を保証し、余計なパスワードは要求されません。

4.2.3. Ident ベースの認証

"身元確認(Identification)プロトコル" については RFC 1413で説明されています。事実上 全ての Unix ライクなオペレーティングシステムの配布には ident サーバがついていて、デフォルトで TCP ポート 113 を監視しています。 ident サーバの基本的な機能性は"どのユーザがポート Xからの接続を開始し、自分の ポート Yに接続するのか?" というような質問に答えることです。Postgres は 物理的な接続が確立されたときにXY の両方を認識するので、接続するクライアントのホスト上の ident サーバ に応答指令信号を送ることができ、理論的には、この方法で与えられたどの 接続にもオペレーティングシステムユーザを決定できます。

このプロシージャの欠点は、クライアントの正直さに頼るところが 大きいということです。もしクライアントマシンが信用されない、もしくは 信用を失った場合、襲撃者はポート 113 上でほぼどんなプログラム でも実行することができ、どのユーザ名でも好きに選んで返すことができるのです。 したがってこの認証メソッドは、各々のクライアントマシンが厳格な 管理下にあり、データベースとシステム管理者が密接に連絡をとりあって 動作している、外界から閉ざされたネットワークにのみ相応しいといえます。 次の警告に注意して下さい。
 

The Identification Protocol is not intended as an authorization or access control protocol. (身元確認プロトコルは、認証、あるいはアクセス管理プロトコルにすること は意図されていません。)

 
--RFC 1413 

ident ベースの認証を使う場合、接続を開始したオペレーティングシステム ユーザを決定すると、Postgres は どのデータベースシステムユーザに接続してよいかを決定します。 これはpg_hba.confファイルの中の ident キーワードの後にくる ident マップ引数によって 制御されます。最も単純な ident マップは sameuser で、これはどのオペレーティングシステムユーザでも、同じ名前を持つ データベースユーザとして接続できるように許可するものです。 その他のマップは手動で作らなければいけません。

ident マップは、一般的なフォームの行を含むデータディレクトリの 中のファイル pg_ident.confの中にあります。

map-name ident-username database-username
コメントと空白は通常の方法で扱われます。map-namepg_hba.conf の中でこのマッピング を参照するために使われる任意の名前です。他の2つのフィールドは どのオペレーティングシステムユーザがどのデータベースユーザで 接続することが許可されるかを指定します。同じmap-name は別のユーザマッピングを指定するためにくり返し使うことが できます。さらに、与えられたオペレーティングシステムが何人の データベースユーザに対応できるか、またはその逆、に関する 制限はありません。

Example 4-1 の中でpg_hba.conf と結合して使うことが出来るpg_ident.confExample 4-2で示されています。 この設定の例では、192.168 ネットワーク上のマシンにログインした Unix ユーザ名 bryanh, ann, もしくは robert という名前を持たない 人はアクセス権限が認められません。Unix ユーザ robert は、 "robert"やその他ではなく Postgres ユーザ "bob" として接続するときのみ許可されます。 "ann""ann"としてのみ接続が 許可されます。ユーザ bryanh は"bryanh" 自身もしくは "guest1" として接続が許可されます。

Example 4-2. pg_ident.confファイルの例

#MAP           IDENT-NAME   POSTGRESQL-NAME

omicron        bryanh       bryanh
omicron        ann          ann
# bob has username robert on these machines
omicron        robert       bob
# bryanh can also connect as guest1
omicron        bryanh       guest1