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 and mod_perl を使う場合、 mod_perl スクリプトと一緒に AuthType KerberosV5SaveCredentials を 使うことができます。これはウェブ上で安全なデータベースアクセス を保証し、それ以上パスワードは要求されません。

4.2.3. Ident ベースの認証

"識別プロトコル" については 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 の中でこのマッピング を参照するために使われる任意の名前です。他の二つのフィールドは どのオペレーティングシステムユーザがどのデータベースユーザで 接続することが許可されるかを指定します。同じ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