Simple Authentication and Security Layer (SASL)プロトコルは、認証を指定し、オプションでクライアント・アプリケーションとサーバー・アプリケーションの間のセキュリティ層の確立を指定します。
SASLは、認証、およびクライアント・アプリケーションとサーバー・アプリケーションの間のセキュリティ層の確立(オプション)を行うプロトコルを指定するインターネット標準(RFC 2222)です。SASLは認証データの交換方法を定義しますが、そのデータの内容は指定しません。認証データの内容およびセマンティックスを指定する特定の認証メカニズムが適合できるフレームワークです。
SASLは、Lightweight Directory Access Protocol、バージョン3 (LDAP v3)やInternet Message Access Protocol、バージョン4 (IMAP v4)などのプロトコルによって、プラガブル認証を有効にするために使用されます。認証方式をプロトコルに固定するかわりに、LDAP v3およびIMAP v4はSASLを使用して認証を実行するため、様々なSASLメカニズムによる認証が可能になります。
さまざまなセキュリティ・レベルおよび配備シナリオ用にインターネット・コミュニティによって定義された、多数の標準SASLメカニズムがあります。その範囲はセキュリティなし(匿名認証など)から高セキュリティ(Kerberos認証など)にいたるまで、さまざまなレベルがあります。
Java SASL API
Java SASL APIは、SASLメカニズムを使用するアプリケーション用のクラスおよびインタフェースを定義します。これは、メカニズムに依存しないものとして定義されています。APIを使用するアプリケーションを、特定のSASLメカニズムの使用に固定する必要はありません。このAPIは、クライアントとサーバーの両方のアプリケーションをサポートしています。アプリケーションは、受動的な辞書攻撃の影響を受けやすいかどうか、および匿名認証を受け入れるかどうかなど、必要なセキュリティ機能に基づいて使用するメカニズムを選択できます。
Java SASL APIでは、開発者は独自のカスタムSASLメカニズムを使用することもできます。SASLメカニズムは、Java暗号化アーキテクチャ(JCA)リファレンス・ガイド(JCA)を使用してインストールされます。
SASLをいつ使用するか
SASLは、プラガブルな認証とセキュリティ層をネットワーク・アプリケーションに提供します。Java SEには、Java Secure Socket Extension (JSSE)リファレンス・ガイドやJava Generic Security Serviceなど、同様の機能を提供するその他の機能があります。
Java GSSは、Generic Security Service Application Programming Interface GSS-API用のJava言語バインディングです。
Java SEでは、このAPIの下で現在サポートされているメカニズムは、Kerberos v5のみです。
JSSEおよびJava GSSと比較すると、SASLは相対的に軽量であり、最近のプロトコルの中で一般的です。一般的かつ軽量な(インフラストラクチャ・サポートの点で) SASLメカニズムがいくつか定義されているという利点もあります。一方、主要なJSSEおよびJava GSSメカニズムは相対的に重量のあるメカニズムを持ち、より精巧なインフラストラクチャ(それぞれ公開鍵インフラストラクチャおよびKerberos)を必要とします。
SASL、JSSEおよびJava GSSは、しばしば併用されます。たとえば、一般的なパターンでは、アプリケーションはセキュアなチャネルを確立するためにJSSEを使用し、クライアントのユーザー名/パスワードベースの認証にはSASLを使用します。GSS-APIメカニズムの上位層となるSASLメカニズムもあります。一般的な例は、LDAPで使用されるSASL GSS-API/Kerberos v5メカニズムです。
プロトコルをゼロから定義および構築する場合を除き、どのAPIを使用するかを決定する場合の最大要因は、多くの場合プロトコル定義です。たとえば、LDAPおよびIMAPはSASLを使用するように定義されているので、これらのプロトコルに関係するソフトウェアはJava SASL APIを使用するようにしてください。Kerberosアプリケーションおよびサービスを構築する場合、使用するAPIはJava GSSです。プロトコルとしてSSL/TLSを使用するアプリケーションおよびサービスを構築する場合、使用するAPIはJSSEです。
Java SASL APIには、インタフェースSaslClient
およびSaslServer
があります。これらは、クライアント側APIとサーバー側APIを表します。
SASLはチャレンジ応答プロトコルです。サーバーはクライアントにチャレンジを発行し、クライアントはチャレンジに基づいて応答を送信します。この交換は、サーバーが充足してチャレンジを発行しなくなるまで続きます。これらのチャレンジおよび応答は、任意の長さのバイナリ・トークンです。カプセル化を行うプロトコル(LDAPやIMAPなど)は、これらのトークンのエンコードおよび交換方法を指定します。たとえば、LDAPは、SASLトークンがLDAPバインド要求および応答にどのようにカプセル化されるかを指定します。
Java SASL APIは、この相互作用と使用方法のスタイルに従ってモデル化されています。インタフェースSaslClient
およびSaslServer
があり、これらはそれぞれクライアント側およびサーバー側のメカニズムを表します。アプリケーションはチャレンジと応答を表すバイト配列によって、メカニズムと相互に作用します。サーバー側のメカニズムは、充足されるまでチャレンジの発行と応答の処理を繰り返します。一方、クライアント側のメカニズムは、サーバーが充足されるまでチャレンジの評価と応答の発行を繰り返します。メカニズムを使用しているアプリケーションが、それぞれの反復を制御します。つまり、それは、チャレンジまたは応答をプロトコル・パケットから抽出してメカニズムに渡し、メカニズムから返された応答またはチャレンジをプロトコル・パケットに入れて、ピアに送信します。
SASLメカニズムを使用するクライアント・コードおよびサーバー・コードは、特定のメカニズムを使用するように固定はされていません。SASLを使用する多くのプロトコルでは、サーバーは、サポートするSASLメカニズムのリストを(静的または動的に)通知します。クライアントは、セキュリティ要件に基づいて、これらの1つを選択します。
Sasl
クラスが、SaslClient
およびSaslServer
のインスタンスの作成に使用されます。次に、使用可能なSASLメカニズムのリストを使用して、アプリケーションがどのようにSASLクライアント・メカニズムを作成するかの例を示します。
String[] mechanisms = new String[]{"DIGEST-MD5", "PLAIN"}; SaslClient sc = Sasl.createSaslClient(mechanisms, authzid, protocol, serverName, props, callbackHandler);
プラットフォームによってサポートされるメカニズムの可用性およびパラメータで提供されるその他の構成情報に基づいて、Java SASLフレームワークは一覧されているメカニズムの1つを選択し、SaslClient
のインスタンスを返します。
選択されたメカニズムの名前は、通常、アプリケーション・プロトコルによってサーバーに転送されます。メカニズム名を受信すると、サーバーは、クライアントから送信された応答を処理するために、対応するSaslServer
オブジェクトを作成します。次に、サーバーがSaslServer
のインスタンスを作成する方法の例を示します。
SaslServer ss = Sasl.createSaslServer(mechanism, protocol, myName, props, callbackHandler);
このAPIは、アプリケーションがメカニズムに入力を渡すための3つの方法を提供します。
Java SASL APIは汎用フレームワークなので、多数の異なるタイプのメカニズムに対応できる必要があります。各メカニズムは入力によって初期化される必要があり、先に進むために入力を必要とする場合があります。このAPIは、アプリケーションがメカニズムに入力を渡すための、次の3つの手段を提供します。
SaslClient
のメカニズムの場合、入力パラメータは承認ID、プロトコルIDおよびサーバー名です。SaslServer
のメカニズムの場合、共通入力パラメータはプロトコルIDおよび(完全修飾された固有の)サーバー名です。Sasl.QOP
、Sasl.STRENGTH
およびSasl.MAX_BUFFER
など、いくつかの標準プロパティを定義します。パラメータは、特定のメカニズムに固有の非標準のプロパティを渡す場合にも使用できます。Interface CallbackHandler
パラメータを使用して、事前に定めることができないかメカニズム間で共通でない可能性がある入力を提供します。メカニズムが入力データを必要とする場合、アプリケーションによって渡されたコールバック・ハンドラを使用してデータを収集します。アプリケーションのエンド・ユーザーから収集する場合もあります。たとえば、メカニズムは、アプリケーションのエンド・ユーザーに名前とパスワードを指定するように要求する場合があります。 メカニズムは、javax.security.auth.callback
パッケージで定義されたコールバックを使用できます。これらは、認証を実行するアプリケーションを構築するのに便利なジェネリック・コールバックです。メカニズムは、レルムおよび認証情報を収集するためのコールバックなどの、SASL固有のコールバック、または(標準化されていない)メカニズム固有のコールバックを必要とする場合もあります。アプリケーションは様々なメカニズムに対応できるようにする必要があります。したがって、そのコールバック・ハンドラは、メカニズムが要求する可能性があるすべてのコールバックに対応できることが必要です。これは、任意のメカニズムに対しては一般的には不可能ですが、通常は配備および使用されているメカニズムは数が限定されているため、実現可能です。
アプリケーションがメカニズムを作成すると、アプリケーションはメカニズムを使用してSASLトークンを取得し、ピアと交換します。
SaslClient
が使用されるかを示します。 クライアント・アプリケーションはメカニズム(sc
)を使用して認証の各ステップを繰り返し、サーバーから取得したチャレンジを評価してサーバーに応答を返信します。クライアント・アプリケーションはメカニズムまたはアプリケーション・レベルのプロトコルが認証が完了したことを示すまで、またはメカニズムがチャレンジを評価できない場合に、このサイクルを続行します。メカニズムがチャレンジを評価できない場合、エラーを示す例外をスローし、認証を終了します。完了状態に関してメカニズムとプロトコルの間で不一致がある場合は、認証交換に障害があることを示す可能性があるため、エラーとして処理します。
例10-2では、サーバーでどのようにSaslServer
が使用される可能性があるかを示します。
サーバー・アプリケーションはクライアントの応答をメカニズム(ss
)に渡して処理することによって、認証の各ステップを繰り返します。応答が不正な場合、サーバーがエラーを報告して認証を終了できるように、メカニズムはSaslException
をスローしてエラーを示します。応答が正しい場合、メカニズムはクライアントに送信されるチャレンジ・データを返し、認証が完了したかどうかを示します。チャレンジ・データは「成功」を示すデータを伴うことができます。これは、たとえば、ネゴシエーションされた状態をクライアントに完結させるために使用される場合があります。
例10-1 認証にSASLクライアントを使用するサンプル・コード
// Get optional initial response byte[] response = (sc.hasInitialResponse() ? sc.evaluateChallenge(new byte[]) : null); String mechanism = sc.getMechanismName(); // Send selected mechanism name and optional initial response to server send(mechanism, response); // Read response msg = receive(); while (!sc.isComplete() && (msg.status == CONTINUE || msg.status == SUCCESS)) { // Evaluate server challenge response = sc.evaluateChallenge(msg.contents); if (msg.status == SUCCESS) { // done; server doesn't expect any more SASL data if (response != null) { throw new IOException( "Protocol error: attempting to send response after completion"); } break; } else { send(mechanism, response); msg = receive(); }
例10-2 認証にSASLサーバーを使用するサンプル・コード
// Read request that contains mechanism name and optional initial response msg.receive(); // Obtain a SaslServer to perform authentication SaslServer ss = Sasl.createSaslServer(msg.mechanism, protocol, myName, props, callbackHandler); // Perform authentication steps until done while (!ss.isComplete()) { try { // Process response byte[] challenge = sc.evaluateResponse(msg.contents); if (ss.isComplete()) { send(mechanism, challenge, SUCCESS); } else { send(mechanism, challenge, CONTINUE); msg.receive(); } } catch (SaslException e) { send(ERROR); sc.dispose(); break; } }
認証のみをサポートするSASLメカニズムだけでなく、認証後にネゴシエーション済みのセキュリティ層の使用をサポートするSASLメカニズムもあります。セキュリティ層の機能はアプリケーションがSSL/TLSなどのほかの手段を使用してピアと安全に通信する場合は、使用されない場合がよくあります。
セキュリティ層がネゴシエーション済みの場合、ピアとの後続の通信はすべてセキュリティ層を使用して発生します。セキュリティ層がネゴシエーション済かどうかを判別するには、ネゴシエーション済のSasl.QOP
をメカニズムから取得します。次に、セキュリティ層がネゴシエーション済みかどうかを判別する方法の例を示します。
String qop = (String) sc.getNegotiatedProperty(Sasl.QOP); boolean hasSecurityLayer = (qop != null && (qop.equals("auth-int") || qop.equals("auth-conf")));
Sasl.QOP
プロパティが整合性または機密性、あるはその両方がネゴシエーション済みであることを示している場合、セキュリティ層はネゴシエーション済みです。
ネゴシエーション済の層を使用してピアと通信するには、アプリケーションは最初にwrap
メソッドを使用し、ピアに送信されるデータをエンコードして、ラップされたバッファを生成します。次に、ラップされたバッファ内のオクテットの数を表す長さフィールドとそれに続いてラップされたバッファの内容をピアに転送します。オクテットのストリームを受信するピアは長さフィールドを除くバッファをunwrap
に渡し、ピアによって送信された復号化されたバイトを取得します。このプロトコルの詳細はRFC 2222で説明されています。例10-3では、クライアント・アプリケーションでセキュリティ層を使用してアプリケーション・データがどのように送受信されるかを示します。
例10-3 SASLクライアントのデータ送受信のサンプル・コード
// Send outgoing application data to peer byte[] outgoing = ...; byte[] netOut = sc.wrap(outgoing, 0, outgoing.length); send(netOut.length, netOut); // send to peer // Receive incoming application data from peer byte[] netIn = receive(); // read length and ensuing bytes from peer byte[] incoming = sc.unwrap(netIn, 0, netIn.length);
SASLメカニズムの実装は、SASLセキュリティ・プロバイダによって提供されます。各プロバイダは、1つ以上のSASLメカニズムをサポートでき、JCAを使用して登録されます。
security.provider.7=com.sun.security.sasl.Provider
Javaセキュリティ・プロパティ・ファイル(java-home/conf/security/java.security
)内。
SASLプロバイダを追加または削除するには、セキュリティ・プロパティ・ファイルで対応する行を追加または削除します。たとえば、SASLプロバイダを追加し、そのメカニズムが、SunSASLプロバイダによって実装されている同じメカニズムよりも優先して選択されるようにする場合は、セキュリティ・プロパティ・ファイルに、より小さい番号で行を追加します。
security.provider.7=com.example.MyProvider security.provider.8=com.sun.security.sasl.Provider
この場合、java.security.Security
クラスを使用して、プログラムで独自のプロバイダを追加することもできます。たとえば、次のサンプル・コードは、使用可能なSASLセキュリティ・プロバイダのリストにcom.example.MyProvider
を登録します。
Security.addProvider(new com.example.MyProvider());
アプリケーションが1つ以上のメカニズム名を指定してSASLメカニズムを要求すると、SASLフレームワークは、登録済みプロバイダのリストを順に検索して、そのメカニズムをサポートする登録済みのSASLプロバイダを探します。次に、プロバイダは、要求されたメカニズムがSasl
内の選択ポリシー・プロパティに一致するかどうかを判別し、一致する場合は、メカニズムの実装を返します。
選択ポリシー・プロパティは特定の攻撃の受けやすさなど、メカニズムのセキュリティ面を指定します。これらは、その実装というよりもメカニズム(定義)の特性であるため、すべてのプロバイダは特定のメカニズムについて同じ結果になるはずです。たとえば、PLAINメカニズムは、どのように実装されるかにかかわらず、平文攻撃を受けやすくなります。選択ポリシー・プロパティが指定されない場合、メカニズムの選択に制限はありません。これらのプロパティを使用して、アプリケーションは、実行環境に配備される可能性があるメカニズムについて、適していないものを使用しないようにすることができます。たとえば、平文攻撃を受けやすいメカニズムの使用を許可しない場合、アプリケーションは次のサンプル・コードを使用する場合があります。
Map props = new HashMap(); props.add(Sasl.POLICY_NOPLAINTEXT, "true"); SaslClient sc = Sasl.createSaslClient(mechanisms, authzid, protocol, serverName, props, callbackHandler);
SunSASLプロバイダのクライアント・メカニズムおよびサーバー・メカニズムについての情報です。
SunSASLプロバイダは、次のクライアント・メカニズムおよびサーバー・メカニズムをサポートします。
SunSASLプロバイダでは、LDAP、IMAPおよびSMTPなどの一般的なプロトコルで使用される複数のSASLクライアント・メカニズムがサポートされています。
次の表は、クライアント・メカニズムとそれらに必要な入力の概要です。
表10-1 SunSASLプロバイダのクライアント・メカニズム
クライアント・メカニズム名 | パラメータ/入力 | コールバック | 構成プロパティ | 選択ポリシー |
---|---|---|---|---|
CRAM-MD5 | 承認 ID (デフォルトのユーザー名として) | なし | ||
DIGEST-MD5 | authorization id protocol id server name |
|
"javax.security.sasl.sendmaxbuffer" "com.sun.security.sasl.digest.cipher" |
|
EXTERNAL | authorization id external channel |
なし | なし | |
PLAIN | authorization id | なし |
SunSASLプロバイダのこれらのメカニズムを使用するアプリケーションは、必要なパラメータ、コールバック、およびプロパティを提供する必要があります。プロパティには適切なデフォルト値が設定されているため、アプリケーションがデフォルト値をオーバーライドする場合にのみ設定する必要があります。ほとんどのパラメータ、コールバック、およびプロパティはAPIドキュメントで説明されています。次のセクションでは、メカニズム固有の動作、およびAPIドキュメントで説明されていないパラメータについて説明します。
Cram-MD5
Cram-MD5クライアント・メカニズムは、承認IDパラメータが指定された場合、それをNameCallback
のデフォルト・ユーザー名として使用して、アプリケーション/エンドユーザーに認証IDを求めます。それ以外の場合、承認IDはCram-MD5メカニズムによって使用されません。認証IDのみがサーバーと交換されます。
Digest-MD5
Digest-MD5メカニズムは、ダイジェスト認証およびオプションでセキュリティ層を確立する場合に使用されます。セキュリティ層とともに使用するTriple DES、DES、およびRC4 (128、56、および40ビット)の暗号を指定します。Digest-MD5メカニズムは、プラットフォームで使用可能な暗号のみをサポートできます。たとえば、プラットフォームがRC4暗号をサポートしない場合、Digest-MD5メカニズムはその暗号を使用しません。
Sasl.STRENGTH
プロパティは、「high」、「medium」、および「low」設定をサポートしており、デフォルトは「high,medium,low」です。暗号は、次のように強度設定にマッピングされています。
表10-2 暗号強度
強度 | 暗号 | 暗号ID |
---|---|---|
high | トリプルDES RC4 128 ビット |
3des rc4 |
medium | DES RC4 56 ビット |
des rc4-56 |
low | RC4 40 ビット | rc4-40 |
特定の強度に複数の選択肢がある場合、選択される暗号は、基盤となるプラットフォームでの暗号の可用性によって決まります。使用する暗号を明示的に指定するには、com.sun.security.sasl.digest.cipher
プロパティを、対応する暗号IDに設定します。このプロパティ設定は、Sasl.STRENGTH
および基盤となるプラットフォームで利用可能な暗号と互換性を持たせてください。たとえば、lowに設定されているSasl.STRENGTH
と3desに設定されているcom.sun.security.sasl.digest.cipher
には、互換性がありません。com.sun.security.sasl.digest.cipher
プロパティには、デフォルトはありません。
「javax.security.sasl.sendmaxbuffer」プロパティは、最大送信バッファ・サイズ(の文字列表現)をバイト単位で指定します。デフォルト値は65536です。実際の最大バイト数は、この数の最小値およびピアの最大受信バッファ・サイズになります。
SunSASLプロバイダでは、LDAP、IMAPおよびSMTPなどの一般的なプロトコルで使用される複数のSASLサーバー・メカニズムがサポートされています。
次の表は、サーバー・メカニズムとそれらに必要な入力の概要です。
表10-3 サーバー・メカニズム
サーバー・メカニズム名 | パラメータ/入力 | コールバック | 構成プロパティ | 選択ポリシー |
---|---|---|---|---|
CRAM-MD5 | server name | なし | ||
DIGEST-MD5 | protocol id server name |
|
SunSASLプロバイダのこれらのメカニズムを使用するアプリケーションは、必要なパラメータ、コールバック、およびプロパティを提供する必要があります。プロパティには適切なデフォルト値が設定されているため、アプリケーションがデフォルト値をオーバーライドする場合にのみ設定する必要があります。
サーバー・メカニズムのすべてのユーザーには、AuthorizeCallback
を処理するコールバック・ハンドラが必要です。これは、要求された承認IDに代わって認証済みのユーザーが操作できるかどうかを判別するため、および承認されたユーザーの正規化された名前を取得するために(正規化が適用可能な場合)、メカニズムによって使用されます。
ほとんどのパラメータ、コールバック、およびプロパティはAPIドキュメントで説明されています。次のセクションでは、メカニズム固有の動作、およびAPIドキュメントで説明されていないパラメータについて説明します。
Cram-MD5
Cram-MD5サーバー・メカニズムはNameCallback
およびPasswordCallback
を使用して、SASLクライアントの応答の検証に必要なパスワードを取得します。コールバック・ハンドラは、パスワードを取得するための鍵としてNameCallback.getDefaultName()
を使用します。
Digest-MD5
Digest-MD5サーバー・メカニズムはRealmCallback
、NameCallback
およびPasswordCallback
を使用して、SASLクライアントの応答の検証に必要なパスワードを取得します。コールバック・ハンドラは、パスワードを取得するための鍵としてRealmCallback.getDefaultText()
およびNameCallback.getDefaultName()
を使用します。
「javax.security.sasl.sendmaxbuffer」プロパティは、最大送信バッファ・サイズ(の文字列表現)をバイト単位で指定します。デフォルト値は65536です。実際の最大バイト数は、この数の最小値およびピアの最大受信バッファ・サイズになります。
「com.sun.security.sasl.digest.realm」プロパティは、サーバーがサポートするレルムの名前を空白で区切ったリストを指定するために使用されます。このリストは、チャレンジの一部としてクライアントに送信されます。このプロパティが設定されていない場合、デフォルトのレルムはサーバーの名前です(パラメータとして指定)。
「com.sun.security.sasl.digest.utf8」プロパティは、使用する文字エンコーディングを指定するために使用されます。「true」はUTF-8エンコーディングを使用することを意味し、「false」はISO Latin 1 (ISO-8859-1)を使用することを意味します。デフォルトは「true」です。
SunSASLプロバイダとJdkSASLプロバイダは、ロギングAPIを使用して、実装のログを出力します。この出力は、ロギング構成ファイルおよびプログラム上のAPI (java.util.logging
)を使用して制御できます。
SunSASLプロバイダによって使用されるロガー名は、javax.security.sasl
です。
次に、SunSASLプロバイダのFINEST
ロギング・レベルを有効にするサンプル・ロギング構成ファイルを示します。
javax.security.sasl.level=FINEST handlers=java.util.logging.ConsoleHandler java.util.logging.ConsoleHandler.level=FINEST
次の表に、メカニズムおよびそれらが生成するロギング出力を示します。
表10-4 ロギング出力
メカニズム | ロギング・レベル | ログ記録される情報 |
---|---|---|
CRAM-MD5 | FINE |
構成プロパティ。チャレンジおよび応答メッセージ |
DIGEST-MD5 | INFO |
エンコーディングの問題のために破棄されたメッセージ (不一致のMAC、不正なパディングなど) |
DIGEST-MD5 | FINE |
構成プロパティ。チャレンジおよび応答メッセージ |
DIGEST-MD5 | FINER |
チャレンジおよび応答メッセージに関するより詳細な情報 |
DIGEST-MD5 | FINEST |
セキュリティ層で交換されるバッファ |
GSSAPI | FINE |
構成プロパティ。チャレンジおよび応答メッセージ |
GSSAPI | FINER |
チャレンジおよび応答メッセージに関するより詳細な情報 |
GSSAPI | FINEST |
セキュリティ層で交換されるバッファ |
JdkSASLプロバイダのクライアント・メカニズムおよびサーバー・メカニズムについての情報です。
JdkSASLプロバイダでは、LDAP、IMAPおよびSMTPなどの一般的なプロトコルで使用されるGSSAPIクライアント・メカニズムがサポートされています。
次の表は、GSSAPIクライアント・メカニズムとそれらに必要な入力の概要です。
表10-5 JdkSASLプロバイダのクライアント・メカニズム
クライアント・メカニズム名 | パラメータ/入力 | コールバック | 構成プロパティ | 選択ポリシー |
---|---|---|---|---|
GSSAPI | JAAS Subject authorization id protocol id server name |
なし |
"javax.security.sasl.sendmaxbuffer" |
JdkSASLプロバイダのGSSAPIメカニズムを使用するアプリケーションは、必要なパラメータ、コールバックおよびプロパティを提供する必要があります。プロパティには適切なデフォルト値が設定されているため、アプリケーションがデフォルト値をオーバーライドする場合にのみ設定する必要があります。ほとんどのパラメータ、コールバック、およびプロパティはAPIドキュメントで説明されています。次の項では、GSSAPIのその他の動作、およびAPIドキュメントで説明されていないパラメータについて説明します。
GSSAPI
GSSAPIメカニズムは、Kerberos v5認証およびオプションでセキュリティ層の確立に使用されます。メカニズムは呼出し側スレッドのSubject
がクライアントのKerberos資格を含むこと、またはKerberosに暗黙的にログインすることによって資格が取得されることを想定しています。クライアントのKerberos資格を取得するには、Java Authentication and Authorization Service (JAAS)を使用し、Kerberosログイン・モジュールを使用してログインします。詳細および例は、JAASおよびJava GSS-APIチュートリアルを参照してください。JAAS認証を使用してKerberos資格を取得した後で、SASL GSSAPIメカニズムを使用するコードをdoAs
またはdoAsPrivileged
内に配置します。
LoginContext lc = new LoginContext("JaasSample", new TextCallbackHandler()); lc.login(); lc.getSubject().doAs(new SaslAction()); class SaslAction implements java.security.PrivilegedAction { public class run() { ... String[] mechanisms = new String[]{"GSSAPI"}; SaslClient sc = Sasl.createSaslClient(mechanisms, authzid, protocol, serverName, props, callbackHandler); ... } }
JAASプログラミングを明示的に行わずにKerberos資格を取得するには、JAASおよびJava GSS-APIチュートリアルを参照してください。この方法を使用する場合は、コードをdoAs
またはdoAsPrivileged
内にラップする必要はありません
javax.security.sasl.sendmaxbuffer
プロパティは、最大送信バッファ・サイズ(の文字列表現)をバイト単位で指定します。デフォルト値は65536です。実際の最大バイト数は、この数の最小値およびピアの最大受信バッファ・サイズになります。
JdkSASLプロバイダでは、LDAP、IMAPおよびSMTPなどの一般的なプロトコルで使用されるGSSAPIメカニズムがサポートされています。
次の表は、GSSAPIサーバー・メカニズムとそれらに必要な入力の概要です。
表10-6 サーバー・メカニズム
サーバー・メカニズム名 | パラメータ/入力 | コールバック | 構成プロパティ | 選択ポリシー |
---|---|---|---|---|
GSSAPI |
protocol id server name |
|
JdkSASLプロバイダのGSSAPIメカニズムを使用するアプリケーションは、必要なパラメータ、コールバックおよびプロパティを提供する必要があります。プロパティには適切なデフォルト値が設定されているため、アプリケーションがデフォルト値をオーバーライドする場合にのみ設定する必要があります。
サーバー・メカニズムのすべてのユーザーには、AuthorizeCallback
を処理するコールバック・ハンドラが必要です。これは、要求された承認IDに代わって認証済のユーザーが操作できるかどうかを判別するため、および承認されたユーザーの正規化された名前を取得するために(正規化が適用可能な場合)、メカニズムによって使用されます。
ほとんどのパラメータ、コールバック、およびプロパティはAPIドキュメントで説明されています。次の項では、GSSAPIメカニズム固有の動作、およびAPIドキュメントで説明されていないパラメータについて説明します。
GSSAPI
GSSAPIメカニズムは、Kerberos v5認証およびオプションでセキュリティ層の確立に使用されます。メカニズムは呼出し側スレッドのSubject
がクライアントのKerberos資格を含むこと、またはKerberosに暗黙的にログインすることによって資格が取得されることを想定しています。クライアントのKerberos資格を取得するには、Java Authentication and Authorization Service (JAAS)を使用し、Kerberosログイン・モジュールを使用してログインします。詳細および例は、JAASおよびJava GSS-APIチュートリアルを参照してください。JAAS認証を使用してKerberos資格を取得した後で、SASL GSSAPIメカニズムを使用するコードをdoAs
またはdoAsPrivileged
内に配置します。
LoginContext lc = new LoginContext("JaasSample", new TextCallbackHandler()); lc.login(); lc.getSubject().doAs(new SaslAction()); class SaslAction implements java.security.PrivilegedAction { public class run() { ... String[] mechanisms = new String[]{"GSSAPI"}; SaslClient sc = Sasl.createSaslClient(mechanisms, authzid, protocol, serverName, props, callbackHandler); ... } }
JAASプログラミングを明示的に行わずにKerberos資格を取得するには、JAASおよびJava GSS-APIチュートリアルを参照してください。この方法を使用する場合は、コードをdoAs
またはdoAsPrivileged
内にラップする必要はありません
javax.security.sasl.sendmaxbuffer
プロパティは、最大送信バッファ・サイズ(の文字列表現)をバイト単位で指定します。デフォルト値は65536です。実際の最大バイト数は、この数の最小値およびピアの最大受信バッファ・サイズになります。