以下は認証メソッドについて詳細に説明します。
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 ユーザ名を第一要素として含むことが仮定されます。
Postgres サービスは、Version 4 で正規化されたように (つまり、すべてのドメイン接尾辞が削除された)二つの要素、サービス名と ホスト名、を持つことが仮定されます。
パラメータ | 例 |
---|---|
user | frew@S2K.ORG |
user | aoki/HOST=miyu.S2K.Berkeley.EDU@S2K.ORG |
host | postgres_dbms/ucbvax@S2K.ORG |
もし Apache ウェブサーバ上で mod_auth_krb and mod_perl を使う場合、 mod_perl スクリプトと一緒に AuthType KerberosV5SaveCredentials を 使うことができます。これはウェブ上で安全なデータベースアクセス を保証し、それ以上パスワードは要求されません。
"識別プロトコル" については 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 の中でこのマッピング を参照するために使われる任意の名前です。他の二つのフィールドは どのオペレーティングシステムユーザがどのデータベースユーザで 接続することが許可されるかを指定します。同じ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" として接続が許可されます。