以下では認証メソッドについて詳細に説明します。
Postgres データベースパスワードはどのオペレーティング システムのユーザパスワードとも別のものです。通常、それぞれの データベースユーザのパスワードは pg_shadow システムカタログテーブル の中に格納されます。パスワードは問い合わせ言語のコマンド CREATE USER と ALTER 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 USER と ALTER USERによって 管理される pg_shadow の中のメインパスワード を使用することを示します。パスワードがある行はそのパスワード が使われるようになります。"+" というパスワード 入力もやはり pg_shadow のパスワードが使われることを意味します。
crypt メソッドを使う場合、代替パスワードを使うことは できません。ファイルは通常通り評価されますが、パスワードフィールド は単に無視され pg_shadow のパスワードが使われます。
このように代替パスワードを使うことは、パスワードを変更するために ALTER USER を使うことができなくなることを 意味します。一見できているように見えますが、変えられたパスワード はシステムが最終的に使うことになるパスワードではありません。
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 のフックの中では、ユーザとサービスの 名前について以下が仮定されます。
ユーザのプリンシパル名 (anames) は実際の Unix/Postgres ユーザ名を第1要素として含むことが仮定されます。
Postgres サービスは、Version 4 で正規化されたように (つまり、すべてのドメイン接尾辞が削除された)2つの要素、サービス名と ホスト名、を持つことが仮定されます。
もし Apache ウェブサーバ上で mod_auth_krb と mod_perl を使う場合、 mod_perl スクリプトで AuthType KerberosV5SaveCredentials を 使うことができます。これは、ウェブ上で安全なデータベースアクセス を保証し、余計なパスワードは要求されません。
"身元確認(Identification)プロトコル" については RFC 1413で説明されています。事実上 全ての Unix ライクなオペレーティングシステムの配布には ident サーバがついていて、デフォルトで TCP ポート 113 を監視しています。 ident サーバの基本的な機能性は"どのユーザがポート Xからの接続を開始し、自分の ポート Yに接続するのか?" というような質問に答えることです。Postgres は 物理的な接続が確立されたときにX と Y の両方を認識するので、接続するクライアントのホスト上の 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-name は pg_hba.conf の中でこのマッピング を参照するために使われる任意の名前です。他の2つのフィールドは どのオペレーティングシステムユーザがどのデータベースユーザで 接続することが許可されるかを指定します。同じmap-name は別のユーザマッピングを指定するためにくり返し使うことが できます。さらに、与えられたオペレーティングシステムが何人の データベースユーザに対応できるか、またはその逆、に関する 制限はありません。
Example 4-1 の中でpg_hba.conf と結合して使うことが出来るpg_ident.conf は Example 4-2で示されています。 この設定の例では、192.168 ネットワーク上のマシンにログインした Unix ユーザ名 bryanh, ann, もしくは robert という名前を持たない 人はアクセス権限が認められません。Unix ユーザ robert は、 "robert"やその他ではなく Postgres ユーザ "bob" として接続するときのみ許可されます。 "ann"は"ann"としてのみ接続が 許可されます。ユーザ bryanh は"bryanh" 自身もしくは "guest1" として接続が許可されます。