セキュリティー属性伝搬のカスタム Java シリアライズ可能オブジェクトの伝搬
この資料は、ログイン・モジュールからサブジェクトへのオブジェクトの追加方法を説明し、確実に Java™ オブジェクトが伝搬されるように設定される、他のインフラストラクチャーの考慮事項を説明します。
始める前に
このタスクについて
手順
- カスタム・ログイン・モジュールからサブジェクトにカスタム Java オブジェクトを追加します。 各 Java Authentication
and Authorization Service (JAAS) ログイン・モジュールごとに 2 段階のプロセスがあります。
WebSphere® Application Server は、構成内の各ログイン・モジュールに対して、以下のプロセスを実行します。
- ログイン・メソッド
- このステップでは、必要な場合はログイン構成コールバックが分析され、新規オブジェクトまたはクレデンシャルが作成されます。
- コミット・メソッド
- このステップでは、ログイン中に作成されるオブジェクトまたはクレデンシャルがサブジェクトに追加されます。
カスタム Java オブジェクトがサブジェクトに追加されると、WebSphere Application Server は送信サーバーでオブジェクトをシリアライズし、受信サーバーでオブジェクトをデシリアライズし、オブジェクトをサブジェクト・ダウンストリームに追加します。 ただし、このプロセスを成功させるには、いくつかの要件があります。JAAS プログラミング・モデルの情報については、『セキュリティー: 学習用リソース』に提供されている JAAS 情報を参照してください。重要: WebSphere Application Server のログイン・インフラストラクチャーにカスタム・ログイン・モジュールをプラグ・インするときは必ず、コードが信頼できることを確認してください。 Java アーカイブ (JAR) ファイルにクラスを一緒に記述して、そのファイルを app_server_root/lib/ext/ ディレクトリーに追加すると、ログイン・モジュールは Java 2 Security AllPermissions アクセス権を持つことになります。 ログイン・モジュールおよび他のインフラストラクチャー・クラスをプライベート・ディレクトリーに追加することをお勧めします。 ただし、ご使用の専用ディレクトリー、Java アーカイブ (JAR) ファイル、またはその両方が、 ログイン・モジュールから呼び出されるアプリケーション・プログラミング・インターフェース (API) を実行するのに 必要なアクセス権を確実に持つようにするには、profile_root/properties/server.policy ファイルを変更する必要があります。 呼び出しスタックでのアプリケーション・コードの後にログイン・モジュールが実行されることがあるため、 アプリケーションに追加のプロパティーを追加する必要がないように、doPrivileged コードを追加することがあります。
重要: WebSphere Application Server のログイン・インフラストラクチャーにカスタム・ログイン・モジュールをプラグ・インするときは必ず、コードが信頼できることを確認してください。 profile_root/classes ディレクトリーにログイン・モジュールを追加すると、そのログイン・モジュールは Java 2 Security AllPermissions アクセス権を持つことになります。 詳しくは、プロファイルでのカスタム・クラス用クラス・サブディレクトリーの作成を参照してください。 ただし、呼び出しスタックでアプリケーション・コードの後にログイン・モジュールが実行されることがあるため、アプリケーションに追加プロパティーを追加する必要がないように、doPrivileged コードを追加することができます。
次のコード・サンプルは doPrivileged コードの追加方法を示します。 初期化、ログイン、およびコミット時に実行する内容については、 JAAS のシステム・ログイン構成用のカスタム・ログイン・モジュールの開発を参照してください。public customLoginModule() { public void initialize(Subject subject, CallbackHandler callbackHandler, Map sharedState, Map options) { } public boolean login() throws LoginException { // Construct callback for the WSTokenHolderCallback so that you // can determine if // your custom object has propagated Callback callbacks[] = new Callback[1]; callbacks[0] = new WSTokenHolderCallback("Authz Token List: "); try { _callbackHandler.handle(callbacks); } catch (Exception e) { throw new LoginException (e.getLocalizedMessage()); } // Checks to see if any information is propagated into this login List authzTokenList = ((WSTokenHolderCallback) callbacks[1]). getTokenHolderList(); if (authzTokenList != null) { for (int i = 0; i< authzTokenList.size(); i++) { TokenHolder tokenHolder = (TokenHolder)authzTokenList.get(i); // Look for your custom object. Make sure you use // "startsWith"because there is some data appended // to the end of the name indicating in which Subject // Set it belongs. Example from getName(): // "com.acme.CustomObject (1)". The class name is // generated at the sending side by calling the // object.getClass().getName() method. If this object // is deserialized by WebSphere Application Server, // then return it and you do not need to add it here. // Otherwise, you can add it below. // Note: If your class appears in this list and does // not use custom serialization (for example, an // implementation of the Token interface described in // the Propagation Token Framework), then WebSphere // Application Server automatically deserializes the // Java object for you. You might just return here if // it is found in the list. if (tokenHolder.getName().startsWith("com.acme.CustomObject")) return true; } } // If you get to this point, then your custom object has not propagated myCustomObject = new com.acme.CustomObject(); myCustomObject.put("mykey", "mydata"); } public boolean commit() throws LoginException { try { // Assigns a reference to a final variable so it can be used in // the doPrivileged block final com.acme.CustomObject myCustomObjectFinal = myCustomObject; // Prevents your applications from needing a JAAS getPrivateCredential // permission. java.security.AccessController.doPrivileged(new java.security. PrivilegedExceptionAction() { public Object run() throws java.lang.Exception { // Try not to add a null object to the Subject or an object // that already exists. if (myCustomObjectFinal != null && !subject.getPrivateCredentials(). contains(myCustomObjectFinal)) { // This call requires a special Java 2 Security permission, // see the JAAS application programming interface (API) // documentation. subject.getPrivateCredentials().add(myCustomObjectFinal); } return null; } }); } catch (java.security.PrivilegedActionException e) { // Wraps the exception in a WSLoginFailedException java.lang.Throwable myException = e.getException(); throw new WSLoginFailedException (myException.getMessage(), myException); } } // Defines your login module variables com.acme.CustomObject myCustomObject = null; }
- カスタム Java クラスが java.io.Serializable
インターフェースを実装していることを確認します。 オブジェクトを伝搬する場合は、サブジェクトに追加されるオブジェクトをシリアライズする必要があります。
例えば、オブジェクトは java.io.Serializable インターフェースを実装する必要があります。
オブジェクトがシリアライズされない場合、要求は失敗しませんが、オブジェクトは伝搬しません。
サブジェクトに追加されるオブジェクトが伝搬されるようにするには、セキュリティー属性の伝搬で定義されているトークン・インターフェースの 1 つを実装するか、あるいは、以下に示す既存のデフォルト・トークン実装の 1 つに属性を追加します。
- AuthorizationToken
- ユーザー固有の場合は属性を追加します。詳しくは、デフォルトの許可トークンを使用したセキュリティー属性の伝搬を参照してください。
- PropagationToken
- 呼び出しに固有の属性を追加します。詳しくは、デフォルトの伝搬トークンを使用したセキュリティー属性の伝搬を参照してください。
カスタム・オブジェクトの追加に慎重に対応していて、すべてのステップに従って、WebSphere Application Server が各ホップでオブジェクトのシリアライズとデシリアライズができることを確認する場合は、カスタム Java オブジェクトを使用するだけで十分です。
- ご使用のカスタム Java クラスが、要求を受け取る可能性があるシステムのすべてに
存在していることを検証します。
カスタム・オブジェクトをサブジェクトに追加し、WebSphere Application Server がオブジェクトを伝搬することを期待している場合、Java アーカイブ (JAR) ファイルにクラス定義も同時に記述し、そのファイルを、シリアライゼーションまたはデシリアライゼーションが 起こる可能性があるすべてのノード上の app_server_root/lib/ext/ ディレクトリーに追加してください。また、Java クラス・バージョンが同じであることも確認します。
カスタム・オブジェクトをサブジェクトに追加し、WebSphere Application Server がオブジェクトを伝搬することを期待している場合、そのカスタム・オブジェクトのクラス定義が、シリアライゼーションまたはデシリアライゼーションが起こる可能性があるすべてのノード上の profile_root/classes ディレクトリーにあることを確認します。 また、Java クラス・バージョンが同じであることも確認します。
- ご使用のカスタム・ログイン・モジュールが、ご使用の環境で使用されるすべてのログイン構成に 構成されていることを検証します。この環境には、ログイン中にカスタム・オブジェクトを追加する必要があります。 WebSphere Application Server と対話するログイン構成は、Enterprise JavaBeans (EJB) 要求に対してアウトバウンドとして伝搬される可能性があるサブジェクトを生成します。いかなる場合も、WebSphere Application Server にカスタム・オブジェクトを伝搬させる必要があるならば、 カスタム・ログイン・モジュールがご使用の環境で使用されるすべてのログイン構成に追加されていることを確認してください。 詳しくは、JAAS のシステム・ログイン構成用のカスタム・ログイン・モジュールの開発を参照してください。
- セキュリティー属性伝搬が、伝搬された情報を受け取るすべてのダウンストリーム・サーバー で使用可能であるかを検証します。 EJB 要求がダウンストリーム・サーバーに送信され、セキュリティー属性伝搬がそのサーバーで使用不可になると、 認証トークンのみが後方互換性のために送信されます。このため、構成を検討して、伝搬が要求を受け取る可能性があるすべてのセルで使用可能か検証する必要があります。 管理コンソールに、伝搬が完全に使用可能になっているかを確認する場所が数箇所あります。 詳しくは、アプリケーション・サーバー間のセキュリティー属性の伝搬を参照してください。
- 伝搬したくないカスタム・オブジェクトを伝搬除外リストに追加します。 特定のクラス名、パッケージ名、またはその両方と一致するオブジェクトの伝搬を除外するために、
プロパティーを構成することができます。
例えば、特定のプロセスに関係するカスタム・オブジェクトを持つことができます。
オブジェクトが伝搬されても、それは有効な情報を含んでいません。WebSphere Application Server に、このオブジェクトを伝搬しないように伝える必要があります。
次のステップを実行して、
管理コンソールを使用して伝搬除外リストのオブジェクトを指定してください。
- 「セキュリティー」>「グローバル・セキュリティー」>「カスタム・プロパティー」>「新規」とクリックします。
- 「名前」フィールドに com.ibm.ws.security.propagationExcludeList を追加します。
- 「値」フィールドにカスタム・オブジェクトの名前を追加します。 コロン (:) で分割される伝搬除外リストにカスタム・オブジェクトのリストを追加することができます。
例えば、com.acme.CustomLocalObject:com.acme.private.* と入力することがあります。
com.acme.CustomLocalObject などのクラス名または com.acme.private.* などのパッケージ名を入力することができます。この例では、WebSphere Application
Server は com.acme.CustomLocalObject と等しい、
または com.acme.private. で始まるクラスはどれも伝搬しません。
伝搬除外リストにカスタム・オブジェクトを追加することができますが、 副次作用に気を付ける必要があります。 WebSphere Application Server は、シングル・サインオン (SSO) トークンの存続期間に、ローカル・キャッシュで不透明なトークン、またはシリアライズされたサブジェクト内容を保管します。 SSO トークンの存続期間 (デフォルトでは 2 時間) は、管理コンソールの SSO プロパティーで構成されます。 不透明なトークンに追加される情報は、除外リストにないオブジェクトのみを含みます。
SSO トークンのタイムアウト値は、認証キャッシュのタイムアウト値より 大きくなければなりません。認証キャッシュを変更するには、 認証キャッシュの設定に関する資料を参照してください。
タスクの結果


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