WebSphere Application Server for z/OS, Version 6.1   
             オペレーティング・システム: z/OS

             目次と検索結果のパーソナライズ化

カスタム Java 直列化可能オブジェクトの伝搬

この資料は、ログイン・モジュールからサブジェクトへのオブジェクトの追加方法を説明し、確実に Java オブジェクトが伝搬されるように、他のインフラストラクチャーの考慮事項を説明します。

始める前に

このタスクを実行する前に、セキュリティー伝搬が管理コンソールで使用可能になっているかを確認してください。

このタスクについて

セキュリティー属性伝搬が使用可能になっていると、 シングル・サインオン (SSO) が使用可能な状態で水平に、または Common Secure Interoperability Version 2 (CSIv2) を使用してダウンストリームに、データを伝搬することができます。 ログインが起こると、アプリケーション・ログイン構成またはシステム・ログイン構成を介して、カスタム・ログイン・モジュールが接続され、ログイン中にサブジェクト内に Java シリアライズド・オブジェクトを追加できます。 この資料は、ログイン・モジュールからサブジェクトへのオブジェクトの追加方法を説明し、確実に Java オブジェクトが伝搬されるように、他のインフラストラクチャーの考慮事項を説明します。

プロシージャー

  1. カスタム・ログイン・モジュールからサブジェクトにカスタム Java オブジェクトを追加します。 各 Java Authentication and Authorization Service (JAAS) ログイン・モジュールには 2 つの段階のプロセスがあります。 WebSphere Application Server は、構成にある各ログイン・モジュールに以下のプロセスを実行します。
    ログイン・メソッド
    このステップでは、必要な場合はログイン構成コールバックが分析され、新規オブジェクトまたはクレデンシャルが作成されます。
    コミット・メソッド
    このステップでは、ログイン中に作成されるオブジェクトまたはクレデンシャルがサブジェクトに追加されます。
    カスタム Java オブジェクトがサブジェクトに追加されると、WebSphere Application Server は送信サーバーでオブジェクトをシリアライズし、受信サーバーでオブジェクトをデシリアライズして、オブジェクトをサブジェクト・ダウンストリームに追加します。 ただし、このプロセスを成功させるには、いくつかの要件があります。JAAS プログラミング・モデルの情報については、セキュリティー: 学習用リソース に提供されている JAAS 情報を参照してください。
    重要: WebSphere Application Server のログイン・インフラストラクチャーにカスタム・ログイン・モジュールを接続するときに、 コードが信頼できるか確認してください。install_root/classes ディレクトリーにログイン・モジュールを 追加する場合、ログイン・モジュールは Java 2 Security AllPermissions アクセス権を持ちます。ログイン・モジュールおよび他のインフラストラクチャー・クラスをプライベート・ディレクトリーに追加することをお勧めします。 ただし、ご使用の専用ディレクトリー、Java アーカイブ (JAR) ファイル、またはその両方が、 ログイン・モジュールから呼び出されるアプリケーション・プログラミング・インターフェース (API) を実行するのに 必要なアクセス権を確実に持っているようにするために、 install_root/properties/server.policy ファイルを変更する必要があります。 呼び出しスタックでのアプリケーション・コードの後にログイン・モジュールが実行されることがあるため、 アプリケーションに追加のプロパティーを追加する必要がないように、doPrivileged コードを追加することがあります。
    次のコード・サンプルは doPrivileged コードの追加方法を示します。 初期化、ログイン、およびコミット時に実行する内容については、 システム・ログイン構成用のカスタム・ログイン・モジュール開発 を参照してください。
    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;
    }
  2. カスタム Java クラスが java.io.Serializable インターフェースをインプリメントすることを検証します。 オブジェクトを伝搬する場合は、サブジェクトに追加されるオブジェクトをシリアライズする必要があります。 例えば、オブジェクトは java.io.Serializable インターフェースをインプリメントする必要があります。 オブジェクトがシリアライズされない場合、要求は失敗しませんが、オブジェクトは伝搬しません。 サブジェクトに追加されるオブジェクトが伝搬されていることを確認するには、セキュリティー属性の伝搬 に定義されるトークン・インターフェースの 1 つをインプリメントするか、または次のデフォルトの 既存トークン・インプリメンテーションの 1 つに属性を追加します。
    AuthorizationToken
    ユーザー固有の場合は属性を追加します。詳しくは、例: デフォルトの許可トークンの使用 を参照してください。
    PropagationToken
    呼び出しに固有の属性を追加します。詳しくは、 例: デフォルトの伝搬トークンの使用 を参照してください。

    カスタム・オブジェクトの追加に慎重で、すべてのステップに従い、WebSphere Application Server が各ホップでオブジェクトをシリアライズおよびデシリアライズできることを確認している場合、 カスタム Java オブジェクトのみの使用で十分です。

  3. ご使用のカスタム Java クラスが、要求を受け取る可能性があるシステムのすべてに 存在しているかを検証します。

    カスタム・オブジェクトをサブジェクトに追加し、 WebSphere Application Server がオブジェクトを伝搬することを期待している場合、 そのカスタム・オブジェクトのクラス定義が、シリアライゼーションまたはデシリアライゼーションが 起こる可能性があるすべてのノード上の install_root/classes ディレクトリー にあることを確認します。また、 Java クラス・バージョンが同じであることを検証します。

  4. ご使用のカスタム・ログイン・モジュールが、ご使用の環境で使用されるすべてのログイン構成に 構成されていることを検証します。この環境には、ログイン中にカスタム・オブジェクトを追加する必要があります。 WebSphere Application Server と相互作用するログイン構成は、Enterprise JavaBeans (EJB) 要求のためにアウトバウンドに伝搬される可能性があるサブジェクトを生成します。 WebSphere Application Server にいかなる場合もカスタム・オブジェクトを伝搬させる場合、 カスタム・ログイン・モジュールがご使用の環境で使用されるすべてのログイン構成に追加されていることを確認します。 詳しくは、システム・ログイン構成用のカスタム・ログイン・モジュール開発 を参照してください。
  5. セキュリティー属性伝搬が、伝搬された情報を受け取るすべてのダウンストリーム・サーバー で使用可能であるかを検証します。 EJB 要求がダウンストリーム・サーバーに送信され、セキュリティー属性伝搬がそのサーバーで使用不可になると、 認証トークンのみが下位互換性のために送信されます。このため、構成を検討して、伝搬が要求を受け取る可能性があるすべてのセルで使用可能か検証する必要があります。 管理コンソールに、伝搬が完全に使用可能になっているかを確認する場所が数箇所あります。 詳しくは、アプリケーション・サーバー間のセキュリティー属性の伝搬 を参照してください。
  6. 伝搬したくないカスタム・オブジェクトを伝搬除外リストに追加します。 特定のクラス名、パッケージ名、またはその両方と一致するオブジェクトの伝搬を除外するために、 プロパティーを構成することができます。 例えば、特定のプロセスに関係するカスタム・オブジェクトを持つことができます。 オブジェクトが伝搬されても、それは有効な情報を含んでいません。WebSphere Application Server にこのオブジェクトを伝搬しないように伝える必要があります。次のステップを実行して、 管理コンソールを使用して伝搬除外リストのオブジェクトを指定してください。
    1. セキュリティー」>「管理、アプリケーション、およびインフラストラクチャーの保護」>「カスタム・プロパティー」>「新規」をクリックします。
    2. 名前」フィールドに com.ibm.ws.security.propagationExcludeList を追加します。
    3. 」フィールドにカスタム・オブジェクトの名前を追加します。 コロン (:) で分割される伝搬除外リストにカスタム・オブジェクトのリストを追加することができます。 例えば、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 トークン・タイムアウトに一致していない場合は、認証キャッシュ・プロパティーを構成してください。 認証キャッシュの構成 を参照してください。認証キャッシュ・タイムアウト値を SSO トークン・タイムアウトと同じにすることをお勧めします。

結果

このタスクの結果として、カスタム Java 直列化可能オブジェクトは水平またはダウンストリームに伝搬されます。 水平伝搬とダウンストリーム伝搬の違いに関する情報については、セキュリティー属性の伝搬 を参照してください。



関連概念
セキュリティー属性の伝搬
関連タスク
アプリケーション・サーバー間のセキュリティー属性の伝搬
セキュリティー属性伝搬のトークンの実装
関連資料
セキュリティー: 学習用リソース
システム・ログイン構成用のカスタム・ログイン・モジュール開発
例: デフォルトの許可トークンの使用
例: デフォルトの伝搬トークンの使用
タスク・トピック    

ご利用条件 | フィードバック

最終更新: Jan 21, 2008 9:12:22 PM EST
http://publib.boulder.ibm.com/infocenter/wasinfo/v6r1/index.jsp?topic=/com.ibm.websphere.zseries.doc/info/zseries/ae/tsec_propcustjavaser.html