クライアントアプリケーションがデータベースサーバに接続すると、 Unix コンピュータに特定のユーザとしてログイン する時と同じように、どのPostgresユーザ名で接続 したいかを指定します。SQL 環境の中では有効なデータベースユーザ名 がデータベースのオブジェクトへのアクセス権限を決めます。それに関する くわしい情報はChapter 7を参照して下さい。 したがって、どのデータベースユーザ名で指定されたクライアントが 接続できるかを制限することは明かに重要なのです。
認証は、データベースサーバがクライアントの 識別情報を確立し、クライアントアプリケーション(もしくは クライアントアプリケーションを実行するユーザ)が要求されたユーザ名 で接続することができるかを決定するプロセスです。
Postgres は(クライアントの)ホストと データベースにより、いくつかの異なる有効な認証メソッドで クライアント認証を提供します。
Postgres データベースユーザ名は データベースサーバが走っているオペレーティングシステムのユーザ名とは論理的に 異なります。もし特定のサーバのすべてのユーザがサーバマシン上にも アカウントを持っている場合、彼らの Unix ユーザ ID と同じ データベースユーザ名を割り当てることは理にかなっています。 しかし、リモート接続を受け入れるサーバは、ローカルアカウントを 持たない多くのユーザをかかえるかもしれず、そのような場合には データベースユーザ名と Unix ユーザ名との間の関連性は必要 ありません。
クライアント認証は、$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 ]これらのフィールドの意味を以下に示します。
このレコードは Unix ドメインソケット越しの接続に対応します。
このレコードは TCP/IP ネットワーク越しの接続に対応します。 ただし、サーバが -i オプションで起動されているか 同等のパラメータが設定されていない限り、TCP/IP 接続は まったくできないので注意してください。
このレコードは TCP/IP 越しの SSL を使った接続に対応します。 このオプションを使うためには、サーバは SSL サポートができるよう 構築されていなければなりません。更に、SSL は サーバ起動時に -l オプションもしくは同等の設定がされていなければ いけません。
このレコードが適用されるデータベースを指定します。 all 値はそれが全てのデータベースに適用される ことを指定し、sameuser は接続ユーザと同じ名前を持つ データベースとして識別します。それら以外は、特定の Postgresデータベースの名前になります。
これらの2つのフィールドは、IP アドレスに基づいて、 どのホストにhost レコードが適用されるかを 制御します。(もちろん IP アドレスは偽ることができますが、 その吟味は Postgres の守備範囲外 です。)的確な論理は、
がゼロでなければレコードとマッチしません。
ユーザがそのデータベースに接続する際に自分を認証するために 使わなければならないメソッドを指定します。可能な選択肢は 下記のとおりですが、詳しくは Section 4.2にあります。
接続は無条件で許可されます。このメソッドは、クライアントホスト にログインできるすべてのユーザに対して、 Postgresのどのユーザを使っても 接続することを許可します。
接続は無条件に拒否されます。これは、特定のホストを グループから"除外"するためには、概ね役に立ちます。
接続を試みる際にクライアントは、そのユーザ用に設定されたパスワードと一致する パスワードを要求されます。
passwordキーワードの後に、オプションの ファイル名を指定できます。指定されたファイルは、このレコード で対応するユーザのリストを含むはずで、オプションで 代替パスワードも含みます。
パスワードはクリアテキストのまま配線を通して送られます。 もっとましな防御のためにはcryptメソッド を使って下さい。
password メソッドと同様ですが、 パスワードは、簡単なチャレンジレスポンス・プロトコルを使って暗号化され、 配線を通して送られます。これは暗号手法的には安全ではありませんが、 偶発的な盗聴の問題には対応できます。 crypt キーワードに続く名前のファイルに は、このレコードが対応するユーザのリストが含まれます。
ユーザを認証するために Kerberos V4 が使われます。これは TCP/IP 接続のみに有効です。
ユーザを認証するために Kerberos V5 が使われます。 これは TCP/IP 接続のみに有効です。
接続しようとするユーザの身元を、クライアントホスト上の ident サーバに尋ねます。それから、 Postgresは、身元確認されたその オペレーティングシステムのユーザが、要求されたデータベースユーザ として接続することが許可されるかどうかを確認します。 これは TCP/IP 接続のみに有効です。ident キーワードの後の認証オプション は、どのオペレーティングシステムユーザがどのデータベース ユーザに等しくなるかを指定するident map の名前を指定します。詳しい情報は下記も参照してください。
このフィールドは、次に説明するように、認証メソッドに よって異なった解釈をされます。
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