このページでは、メジャー・バージョン番号v1.4からv1.8でJava Generic Security Services API (Java GSS)およびKerberosに追加されたセキュリティ機能および拡張機能について説明し、一覧表示します。
注: このドキュメントで説明するAPIおよび機能は、変更される場合があります。
Java SE 8のJava GSS APIおよびKerberos実装には、次の拡張機能が追加されました。
MS-SFUは、サービスがクライアントに代わってKerberosサービス・チケットを取得できるMicrosoft Kerberos 5の拡張機能を表します。これは、Kerberosによってクライアントとこのサービス間の認証が確立されない(したがって標準Kerberos委任を使用できない)が、サービスがクライアントの名前でKerberosでセキュリティ保護されたバックエンドサーバーにアクセスする必要がある場合に便利です。
MS-SFU拡張機能のサポートはJDK 8で追加されました。これには、MS-SFUで定義するように、S4U2selfおよびS4U2proxyプロトコルのサポートが含まれます。
この機能はセキュアなエンタープライズ・デプロイできわめて便利です。たとえば、一般的なネットワーク・サービスで、フロント・エンド(Webサーバーなど)は、クライアントの代わりにバックエンド(データベース・サーバーなど)にアクセスする必要がある場合があります。標準のKerberos 5は委任をサポートしますが、このチェーン内のすべてのレイヤーが各ステップで明示的にKerberos認証を使用することを必要するため、これは常に可能で、望ましいとは限らない場合があります。
たとえば、クライアントがDigest認証を使用して、Webサーバーにログインした場合、委任されるKerberosクレデンシャルがないため、通常の手順を追ったKerberos 5認証を行うことができません。ただし、MS-SFUでは、フロント・エンドがクライアントのKerberosクレデンシャルを提示しなくてもクライアントの代わりにバック・エンドにアクセスすることができるように、Service for User (S4U2self)拡張を定義しているため、MS-SFUはこの状況でも認証を提供できます。
さらに、標準Kerberos 5委任メカニズム(Microsoftではこれをオープン委任と呼ぶ)には、潜在的なセキュリティ・ギャップがあります。このメカニズムでは、サービス・アカウントがクライアントの委任されたクレデンシャルを持っていると、任意のサービスにアクセスできます。そのため、オープン委任には十分に注意する必要があります。
対照的に、MS-SFU委任(S4U2proxyに実装)ははるかに安全です。ここでは、管理者が、特定のサービスで委任できるサービスを厳密に制御できます。(Microsoftではこれを制約付き委任と呼びます)。
元のKerberos 5プロトコルはRFC 4120で定義されています。MS-SFUでは、そのプロトコルに2つの拡張を追加しており、Service for User to Self (S4U2self)はフロントエンド・サービスがユーザーの代わりに自分自身へのKerberosサービス・チケットを取得できるようにし、Service for User to Proxy (S4U2proxy)はユーザーの代わりに2番目のバックエンド・サービスへのサービス・チケットを取得できるようにします。
これらの2つの拡張はともに、フロントエンド・サービスがユーザーに代わってKerberosサービス・チケットを取得できるようにします。結果のサービス・チケットはローカルまたはリモート・マシンのその他のサービスへのアクセスに使用できます。
これらの拡張を実装するために、新しいpublicメソッド(GSSCredential::impersonate
)がcom.sun.security.jgss
パッケージに追加されました。
Java SE 6のJava Generic Security Services API (Java GSS)およびKerberos実装には、次の拡張機能が追加されました。
des-cbc-md5
des-cbc-crc
des3-cbc-sha1
Java SE 6から、Java GSS/KerberosのAES暗号化タイプ(AES128とAES256Triple DES暗号化タイプが指定されている)を使用できるようになります。これにより、Solaris 10やMIT KerberosなどのほかのKerberos実装と、Java SE Kerberos実装の相互運用性が改善されています。libdefaults
セクションの下に指定されています。それは、default_tkt_enctypes, default_tgs_enctypes, permitted_enctypes
のタグで、次のように指定されます。aes128-cts
aes128-cts-hmac-sha1-96
(AES256暗号化タイプ)aes256-cts
aes256-cts-hmac-sha1-96
注: JDK内のJCEフレームワークは、アプリケーションに暗号化アルゴリズムに関する制限を適用し、最高の暗号化強度を使用できるようにする機能を備えていますそのような制限は、「管轄ポリシー・ファイル」に指定されます。Java SEにバンドルされている管轄ポリシー・ファイルによって鍵の最大長が制限されています。このため、AES256暗号化タイプを使用するには、制限のないバージョンでJCE暗号化ポリシーをインストールして256ビットの鍵のAESを許可する必要があります。libdefaults
セクションには次のようなものが含まれます。default_tkt_enctypes = aes128-cts des3-cbc-sha1 des-cbc-md5 des-cbc-crc
default_tgs_enctypes = aes128-cts des3-cbc-sha1 des-cbc-md5 des-cbc-crc
permitted_enctypes = aes128-cts des3-cbc-sha1 des-cbc-md5 des-cbc-crc
default_tkt_enctypes
は、ticket-granting-ticketのセッション鍵で使用する暗号化タイプを指定するために使用されます。クライアントはこれを使用して、KDCとの通信で使用されるセッション鍵の暗号化タイプを制限します。デフォルト値はdes-cbc-md5 des-cbc-crc des3-cbc-sha1 aes128-cts
です。default_tgs_enctypes
は、サービス・チケットのセッション鍵で使用する暗号化タイプを指定するために使用されます。クライアントはこれを使用して、クライアントとサーバーによって共有されるセッション鍵の暗号化タイプを制限します。デフォルト値はdes-cbc-md5 des-cbc-crc des3-cbc-sha1 aes128-cts
です。permitted_enctypes
は、サービスによる使用が許可された暗号化タイプを指定するために使用されます。サーバーはこれを使用して、サーバーが受け入れるセッション鍵の暗号化タイプを制限します。デフォルト値はdes-cbc-md5 des-cbc-crc des3-cbc-sha1 aes128-cts
です。des-cbc-md5
des-cbc-crc
des3-cbc-sha1
Java SE 6から、Java GSS/KerberosのRC4-HMAC暗号化タイプを使用できるようになります。これにより、Windows、Solaris 10、MIT Kerberosなどの他のKerberos実装と、Java SE Kerberos実装の相互運用性が改善されています。Windows Active Directoryは、RC4-HMACをデフォルトのKerberos暗号化タイプとしてサポートしています。libdefaults
セクションの下に指定されています。それは、default_tkt_enctypes, default_tgs_enctypes, permitted_enctypes
のタグで次のように指定されます。rc4-hmac
arcfour-hmac
arcfour-hmac-md5
たとえば、構成ファイルのlibdefaultsセクションには次のようなものが含まれます。default_tkt_enctypes = aes128-cts des3-cbc-sha1 rc4-hmac des-cbc-md5 des-cbc-crc
default_tgs_enctypes = aes128-cts des3-cbc-sha1 rc4-hmac des-cbc-md5 des-cbc-crc
permitted_enctypes = aes128-cts des3-cbc-sha1 rc4-hmac des-cbc-md5 des-cbc-crc
default_tkt_enctypes
は、ticket-granting-ticketのセッション鍵で使用する暗号化タイプを指定するために使用されます。クライアントはこれを使用して、KDCとの通信で使用されるセッション鍵の暗号化タイプを制限します。デフォルト値はdes-cbc-md5 des-cbc-crc rc4-hmac des3-cbc-sha1 aes128-cts
です。default_tgs_enctypes
は、サービス・チケットのセッション鍵で使用する暗号化タイプを指定するために使用されます。クライアントはこれを使用して、クライアントとサーバーによって共有されるセッション鍵の暗号化タイプを制限します。デフォルト値はdes-cbc-md5 des-cbc-crc rc4-hmac des3-cbc-sha1 aes128-cts
です。permitted_enctypes
は、サービスによる使用が許可された暗号化タイプを指定するために使用されます。サーバーはこれを使用して、サーバーが受け入れるセッション鍵の暗号化タイプを制限します。デフォルト値はdes-cbc-md5 des-cbc-crc rc4-hmac des3-cbc-sha1 aes128-cts
です。OID "1.2.840.113554.1.2.2
を指定します。これは次のようにコーディングします。Oid mechOid = new Oid("1.2.840.113554.1.2.2");
OID "1.3.6.1.5.5.2"
を指定する必要があります。Oid mechOid = new Oid("1.3.6.1.5.5.2);
この機能を使用すると、Javaアプリケーションは、プラットフォームで使用可能なネイティブGSS実装の機能を利用できます。Java GSSによるネイティブGSSライブラリおよびネイティブ・メカニズムのリストへの委譲を有効にするには、システム・プロパティ「sun.security.jgss.native」をtrueに設定します。有効にすると、Java GSSは、オペレーティング・システム固有の名前を使用してネイティブGSSライブラリを検索します。たとえば、Solarisの場合にlibgss.so、またはLinuxの場合にlibgssapi.soなどです。必要なGSSライブラリの名前が異なっているか、またはこのライブラリがシステム・ライブラリのディレクトリにない場合は、システム・プロパティ「sun.security.jgss.lib」を使用してフル・パスを指定する必要があります。
Java SE 6では、ネイティブGSSサポートはSolarisおよびLinuxに限定されています。ネイティブGSS統合がサポートされていないプラットフォーム上でこれらのシステム・プロパティを設定しても無視されます。
最初のクレデンシャル取得をJAAS KerberosLoginModuleに依存しているデフォルトのJava GSS実装とは異なり、ネイティブGSSを使用する場合は、最初のクレデンシャルを事前に取得しておいてください。たとえば、JGSS APIを呼び出す前にkinitを呼び出します。
また、Subject.doAs(...)やSubject.doAsPrivileged(...)などの特定のサブジェクトとして操作を行う場合は、使用するGSSCredentialをサブジェクトのprivateクレデンシャル・セットに追加してください。このようにしない場合、クレデンシャルが見つからないためGSS操作が失敗します。
com.sun.security.jgss.krb5.initiate com.sun.security.jgss.krb5.accept
Java SE 5.0のJava Generic Security Services API (Java GSS)およびKerberos実装には、次の拡張機能が追加されました。
トリプルDES暗号化タイプは、Kerberos構成ファイルの「libdefaults」セクションで指定されます。それは「des3-cbc-sha1」と指定され、default_tkt_enctypes、default_tgs_enctypes、permitted_enctypesというタグが付きます。「dec3-cbc-sha1」には次の別名があります。
des3-hmac-sha1 des3-cbc-sha1-kd des3-cbc-hmac-sha1-kdたとえば、構成ファイルのlibdefaultsセクションには次のような行があります。
default_tkt_enctypes = des3-cbc-sha1 des-cbc-md5 des-cbc-crc default_tgs_enctypes = des3-cbc-sha1 des-cbc-md5 des-cbc-crc permitted_enctypes = des3-cbc-sha1 des-cbc-md5 des-cbc-crcdefault_tkt_enctypesは、Ticket-Granting-Ticketのセッション鍵で使用する暗号化タイプを指定するために使用されます。クライアントはこれを使用して、KDCとの通信で使用されるセッション鍵の暗号化タイプを制限します。デフォルト値は「des-cbc-md5 des-cbc-crc des3-cbc-sha1」です。
default_tgs_enctypesは、サービス・チケットのセッション鍵で使用する暗号化タイプを指定するために使用されます。クライアントはこれを使用して、クライアントとサーバーによって共有されるセッション鍵の暗号化タイプを制限します。デフォルト値は「des-cbc-md5 des-cbc-crc des3-cbc-sha1」です。
permitted_enctypesは、サービスによる使用が許可された暗号化タイプを指定するために使用されます。サーバーはこれを使用して、サーバーが受け入れるセッション鍵の暗号化タイプを制限します。デフォルト値は「des-cbc-md5 des-cbc-crc des3-cbc-sha1」です。
KDCにメッセージを送信するときに、メッセージのサイズがudp_preference_listよりも大きい場合、Java SE KerberosライブラリはTCPを使用します。メッセージのサイズがudp_preference_listより小さい場合は、UDPが3回まで試行されます。要求のサイズが大きすぎるという応答がKDCからあると、Java SE KerberosライブラリはTCPを使用します。
この機能により、Krb5LoginModuleがチケット・キャッシュから期限切れのチケットを取得した場合でも、TGTは自動的に更新され、チケットを要求した呼出し側のサブジェクトに追加されます。何らかの理由でチケットを更新できない場合、Krb5LoginModuleは構成済みのコールバック・ハンドラを使用してユーザー名とパスワードを検索し、新規TGTを取得します。
この機能を使用するには、チケット・キャッシュを使用するようにKrb5LoginModuleを構成し、新しく取り入れられたrenewTGTオプションをtrueに設定します。TGTの更新を要求するJAASログイン構成ファイルの例を次に示します。
server { com.sun.security.auth.module.Krb5LoginModule required principal=principal@your_realm useTicketCache=true renewTGT=true; };renewTGTがtrueに設定されている場合は、useTicketCacheもtrueに設定する必要があります。設定しない場合は構成エラーが発生します。
com.sun.net.ssl.server com.sun.net.ssl.clientJSSEアプリケーションが明示的なJAASプログラムなしでKerberos暗号化方式群を使用すると、SunJSSEプロバイダはこれらのインデックス名を使用してJAASログイン・モジュールを検出および構成し、必要なKerberosクレデンシャルを取得します。たとえば、そのようなアプリケーションには次のJAAS構成ファイルがあります。
com.sun.net.ssl.server { com.sun.security.auth.module.Krb5LoginModule required principal=service_principal@your_realm useKeyTab=true keyTab=keytab_name storeKey=true; };エントリが検出されない場合は、デフォルトの「他の」インデックス名が使用されます。TLSのサービス名は「host」です。たとえば、「KRBNT-OPERATIONS.EXAMPLE.COM」というレルム内の「raven.example.com」という名前のマシンでTLSサービスを実行する場合、サービス・プリンシパル名は次のようになります
host/raven.example.com@KRBNT-OPERATIONS.EXAMPLE.COMTLSクライアントには何の制限もないので、有効なKerberosプリンシパル名であれば使用可能です。
JSSEアプリケーションが明示的なJAASプログラムでKerberos暗号化方式群を使用する場合は、上述のインデックス名を含め、任意のインデックス名を使用できます。
java.security.krb5.kdc
およびjava.security.krb5.realm
を介して指定されます。前のリリースでは、Kerberos構成値への変更は、アプリケーションが再起動された場合にのみ有効になりました。
Javaプラットフォームの1.4.2リリースでは、JAAS構成ファイルのKrb5LoginModule
へのエントリに、新しいboolean型オプションrefreshKrb5Config
を指定できます。このオプションがtrue
に設定されている場合は、Krb5LoginModule
のlogin
メソッドが呼び出される前に、構成値がリフレッシュされます。
今回の1.4.2リリースにおけるSunのKerberos実装では、指定されていればスレーブKDCで再試行します。スレーブKDCは、Kerberos構成ファイルで指定するか、システム・プロパティjava.security.krb5.kdc
のコロン(:
)で区切られたKDCリストを介して指定することができます。
現行の1.4.2リリースでのSunのKerberos実装では、TCPの自動フォール・バックをサポートするようになりました。したがって、UDPを使用するKerberosチケット要求が失敗してKDCからエラー・コードKRB_ERR_RESPONSE_TOO_BIG
が返されると、TCPが自動的にデフォルト・トランスポートとなります。
これまでは、Kerberos V5でJava Generic Security Services API(JGSS)を使用する際に
useSubjectCredsOnly
プロパティがtrueに設定されている場合は、Ticket Granting Ticket (TGT)がサブジェクトから取得され、GSSセキュリティ・コンテキストを確立するために使用されていました。また、取得されたサービス・チケットは、サブジェクトに保管されませんでした。useSubjectCredsOnly
がtrueであれば、サービス・チケットもサブジェクトに保管されるようになりました。
クライアント・アプリケーションがサブジェクトの非公開クレデンシャルを検索しても、前のリリースではTGTのみが検出されました。このリリースでは、取得したサービス・チケットがすべて検出されます。
この変更に関するバグ報告については、4688866を参照してください。