クライアントアプリケーションがデータベースサーバに接続すると、 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 の一般的なフォーマットは 一組のレコードで、一行につき一組です。空行とハッシュ文字 ("#")で始まる行は無視されます。レコードは スペースもしくはタブで区切られたいくつかの数字のフィールド によって成り立っています。レコードは行を跨いで続けることはできません。
レコードは次の三つのうちのどれかのフォーマットを持ちます。
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データベースの名前になります。
これらの二つのフィールドは、IP アドレスに基づいて、 どのホストにhost レコードが適用されるかを 管理します。(もちろん IP アドレスは考慮できますが、 この検討は Postgres の守備範囲外 です。)正確な論理は、
がレコードと合うためにはゼロでなければいけないということです。(actual-IP-address xor IP-address-field) and IP-mask-field
ユーザがそのデータベースに接続する際に自分を認証するために 使わなければならないメソッドを指定します。可能な選択子は 下記ですが、詳しくは 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 # もし ident チェックに通れば、192.168.x.x ホストからのユーザが # どのデータベースにでも接続できるよう許可します。例えばもし、ident # がユーザは "bryanh" だと言って、彼が PostgreSQL ユーザ "guest1" # として接続することを要求すると、接続は、"bryanh" が "guest1" として # 接続することを許すマップ "omicron" の pg_ident.conf 項目があれば、 # 許可されます。 host all 192.168.0.0 255.255.0.0 ident omicron