GSSAPIは、RFC 2743で定義されている安全な認証のための業界標準のプロトコルです。
PostgreSQLは、GSSAPIをサポートしています。このGSSAPIは、暗号化された認証済みレイヤとして使用するか、認証のみに使用します。
GSSAPIは、GSSAPIをサポートするシステムに自動認証(シングルサインオン)を提供します。
認証自体は安全です。
GSSAPI暗号化(詳細はhostgssenc
を参照してください)、またはSSL暗号化を使用すると、データベース接続に沿って送信されるデータは暗号化されますが、それ以外の場合は暗号化されません。
GSSAPIサポートは、PostgreSQLを構築する時に有効にしなければなりません。詳細は、第16章を参照してください。
GSSAPIがKerberosを使用しているとき、GSSAPIは、
という書式の標準のプリンシパルを使用します。
[訳注:プリンシパルとは大雑把に2つのものを指します。1つはサービスを受けるクライアントで、もう1つはサービスを提供するサーバアプリケーションです。どちらも、認証に関してはKerberosのKDCから見るとクライアントになります]
PostgreSQLサーバはサーバにより使われるkeytabに含まれるいかなるプリンシパルも受け付けますが、servicename
/hostname
@realm
krbsrvname
接続パラメータを使ってクライアントから接続する場合には、プリンシパルの詳細を正確に指定することに注意を払う必要があります。
(33.1.2も参照してください。)
ビルド時に./configure --with-krb-srvnam=whatever
を使用することで、インストール時のデフォルトはデフォルトのpostgres
から変更が可能です。
多くの環境では、このパラメータは変更する必要はないでしょう。
いくつかのKerberosの実装では、異なるサービス名が必要になります。Microsoftアクティブディレクトリではサービス名は(POSTGRES
)のように大文字にする必要があります。
hostname
はサーバマシンの完全修飾されたホスト名です。
サービスプリンシパルのrealmはサーバマシンが提起したrealmです。
クライアントのプリンシパルはpg_ident.conf
で異なるPostgreSQLのデータベースユーザ名にマップできます。
例えば、pgusername@realm
を単なるpgusername
にマップできます。
もう1つの方法として、プリンシパル名全体username@realm
をPostgreSQLのロール名としてマッピングなしに使うこともできます。
PostgreSQLはプリンシパルからrealmを外すパラメータもサポートしています。
この方法は後方互換のためにサポートされているものであり、異なるrealmから来た同じユーザ名の異なるユーザを区別することができませんので、使用しないことを強く薦めます。
この方法を有効にするにはinclude_realm
を0に設定してください。
単純な単一realmの設定では、(プリンシパルのrealmがkrb_realm
パラメータ内のものと正確に一致するか確認する)krb_realm
パラメータと組み合わせることが安全です。
しかし、これはpg_ident.conf
で明示的なマッピングを指定するのに比べてあまり適切でない選択でしょう。
サーバ鍵ファイルがPostgreSQLサーバアカウントによって読み込み可能(そしてできれば読み込み専用で書き込み不可)であることを確認してください。
(18.1を参照してください。)
鍵ファイルの保存場所はkrb_server_keyfile設定パラメータで指定されます
デフォルトは、/usr/local/pgsql/etc/krb5.keytab
(もしくはビルド時にsysconfdir
で指定されたディレクトリ)です。
セキュリティ上の理由から、システムkeytabファイルで許可するよりも、PostgreSQLサーバ用に別のkeytabファイルを使うことをお薦めします。
keytabファイルはKerberosのソフトウェアによって作成されます。詳細はKerberosのドキュメントを参照してください。 MIT互換のKerberos5実装の例を以下に示します。
kadmin%
ank -randkey postgres/server.my.domain.org
kadmin%
ktadd -k krb5.keytab postgres/server.my.domain.org
データベースに接続しようとしている時要求されるデータベースユーザ名に一致するプリンシパルのチケットを所有しているか確認してください。
例えば、データベースユーザ名fred
に対し、fred@EXAMPLE.COM
のプリンシパルは接続できるでしょう。
fred/users.example.com@EXAMPLE.COM
のプリンシパルも許可するためには20.2内に記述されているユーザ名マップを使用して下さい。
次の設定オプションはGSSAPIのためにサポートされています。
include_realm
0に設定されている場合は、認証されたユーザプリンシパルからのrealm名が、ユーザ名マッピング(20.2)で渡されるシステムユーザ名から外されています。
krb_realm
も一緒に使われていない限り、これは複数realm環境で安全ではありませんので、非推奨であり、主に後方互換性のために利用できます。
include_realm
をデフォルト(1)にしたまま、プリンシパル名をPostgreSQLユーザ名に変換するためにpg_ident.conf
で明示的なマッピングを指定することをお薦めします。
map
システムとデータベースの間のマッピングを許可します。
詳細は20.2を参照してください。
GSSAPI/Kerberosプリンシパルusername@EXAMPLE.COM
(もしくは、あまり一般的ではありませんがusername/hostbased@EXAMPLE.COM
)に対しては、もしinclude_realm
が0に設定されていない限り、マッピングに使われるユーザ名はusername@EXAMPLE.COM
(もしくはusername/hostbased@EXAMPLE.COM
)です。
0に設定されている場合には、username
(もしくはusername/hostbased
)がマッピング時のシステムユーザ名です。
krb_realm
realmをユーザプリンシパル名に一致するように設定します。 もしこのパラメータが設定されている場合はそのrealmのユーザのみが受け付けられます。 もしこれが設定されていない場合は、どのようなrealmのユーザも接続可能で、ユーザ名マッピングが設定されていれば、どれでも影響を受けます。