デフォルトの伝搬トークンを使用したセキュリティー属性の伝搬
デフォルトの伝搬トークンは、使用するアプリケーションおよびセキュリティー・インフラストラクチャーの 実行スレッドに配置されています。製品はこのデフォルトの伝搬トークンをダウンストリームに伝搬し、 トークンは各ホップで呼び出しを行なうスレッドにとどまります。
このタスクについて
データは、伝搬トークンを行う任意のリソースのコンテナーから選択可能です。 伝搬が行われるためには、要求が送られる各サーバーで伝搬機能を使用可能にしておく必要があることに留意してください。 ご使用の環境で伝搬を行いたいすべてのセルについて、 セキュリティー属性の伝搬が使用可能になっていることを確認してください。
PropagationToken 属性にアクセスするためのアプリケーション・プログラミング・インターフェース (API) を有する WSSecurityHelper クラスがあります。 このトピックでは使用法のシナリオを示し、実例を挙げます。 伝搬トークンと作業域フィーチャーの間には、 密接な関係があります。これらのフィーチャー間の主な相違点は、 伝搬トークンに属性を追加した後は、その属性を変更できない点にあります。 セキュリティー・ランタイムが監査可能な情報を追加し、 呼び出しが行われている間、その情報を保持できるようにするため、 これらの属性を変更することはできません。 特定のキーに属性を追加するときはいつでも、 その属性を格納するための ArrayList オブジェクトが保管されます。 同じキーを使用して任意の新規属性を追加すると、 その ArrayList オブジェクトに追加されます。getAttributes を呼び出すと、 ArrayList オブジェクトはストリング配列に変換され、その順序は保持されます。ストリング配列の最初のエレメントは、 その特定キーに追加された最初の属性です。
デフォルトの伝搬トークンでは、 トークンに加えられた任意のデータ変更を記録する変更フラグが立てられます。 これらの変更は追跡されるため、WebSphere® Application Server は、ダウンストリーム・サーバーがそれらの変更を入手できるように、認証情報をどの時点でダウンストリームに再送すべきなのかを認識できます。通常は Common Secure Interoperability バージョン 2 (CSIv2) が認証済みクライアント・サーバー間のセッションを維持します。 伝搬トークンが変更されると、新しいセッションが生成され、その結果新しい認証が起こります。 メソッド中の伝搬トークンを頻繁に変更することは、 ダウンストリーム呼び出しが頻繁に行われる原因となります。 下流で多くの呼び出しが行われる前にトークンを変更する場合、または下流 の各呼び出しの間にトークンを変更する場合、セキュリティーのパフォーマンスに影響が及びます。
手順
- デフォルトの伝搬トークンからのサーバー・リストの取得
伝搬トークンが水平、 もしくは下流に伝搬され、認証済みサブジェクトを作成するために使用されるたびに、 受信側のアプリケーション・サーバーの名前が伝搬トークンに記録されます。ホストのフォーマットは 「Cell:Node:Server」で、これによって、呼び出しを受信 する各アプリケーション・サーバーのセル名、ノード名、サーバー名を利用できます。
以下のコードは、これらの名前のリストを提供するもので、Java™ 2 Platform, Enterprise Edition (J2EE) アプリケーションから呼び出すことができます。
リストの各サーバーのフォーマットは、cell:node_name:server_name です。 例えば、出力は次のようになります。myManager:node1:server1
String[] server_list = null;
// If security is disabled on this application server, do not bother checking
if (com.ibm.websphere.security.WSSecurityHelper.isServerSecurityEnabled())
{
try
{
// Gets the server_list string array
server_list = com.ibm.websphere.security.WSSecurityHelper.getServerList();
}
catch (Exception e)
{
// Performs normal exception handling for your application
}
if (server_list != null)
{
// print out each server in the list, server_list[0] is the first server
for (int i=0; i<server_list.length; i++)
{
System.out.println("Server[" + i + "] = " + server_list[i]);
}
}
} - getCallerList API を使用して、呼び出し元のリストを取得します。 デフォルトの伝搬トークンは、 認証済みユーザーが実行スレッドに設定されたとき、あるいは誰かが伝搬トークンに属性を追加しようとしたときに、 生成されます。認証済みユーザーがスレッドに設定されるときには、そのユーザーは必ず、 デフォルトの伝搬トークンに記録されています。RunAs ユーザーが呼び出し元とは違っている場合、ときどき、同じユーザーが複数回記録されている可能性があります。以下のリストは、スレッドに追加されるユーザーを伝搬トークンに記録するかどうかを決定するのに 使用される規則を示します。
- 現行のサブジェクトは認証済みでなければなりません。 例えば、非認証サブジェクトは記録されません。
- 現行の認証済みサブジェクトは、以前に記録されていない場合に記録されます。
- 現行の認証済みサブジェクトは、 最後に記録された認証済みサブジェクトが同じユーザーを含んでいない場合に記録されます。
- 現行の認証済みサブジェクトは、 伝搬プロセスに含まれるそれぞれの固有のアプリケーション・サーバーに記録されます。
次のコード・サンプルで、getCallerList API の使用方法を示します。
リストの各呼び出し元のフォーマットは、cell:node_name:server_name:realm:port_number/securityName です。 例えば、出力は次のようになります。myManager:node1:server1:ldap.austin.ibm.com:389/jsmith
String[] caller_list = null;
// If security is disabled on this application server, do not check the caller list
if (com.ibm.websphere.security.WSSecurityHelper.isServerSecurityEnabled())
{
try
{
// Gets the caller_list string array
caller_list = com.ibm.websphere.security.WSSecurityHelper.getCallerList();
}
catch (Exception e)
{
// Performs normal exception handling for your application
}
if (caller_list != null)
{
// Prints out each caller in the list, caller_list[0] is the first caller
for (int i=0; i<caller_list.length;i++)
{
System.out.println("Caller[" + i + "] = " + caller_list[i]);
}
}
} - getFirst Caller API を使用して、最初の認証済みユーザーのセキュリティー名を取得します。
どの認証済み呼び出し元が要求を開始するかを知りたい場合はいつでも、getFirstCaller メソッドを呼び出して、呼び出し元リストを解析することができます。しかしこのメソッドは、 呼び出し元のセキュリティー名を戻すだけです。セキュリティー名以上のことを知りたい場合は、 getCallerList メソッドを呼び出して、ストリング配列の最初のエントリーを 取得します。このエントリーは、呼び出し元のすべての情報を提供します。
以下のコード・サンプルでは、 getFirstCaller API により、最初の認証済み呼び出し元のセキュリティー名が取得されます。
例えば、出力は次のようになります。jsmithString first_caller = null;
// If security is disabled on this application server, do not bother checking
if (com.ibm.websphere.security.WSSecurityHelper.isServerSecurityEnabled())
{
try
{
// Gets the first caller
first_caller = com.ibm.websphere.security.WSSecurityHelper.getFirstCaller();
// Prints out the caller name
System.out.println("First caller: " + first_caller);
}
catch (Exception e)
{
// Performs normal exception handling for your application
}
} - getFirstServer メソッドを使用して、要求に対する最初のアプリケーション・サーバーの名前を取得します。
この要求に対する最初のアプリケーション・サーバーを知りたいときには、 いつでも getFirstServer メソッドを直接呼び出してください。
以下のコード・サンプルでは、 getFirstServer API によって最初のアプリケーション・サーバー名が取得されます。
例えば、出力は次のようになります。myManager:node1:server1
String first_server = null;
// If security is disabled on this application server, do not bother checking
if (com.ibm.websphere.security.WSSecurityHelper.isServerSecurityEnabled())
{
try
{
// Gets the first server
first_server = com.ibm.websphere.security.WSSecurityHelper.getFirstServer();
// Prints out the server name
System.out.println("First server: " + first_server);
}
catch (Exception e)
{
// Performs normal exception handling for your application
}
} - addPropagationAttribute API を使用して、カスタム属性をデフォルトの伝搬トークンに追加します。 アプリケーションで使用するためにカスタム属性をデフォルトの伝搬トークンに追加することができます。 このトークンはダウンストリームの要求に従うので、必要に応じてその属性が利用できます。 属性を追加するためにデフォルトの伝搬トークンを使う場合は、以下の問題を認識しておいてください。
- 伝搬トークンに情報を追加すると、CSIv2 セッション・キャッシングに影響が出ます。 リモート要求の間に情報を慎重に追加します。
- 特定のキーで情報を追加した後は、その情報は除去できません。
- 特定キーに、必要な数だけ値を追加することができます。しかしすべての値は、 それらが追加された順で、戻されたストリング配列から利用できなければなりません。
- 伝搬トークンは、伝搬とセキュリティーが使用可能になっているサーバーでのみ利用できます。
- デフォルトの伝搬トークンに属性を追加するためには、Java 2 セキュリティーの javax.security.auth.AuthPermission wssecurity.addPropagationAttribute 属性が必要です。
- アプリケーションでは com.ibm.websphere.security または com.ibm.wsspi.security で始まるキーを使えません。これらのプレフィックスは将来 システムで使用するために予約されています。
次のコード・サンプルで、addPropagationAttribute API の使い方を示します。
// If security is disabled on this application server,
// do not check the status of server security
if (com.ibm.websphere.security.WSSecurityHelper.isServerSecurityEnabled())
{
try
{
// Specifies the key and values
String key = "mykey";
String value1 = "value1";
String value2 = "value2";
// Sets key, value1
com.ibm.websphere.security.WSSecurityHelper.
addPropagationAttribute (key, value1);
// Sets key, value2
String[] previous_values = com.ibm.websphere.security.WSSecurityHelper.
addPropagationAttribute (key, value2);
// Note: previous_values should contain value1
}
catch (Exception e)
{
// Performs normal exception handling for your application
}
} - getPropagationAttributes API を使用して、カスタム属性を取得します。 カスタム属性は、addPropagationAttribute API を使用して、 デフォルトの伝搬トークンに追加されます。これらの属性は、 getPropagationAttributes API を使用して取得します。このトークンはダウンストリームの要求に従うので、 必要に応じてその属性が利用できます。属性を取得するためにデフォルトの伝搬トークンを使用する場合は、 以下の問題を認識しておいてください。
- 伝搬トークンは、伝搬とセキュリティーが使用可能になっているサーバーでのみ利用できます。
- デフォルトの伝搬トークンから属性を取得するためには、Java 2 セキュリティー javax.security.auth.AuthPermission "wssecurity.getPropagationAttributes" 許可が必要です。
addPropagationAttribute API を使って属性を追加するには、デフォルトの PropagationToken へのカスタム属性の追加を参照してください。
次のコード・サンプルで、getPropagationAttributes API の使用方法を示します。
// If security is disabled on this application server, do not bother checking
if (com.ibm.websphere.security.WSSecurityHelper.isServerSecurityEnabled())
{
try
{
String key = "mykey";
String[] values = null;
// Sets key, value1
values = com.ibm.websphere.security.WSSecurityHelper.
getPropagationAttributes (key);
// Prints the values
for (int i=0; i<values.length; i++)
{
System.out.println("Value[" + i + "] = " + values[i]);
}
}
catch (Exception e)
{
// Performs normal exception handling for your application
}
}例えば、出力は次のようになります。Value[0] = value1
Value[1] = value2 - デフォルト以外のトークン・ファクトリーを使用するには、伝搬トークン・ファクトリーの構成を変更します。
WebSphere Application Server は、デフォルトの伝搬トークンを生成する際、com.ibm.wsspi.security.token.propagationTokenFactory プロパティーを使用して指定されている TokenFactory クラスを使用します。
このプロパティーに指定されるデフォルトのトークン・ファクトリーは、 com.ibm.ws.security.ltpa.AuthzPropTokenFactory と呼ばれます。このトークン・ファクトリーは 伝搬トークンでデータをエンコードしますが、データの暗号化は行いません。伝搬トークンは通常、 Secure Sockets Layer (SSL) を使用して CSIv2 を流れるため、 そのトークンを暗号化する必要はありません。ただし、伝搬トークンに対してそれ以上のセキュリティーが必要な場合は、暗号化を行うために、別のトークン・ファクトリー実装と、このプロパティーを関連付けることができます。 例えば、 com.ibm.ws.security.ltpa.LTPAToken2Factory トークン・ファクトリーとこ のプロパティーを関連付けを選択すると、 トークンは AES 暗号化されます。ただし、セキュリティー・ニーズに対するパフォーマンスへの影響を評価する必要があります。 伝搬トークンに機密情報を追加することは、 トークン・ファクトリー実装を、 ただエンコードするだけではなく暗号化するものに変更する格好の理由とな ります。
- 管理コンソールを開きます。
- 「セキュリティー」>「グローバル・セキュリティー」とクリックします。
- 「カスタム・プロパティー」をクリックします。
- デフォルトの伝搬トークンに対して、独自の署名および暗号化を実行します。 デフォルトの伝搬トークンに対して独自の署名および暗号化を実行する場合は、 以下のクラスを実装する必要があります。
- com.ibm.wsspi.security.ltpa.Token
- com.ibm.wsspi.security.ltpa.TokenFactory
- トークン・ファクトリーとデフォルトの伝搬トークンを関連付けます。
- 管理コンソールを開きます。
- 「セキュリティー」>「グローバル・セキュリティー」とクリックします。
- 「カスタム・プロパティー」をクリックします。
- com.ibm.wsspi.security.token.propagationTokenFactory プロパティーを探索して、 このプロパティーの値がカスタム・トークン・ファクトリー実装と一致することを確認します。
- 実装クラスが app_server_root/classes ディレクトリーに置かれていて、WebSphere Application Server クラス・ローダーがそのクラスをロードできることを確認します。
実装クラスが ${USER_INSTALL_ROOT}/classes ディレクトリーに置かれていて、WebSphere Application Server クラス・ローダーがそのクラスをロードできることを確認します。
QEJBSVR ユーザー・プロファイルが、classes ディレクトリーに対して、 権限の読み取り、書き込み、および実行 (*RWX) を行ったことを確認します。権限の使用 (WRKAUT) コマンドを使用すると、 そのディレクトリーの権限許可を表示することができます。
例


http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tsec_defproptoken
ファイル名:tsec_defproptoken.html