GSSAPIは、RFC 2743で定義されている安全な認証のための業界標準のプロトコルです。 PostgreSQLは、GSSAPIを認証、通信の暗号化、あるいはその両方のためにサポートしています。 GSSAPIは、GSSAPIをサポートするシステムに自動認証(シングルサインオン)を提供します。 認証自体は安全です。 GSSAPI暗号化、またはSSL暗号化を使用すると、データベース接続に沿って送信されるデータは暗号化されますが、それ以外の場合は暗号化されません。
GSSAPIサポートは、PostgreSQLを構築する時に有効にしなければなりません。詳細は、第17章を参照してください。
GSSAPIがKerberosを使用しているとき、GSSAPIは、という書式の標準のサービスプリンシパル名を使用します。
[訳注:プリンシパルとは大雑把に2つのものを指します。1つはサービスを受けるクライアントで、もう1つはサービスを提供するサーバアプリケーションです。どちらも、認証に関してはKerberosのKDCから見るとクライアントになります]
特定のインストールによって使用されるプリンシパル名はPostgreSQLサーバでは決してエンコードされません。
そうではなくて、サーバが自身の識別を決定するために読み込むkeytabファイルで指定されます。
そのkeytabファイルに複数のプリンシパルが列挙されている場合は、サーバはそのうちのどれか一つを受け付けます。
サーバのrealm名は、サーバがアクセスできるKerberos設定ファイルで指定されたものが優先的に採用されます。
servicename/hostname@realm
接続する際には、クライアントは接続しようとしているサーバのプリンシパル名を知っておかなければなりません。
プリンシパルのservicename部は通常postgresですが、libpqのkrbsrvname接続パラメータで選択できます。
hostname部はlibpqが接続要求されている完全修飾ホスト名です。
realm名はクライアントがアクセスできるKerberos設定ファイルで指定されているrealmです。
クライアントは、自身の識別目的でプリンシパル名も持ちます(このプリンシパルの有効なチケットも持っていなければなりません)。
認証にGSSAPIを使うためには、クライアントプリンシパルはPostgreSQLデータベースユーザ名に紐付いていなければなりません。
pg_ident.conf設定ファイルを使ってプリンシパルをユーザ名にマップできます。
例えば、pgusername@realmを単なるpgusernameにマップできます。
もう1つの方法として、プリンシパル名全体username@realmをPostgreSQLのロール名としてマッピングなしに使うこともできます。
PostgreSQLはまたプリンシパルから単にrealmを外すことにより、クライアントプリンシパルをユーザ名にマップする方法をサポートしています。
この方法は後方互換のためにサポートされているものであり、異なるrealmから来た同じユーザ名の異なるユーザを区別することができませんので、使用しないことを強く薦めます。
この方法を有効にするにはinclude_realmを0に設定してください。
単純な単一realmの設定では、(プリンシパルのrealmがkrb_realmパラメータ内のものと正確に一致するか確認する)krb_realmパラメータと組み合わせることが安全です。
しかし、これはpg_ident.confで明示的なマッピングを指定するのに比べてあまり適切でない選択でしょう。
サーバのkeytabファイルの場所はkrb_server_keyfile設定パラメータで指定されます。 セキュリティ上の理由から、サーバがシステムkeytabファイルの読み込むことを許可するよりも、PostgreSQLサーバ用に別のkeytabファイルを使うことをお薦めします。 サーバ鍵ファイルがPostgreSQLサーバアカウントによって読み込み可能(そしてできれば読み込み専用で書き込み不可)であることを確認してください。 (19.1を参照してください。)
keytabファイルはKerberosのソフトウェアを使って作成されます。詳細はKerberosのドキュメントを参照してください。 MIT Kerberosのkadminツールを使って行う例を以下に示します。
kadmin%addprinc -randkey postgres/server.my.domain.orgkadmin%ktadd -k krb5.keytab postgres/server.my.domain.org
次の認証オプションはGSSAPIのためにサポートされています。
include_realm
0に設定されている場合は、認証されたユーザプリンシパルからのrealm名が、ユーザ名マッピング(21.2)で渡されるシステムユーザ名から外されています。
krb_realmも一緒に使われていない限り、これは複数realm環境で安全ではありませんので、非推奨であり、主に後方互換性のために利用できます。
include_realmをデフォルト(1)にしたまま、プリンシパル名をPostgreSQLユーザ名に変換するためにpg_ident.confで明示的なマッピングを指定することをお薦めします。
map
クライアントプリンシパルからデータベースユーザ名へのマッピングを許可します。
詳細は21.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_realmrealmをユーザプリンシパル名に一致するように設定します。 もしこのパラメータが設定されている場合はそのrealmのユーザのみが受け付けられます。 もしこれが設定されていない場合は、どのようなrealmのユーザも接続可能で、ユーザ名マッピングが設定されていれば、どれでも影響を受けます。
pg_hba.confのエントリによって異なるこれらの設定に加え、サーバ全体のkrb_caseins_users設定パラメータがあります。
これが真に設定されていれば、クライアントプリンシパルは大文字小文字を区別せずにユーザマップを照合します。
krb_realmが設定されている場合も、大文字小文字を区別せずに照合します。