ナビゲーションをスキップ

WebLogic Security サービスの開発

  前 次 前/次ボタンと目次ボタンとの区切り線 目次  

認可プロバイダ

認可とは、ユーザの ID などの情報に基づいて、ユーザと WebLogic リソースとのやり取りを管理するプロセスのことです。言い換えれば、認可とは「自分は何にアクセスできますか」という質問に答えるものです。WebLogic Server では、認可プロバイダはユーザと WebLogic リソースとの対話を制限して、整合性、機密性、および可用性を確保します。

以下の節では、認可プロバイダの概念と機能、およびカスタム認可プロバイダの開発手順について説明します。

 


認可の概念

認可プロバイダを開発する前に、以下の概念を理解しておく必要があります。

アクセス決定

認証プロバイダの LoginModule と同じく、アクセス決定は、「アクセスは許可されるのか」という質問に答える認可プロバイダのコンポーネントです。具体的には、指定された操作を WebLogic リソースに対して実行するパーミッションをサブジェクトが持っているかどうかが、アプリケーション内の特定のパラメータを用いてアクセス決定に質問されます。この情報が与えられると、アクセス決定はそれに対する回答を PERMITDENY、または ABSTAIN のいずれかで返します。

注意 : アクセス決定の詳細については、「AccessDecision SSPI を実装する」を参照してください。

 


認可プロセス

図  6-1 に、認可プロセスにおける認可プロバイダ (および関連する裁決プロバイダとロール マッピング プロバイダ) と WebLogic Security フレームワークとの対話を示します。その後、この図について説明します。

図 6-1 認可プロバイダと認可プロセス

認可プロバイダと認可プロセス


 

一般に、認可は以下のように実行されます。

  1. ユーザまたはシステム プロセスが WebLogic リソースを要求し、特定の操作を実行しようとします。
  2. 要求された WebLogic リソースのタイプを処理するリソース コンテナがリクエストを受け取ります。たとえば EJB コンテナは EJB リソースに対するリクエストを受け取ります。
  3. 注意 : リソース コンテナは、「セキュリティ プロバイダと WebLogic リソース」で説明されている WebLogic リソースのいずれかを処理するコンテナです。

  4. リソース コンテナは、ContextHandler オブジェクトを作成します。このオブジェクトは、コンフィグレーション済みのロール マッピング プロバイダと認可プロバイダのアクセス決定がそのリクエストのコンテキストに関連付けられている情報を取得するために使用できます。
  5. 注意 : ContextHandler の詳細については、「ContextHandler と WebLogic リソース」を参照してください。アクセス決定の詳細については、「アクセス決定」を参照してください。ロール マッピング プロバイダの詳細については、「ロール マッピング プロバイダ」を参照してください。

    リソース コンテナは、サブジェクト、リソース、そして場合によっては決定用の追加入力を提供する ContextHandler オブジェクトを渡して WebLogic Security フレームワークを呼び出します。

  6. WebLogic Security フレームワークは、コンフィグレーション済みのロール マッピング プロバイダを呼び出します。
  7. ロール マッピング プロバイダは ContextHandler を用いて、リクエストに関するさまざまな情報を要求します。また、ロール マッピング プロバイダは、要求する情報のタイプを表す一連の Callback オブジェクトを作成します。その Callback オブジェクト群は、handle メソッドを通じて、配列として ContextHandler に渡されます。
  8. ロール マッピング プロバイダは、Callback オブジェクトに格納されている値、サブジェクト、およびリソースを用いて、リクエスト側のサブジェクトに付与されるセキュリティ ロールを計算し、該当するセキュリティ ロールを WebLogic Security フレームワークに渡します。

  9. WebLogic Security は、要求されたアクションをリソースに対して実行する資格がサブジェクトにあるかどうかに関する実際の判定を認可プロバイダに委託します。
  10. 認可プロバイダのアクセス決定ではまた、ContextHandler を用いてリクエストに関するさまざまな情報を要求します。アクセス決定は、要求する情報のタイプを表す一連の Callback オブジェクトを作成します。その Callback オブジェクト群は、handle メソッドを通じて、配列として ContextHandler に渡されます。このプロセスは、手順 5 のロール マッピング プロバイダの場合と同じです。

  11. コンフィグレーション済みの各認可プロバイダのアクセス決定の isAccessAllowed() メソッドが呼び出され、要求されたアクセスを実行する権限がサブジェクトにあるかどうかが、ContextHandler、サブジェクト、WebLogic リソース、およびセキュリティ ロールに基づいて判定されます。各 isAccessAllowed() メソッドは、以下の 3 つの値のいずれかを返します。
  12. このプロセスは、すべてのアクセス決定が使用されるまで続きます。

  13. WebLogic Security フレームワークは、コンフィグレーション済みの認可プロバイダのアクセス決定から返された判定結果に食い違いがあった場合、その調停を裁決プロバイダに委託します。裁決プロバイダでは、認可判定の最終結果を決定します。
  14. 注意 : 裁決プロバイダの詳細については、「裁決プロバイダ」を参照してください。

  15. 裁決プロバイダは TRUEFALSE の判定を認可プロバイダに返し、認可プロバイダはその判定を WebLogic Security フレームワークを通してリソース コンテナに転送します。

 


カスタム認可プロバイダを開発する必要があるか

WebLogic Server のデフォルト (つまりアクティブな) セキュリティ レルムには WebLogic 認可プロバイダが含まれています。WebLogic 認可プロバイダは、このバージョンの WebLogic Server の認可機能をデフォルトで適用するものです。WebLogic 認可プロバイダは、特定のユーザが保護対象の WebLogic リソースへのアクセスを許可されているかどうかを判定するためのポリシーベースの認可エンジンを使用して、アクセス決定を返します。また、WebLogic 認可プロバイダは、システム内のセキュリティ ポリシーのデプロイメントとアンデプロイメントもサポートしています。自社の既存の認可メカニズムを使用する場合は、カスタム認可プロバイダを作成してそれを既存のメカニズムに結合できます。

 


カスタム認可プロバイダの開発方法

WebLogic 認可プロバイダが開発者のニーズを満たさない場合、次の手順でカスタム認可プロバイダを開発することができます。

適切な SSPI を使用して実行時クラスを作成する

実行時クラスを作成する前に、以下の作業が必要です。

この情報を理解し、設計に関する判断を下したら、次の手順でカスタム認可プロバイダの実行時クラスを作成します。

注意 : セキュリティ レルムでは、少なくとも 1 つの認可プロバイダが DeployableAuthorizationProvider SSPI を実装する必要があり、そうでなければ、Web アプリケーションや EJB をデプロイすることが不可能になります。

カスタム認可プロバイダの実行時クラスの作成例については、「例 : サンプル認可プロバイダの実行時クラスの作成」を参照してください。

AuthorizationProvider SSPI を実装する

AuthorizationProvider SSPI を実装するには、「「Provider」SSPI の目的を理解する」で説明されているメソッドと以下のメソッドの実装を提供する必要があります。

getAccessDecision

public AccessDecision getAccessDecision();

getAccessDecision メソッドは、AccessDecision SSPI の実装を取得します。 MyAuthorizationProviderImpl.java という 1 つの実行時クラスの場合、getAccessDecision メソッドの実装は次のようになります。

return this;

実行時クラスが 2 つの場合、getAccessDecision メソッドの実装は次のようになります。

return new MyAccessDecisionImpl;

この理由は、AuthorizationProvider SSPI を実装する実行時クラスが、AccessDecision SSPI を実装するクラスを取得するためのファクトリとして使用されるからです。

AuthorizationProvider SSPI と getAccessDecision メソッドの詳細については、「WebLogic Server 8.1 API リファレンス Javadoc」を参照してください。

DeployableAuthorizationProvider SSPI を実装する

DeployableAuthorizationProvider SSPI を実装するには、「「Provider」SSPI の目的を理解する」および「AuthorizationProvider SSPI を実装する」で説明されているメソッドと以下のメソッドの実装を提供する必要があります。

deployPolicy

public void deployPolicy(Resource resource, java.lang.String[] roleNames) throws ResourceCreationException

deployPolicy メソッドは、セキュリティ ポリシーの適用対象となる WebLogic リソースとセキュリティ ポリシー内に記載されるセキュリティ ロール名を基に、デプロイ済みの Web アプリケーションや EJB に代わってセキュリティ ポリシーを作成します。

undeployPolicy

public void undeployPolicy(Resource resource) throws ResourceRemovalException

undeployPolicy メソッドは、セキュリティ ポリシーの適用対象であった WebLogic リソースを基に、アンデプロイされた Web アプリケーションや EJB に代わってセキュリティ ポリシーを削除します。

DeployableAuthorizationProvider SSPI と deployPolicy および undeployPolicy メソッドの詳細については、「WebLogic Server 8.1 API リファレンス Javadoc」を参照してください。

AccessDecision SSPI を実装する

AccessDecision SSPI を実装する際には、以下のメソッドの実装を提供する必要があります。

isAccessAllowed

public Result isAccessAllowed(Subject subject, Map roles,

Resource resource, ContextHandler handler, Direction direction) throws InvalidPrincipalException

isAccessAllowed メソッドは、サブジェクトに格納されている情報を利用して、リクエスト側に保護対象リソースへのアクセスを許可すべきかどうかを決定します。isAccessAllowed メソッドはリクエストの前または後に呼び出すことができ、PERMITDENY、または ABSTAIN のいずれかの値を返します。複数のアクセス決定がコンフィグレーションされていて、それらが相反する値を返す場合、最終結果を決定するには裁決プロバイダが必要になります。詳細については、「裁決プロバイダ」を参照してください。

isProtectedResource

public boolean isProtectedResource(Subject subject, Resource resource) throws InvalidPrincipalException

isProtectedResource メソッドは、指定された WebLogic リソースが保護対象かどうかを実際にアクセス チェックを行わずに決定するために使用します。これは呼び出し側のサブジェクトに付与できる一連のセキュリティ ロールを計算するわけではないので、軽量のメカニズムに過ぎません。

AccessDecision SSPI と isAccessAllowed および isProtectedResource メソッドの詳細については、「WebLogic Server 8.1 API リファレンス Javadoc」を参照してください。

レルム アダプタ認証プロバイダと互換性のあるカスタム認可プロバイダを開発する

認証プロバイダは、サブジェクト内へのユーザおよびグループの格納を担当するセキュリティ プロバイダです。ユーザおよびグループはその後、認可プロバイダなど、他のタイプのセキュリティ プロバイダによって、サブジェクトから抽出されます。セキュリティ レルム内でコンフィグレーションされた認証プロバイダがレルム アダプタ認証プロバイダである場合、ユーザおよびグループの情報は、他の認証プロバイダとは少し異なる形でサブジェクト内に格納されます。したがって、このユーザおよびグループの情報もまた、少し異なる方法で抽出する必要があります。

コード リスト  6-1 では、サブジェクトへの格納にレルム アダプタ認証プロバイダが使用された場合に、サブジェクトがユーザ名またはグループ名に一致するかどうかをチェックするために、カスタム認可プロバイダが使用できるコードを示しています。このコードは、isAccessAllowed メソッドと isProtectedResource メソッドの双方に属しています。

コード リスト 6-1 サブジェクトがユーザ名またはグループ名に一致するかどうかをチェックするサンプル コード

/** 
 * サブジェクトがユーザ/グループ名に一致するかどうかを判断する
 *
 * @param principalWant このロール内のプリンシパルの名前を含む文字列
 * (ロール定義)
 *
 * @param subject ユーザのグループだけでなくリソースにもアクセスしようとしている
 * ユーザを識別するプリンシパルを含むサブジェクト
 *
 * @return 現在のサブジェクトがロール内のプリンシパル名に一致していれば true、
 * それ以外の場合は false の boolean
 */
private boolean subjectMatches(String principalWant, Subject subject)
{
   // 最初に、グループ名の一致かどうかを確認
   if (SubjectUtils.isUserInGroup(subject, principalWant)) {
      return true;
   }
   // 2 番目に、ユーザ名の一致かどうかを確認
   if (principalWant.equals(SubjectUtils.getUsername(subject))) {
      return true;
   }
   // 一致せず
   return false;
}

例 : サンプル認可プロバイダの実行時クラスの作成

コード リスト  6-2 は、サンプル認可プロバイダの実行時クラスである SampleAuthorizationProviderImpl.java クラスを示しています。 実行時クラスには以下の実装が含まれています。

注意 : コード リスト  6-2 の太字のコードは、クラス宣言とメソッド シグネチャを示しています。

コード リスト 6-2 SampleAuthorizationProviderImpl.java

package examples.security.providers.authorization;
import java.security.Principal;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import javax.security.auth.Subject;
import weblogic.management.security.ProviderMBean;
import weblogic.security.WLSPrincipals;
import weblogic.security.service.ContextHandler;
import weblogic.security.spi.AccessDecision;
import weblogic.security.spi.DeployableAuthorizationProvider;
import weblogic.security.spi.Direction;
import weblogic.security.spi.InvalidPrincipalException;
import weblogic.security.spi.Resource;
import weblogic.security.spi.ResourceCreationException;
import weblogic.security.spi.ResourceRemovalException;
import weblogic.security.spi.Result;
import weblogic.security.spi.SecurityServices;
public final class SampleAuthorizationProviderImpl implements DeployableAuthorizationProvider, AccessDecision
{
   private String description;
   private SampleAuthorizerDatabase database;
   public void initialize(ProviderMBean mbean, SecurityServices services)
   {
      System.out.println("SampleAuthorizationProviderImpl.initialize");
      SampleAuthorizerMBean myMBean = (SampleAuthorizerMBean)mbean;
      description = myMBean.getDescription() + "\n" + myMBean.getVersion();
      database = new SampleAuthorizerDatabase(myMBean);
   }
   public String getDescription()
   {
      return description;
   }
   public void shutdown()
   {
      System.out.println("SampleAuthorizationProviderImpl.shutdown");
   }
   public AccessDecision getAccessDecision()
   {
      return this;
   }
   public Result isAccessAllowed(Subject subject, Map roles, Resource resource, 
   ContextHandler handler, Direction direction) throws InvalidPrincipalException
   {
      System.out.println("SampleAuthorizationProviderImpl.isAccessAllowed");
      System.out.println("\tsubject\t= " + subject);
      System.out.println("\troles\t= " + roles);
      System.out.println("\tresource\t= " + resource);
      System.out.println("\tdirection\t= " + direction);
      Set principals = subject.getPrincipals();
      for (Resource res = resource; res != null; res = res.getParentResource()) {
         if (database.policyExists(res)) {
            return isAccessAllowed(res, principals, roles);
         }
      }
      return Result.ABSTAIN;
   }
   public boolean isProtectedResource(Subject subject, Resource resource) throws 
   InvalidPrincipalException
   {
      System.out.println("SampleAuthorizationProviderImpl.
        isProtectedResource");
      System.out.println("\tsubject\t= " + subject);
      System.out.println("\tresource\t= " + resource);
      for (Resource res = resource; res != null; res = res.getParentResource()) {
         if (database.policyExists(res)) {
            return true;
         }
      }
      return false;
   }
   public void deployPolicy(Resource resource, String[] roleNamesAllowed)
   throws ResourceCreationException
   {
      System.out.println("SampleAuthorizationProviderImpl.deployPolicy");
      System.out.println("\tresource\t= " + resource);
      for (int i = 0; roleNamesAllowed != null && i < roleNamesAllowed.length; 
       i++) {
         System.out.println("\troleNamesAllowed[" + i + "]\t= " +
         roleNamesAllowed[i]);
      }
      database.setPolicy(resource, roleNamesAllowed);
   }
   public void undeployPolicy(Resource resource) throws ResourceRemovalException
   {
      System.out.println("SampleAuthorizationProviderImpl.undeployPolicy");
      System.out.println("\tresource\t= " + resource);
      database.removePolicy(resource);
   }
   private boolean principalsOrRolesContain(Set principals, Map roles, String 
   principalOrRoleNameWant)
   {
      if (roles.containsKey(principalOrRoleNameWant)) {
         return true;
      }
      {
         for (Iterator i = principals.iterator(); i.hasNext();) {
            Principal principal = (Principal)i.next();
            String principalNameHave = principal.getName();
            if (principalOrRoleNameWant.equals(principalNameHave)) {
               return true;
            }
         }
      }
      return false;
   }
   private Result isAccessAllowed(Resource resource, Set principals, Map roles)
   {
      for (Enumeration e = database.getPolicy(resource); e.hasMoreElements();)
      {
       String principalOrRoleNameAllowed = (String)e.nextElement();
       if (WLSPrincipals.getEveryoneGroupname().
         equals(principalOrRoleNameAllowed) ||
         (WLSPrincipals.getUsersGroupname().equals(principalOrRoleNameAllowed)
         && !principals.isEmpty()) || principalsOrRolesContain(principals,
         roles, principalOrRoleNameAllowed))
         {
            return Result.PERMIT;
         }
      }
      return Result.DENY;
   }
}

WebLogic MBeanMaker を使用して MBean タイプを生成する

カスタム セキュリティ プロバイダの MBean タイプを生成する前に、以下の作業が必要です。

この情報を理解し、設計に関する判断を下したら、次の手順でカスタム認可プロバイダの MBean タイプを作成します。

注意 : これらの手順の実行方法は、いくつかのサンプル セキュリティ プロバイダ (dev2dev Web サイトの「Code Samples: WebLogic Server」で入手可能) に示されています。

この節で説明する手順はすべて、Windows 環境での作業を想定しています。

MBean 定義ファイル (MDF) を作成する

MBean 定義ファイル (MDF) を作成するには、次の手順に従います。

  1. サンプル認可プロバイダの MDF をテキスト ファイルにコピーします。
  2. 注意 : サンプル認可プロバイダの MDF は、SampleAuthorizer.xml という名前です。

  3. MDF で <MBeanType> 要素と <MBeanAttribute> 要素の内容をカスタム認可プロバイダに合わせて修正します。
  4. カスタム属性および操作 (つまり、<MBeanAttribute> および <MBeanOperation> 要素) を MDF に追加します。
  5. ファイルを保存します。

注意 : MDF 要素の構文についての完全なリファレンスは、「MBean 定義ファイル (MDF) 要素の構文」に収められています。

WebLogic MBeanMaker を使用して MBean タイプを生成する

MDF を作成したら、WebLogic MBeanMaker を使用してそれを実行できます。WebLogic MBeanMaker は現在のところコマンドライン ユーティリティで、入力として MDF を受け取り、MBean インタフェース、MBean 実装、関連する MBean 情報ファイルなどの中間 Java ファイルをいくつか出力します。これらの中間ファイルが合わさって、カスタム セキュリティ プロバイダの MBean タイプになります。

MBean タイプの作成手順は、カスタム認可プロバイダの設計に応じて異なります。必要な設計に合わせて適切な手順を実行してください。

任意 SSPI MBean とカスタム操作を追加しない場合

カスタム認可プロバイダの MDF に任意 SSPI MBean もカスタム操作も実装しない場合、次の手順に従います。

  1. 新しい DOS シェルを作成します。クラスパスに以下を設定する必要があります。
  1. 次のコマンドを入力します。
  2. java -DMDF=xmlfile -Dfiles=filesdir -DcreateStubs=true weblogic.management.commo.WebLogicMBeanMaker

    ここで、-DMDF フラグは WebLogic MBeanMaker が MDF をコードに変換すべきであることを示し、xmlFile は MDF (XML MBean の記述ファイル)、filesdir は WebLogic MBeanMaker で作成された MBean タイプの中間ファイルが格納される場所を示します。

    -DMDF フラグで指定された xml ファイルと同じディレクトリに WL_HOME\server\lib\commo.dtd をコピーします。

    xmlfile が入力されるたびに、新しい出力ファイル群が生成されます。

    -DcreateStubs=true フラグを使用するたびに、既存の MBean 実装ファイルがすべて上書きされます。

    注意 : WebLogic MBeanMaker では MDF を一度に 1 つ処理します。そのため、MDF が複数ある (つまり認可プロバイダが複数ある) 場合には、このプロセスを繰り返す必要があります。

任意 SSPI MBean またはカスタム操作を追加する場合

カスタム認可プロバイダの MDF に任意 SSPI MBean またはカスタム操作を実装する場合、以下の質問に答えながら手順を進めてください。

  1. 新しい DOS シェルを作成します。クラスパスに以下を設定する必要があります。
  1. 次のコマンドを入力します。
  2. java -DMDF=xmlfile -Dfiles=filesdir -DcreateStubs=true weblogic.management.commo.WebLogicMBeanMaker

    ここで、-DMDF フラグは WebLogic MBeanMaker が MDF をコードに変換すべきであることを示し、xmlFile は MDF (XML MBean の記述ファイル)、filesdir は WebLogic MBeanMaker で作成された MBean タイプの中間ファイルが格納される場所を示します。

    -DMDF フラグで指定された xml ファイルと同じディレクトリに WL_HOME\server\lib\commo.dtd をコピーします。

    xmlfile が入力されるたびに、新しい出力ファイル群が生成されます。

    -DcreateStubs=true フラグを使用するたびに、既存の MBean 実装ファイルがすべて上書きされます。

    注意 : WebLogic MBeanMaker では MDF を一度に 1 つ処理します。 そのため、MDF が複数ある (つまり認可プロバイダが複数ある) 場合には、このプロセスを繰り返す必要があります。

  3. 任意 SSPI MBean を MDF に実装した場合は、次の手順に従います。
    1. MBean 実装ファイルを見つけます。
    2. WebLogic MBeanMaker によって生成される MBean 実装ファイルには、MBeanNameImpl.java という名前が付けられます。たとえば、SampleAuthorizer という MDF の場合には、編集すべき MBean 実装ファイルの名前は SampleAuthorizerImpl.java です。

    3. MDF で実装した任意 SSPI MBean ごとに、メソッド スタブを「Mapping MDF Operation Declarations to Java Method Signatures Document」(dev2dev Web サイトで入手可能) から MBean 実装ファイルにコピーし、各メソッドを実装します。任意 SSPI MBean が継承するメソッドもすべて実装してください。
  4. MDF にカスタム操作を含めた場合、メソッド スタブを使用してメソッドを実装します。
  5. ファイルを保存します。
  1. WebLogic MBeanMaker によって現在のメソッドの実装が上書きされないように、既存の MBean 実装ファイルを一時ディレクトリにコピーします。
  2. 新しい DOS シェルを作成します。クラスパスに以下を設定する必要があります。
  1. 次のコマンドを入力します。
  2. java -DMDF=xmlfile -Dfiles=filesdir -DcreateStubs=true weblogic.management.commo.WebLogicMBeanMaker

    ここで、-DMDF フラグは WebLogic MBeanMaker が MDF をコードに変換すべきであることを示し、xmlFile は MDF (XML MBean の記述ファイル)、filesdir は WebLogic MBeanMaker で作成された MBean タイプの中間ファイルが格納される場所を示します。

    -DMDF フラグで指定された xml ファイルと同じディレクトリに WL_HOME\server\lib\commo.dtd をコピーします。

    xmlfile が入力されるたびに、新しい出力ファイル群が生成されます。

    -DcreateStubs=true フラグを使用するたびに、既存の MBean 実装ファイルがすべて上書きされます。

    注意 : WebLogic MBeanMaker では MDF を一度に 1 つ処理します。そのため、MDF が複数ある (つまり認可プロバイダが複数ある) 場合には、このプロセスを繰り返す必要があります。

  3. 任意 SSPI MBean を MDF に実装した場合は、次の手順に従います。
    1. MBean 実装ファイルを見つけます。
    2. WebLogic MBeanMaker によって生成される MBean 実装ファイルには、MBeanNameImpl.java という名前が付けられます。たとえば、SampleAuthorizer という MDF の場合には、編集すべき MBean 実装ファイルの名前は SampleAuthorizerImpl.java です。

    3. 手順 1 で一時ディレクトリに保存した既存の MBean 実装ファイルを開きます。
    4. 既存の MBean 実装ファイルを、WebLogic MBeanMaker によって生成された MBean 実装ファイルと同期させます。
    5. これには、メソッドの実装を既存の MBean 実装ファイルから新しく生成された MBean 実装ファイルにコピー (または、新しく生成された MBean 実装ファイルから既存の MBean 実装ファイルに新しいメソッドを追加) し、いずれの MBean 実装ファイルにも入っているメソッドのメソッド シグネチャへの変更が使用する MBean 実装ファイルに反映されていることを確認するといった作業が必要です。

    6. MDF を修正して元の MDF にはない任意 SSPI MBean を実装した場合は、メソッド スタブを「Mapping MDF Operation Declarations to Java Method Signatures Document」(dev2dev Web サイトで入手可能) から MBean 実装ファイルにコピーし、各メソッドを実装します。任意 SSPI MBean が継承するメソッドもすべて実装してください。
  4. MDF を変更して元の MDF にはないカスタム操作を含めた場合、メソッド スタブを使用してメソッドを実装します。
  5. 完成した、つまりすべてのメソッドを実装した MBean 実装ファイルを保存します。
  6. この MBean 実装ファイルを、WebLogic MBeanMaker が MBean タイプの実装ファイルを配置したディレクトリにコピーします。このディレクトリは、手順 3 で filesdir として指定しました (手順 3 の結果として WebLogic MBeanMaker で生成された MBean 実装ファイルがオーバーライドされる)。

生成される MBean インタフェース ファイルについて

MBean インタフェース ファイルとは、実行時クラスまたは MBean 実装がコンフィグレーション データを取得するために使用する MBean のクライアントサイド API です。「「Provider」SSPI の目的を理解する」で説明されているように、これは initialize メソッドで使用するのが一般的です。

WebLogic MBeanMaker では、作成済みの MDF から MBean タイプを生成するので、生成される MBean インタフェース ファイルの名前は、その MDF 名の後に「MBean」というテキストが付いたものになります。たとえば、WebLogic MBeanMaker で SampleAuthorizer MDF を実行すると、その結果、SampleAuthorizerMBean.java という MBean インタフェース ファイルが生成されます。

WebLogic MBeanMaker を使用して MBean JAR ファイル (MJF) を作成する

WebLogic MBeanMaker を使用して MDF を実行して中間ファイルを生成し、MBean 実装ファイルを手作業で編集してその中にメソッドの内容を記述したら、カスタム認可プロバイダの MBean ファイルと実行時クラスを MBean JAR ファイル (MJF) にパッケージ化する必要があります。このプロセスも、WebLogic MBeanMaker によって自動化されます。

カスタム認可プロバイダの MJF を作成するには、次の手順に従います。

  1. 新しい DOS シェルを作成します。クラスパスに以下を設定する必要があります。
  1. 次のコマンドを入力します。
  2. java -DMJF=jarfile -Dfiles=filesdir weblogic.management.commo.WebLogicMBeanMaker

    ここで、-DMJF フラグは WebLogic MBeanMaker が新しい MBean タイプを含む JAR ファイルを構築すべきであることを示し、jarfile は MJF の名前、filesdir は WebLogic MBeanMaker で MJF に JAR 化する対象ファイルが存在する場所を示します。

    この時点でコンパイルが行われるので、エラーが発生するおそれがあります。jarfile が指定されていて、エラーが発生しなかった場合には、指定された名前の MJF が作成されます。

注意 : 既存の MJF を更新する場合は、MJF をいったん削除してから再生成します。WebLogic MBeanMaker にも -DIncludeSource オプションがあり、それを指定すると、生成される MJF にソース ファイルを含めるかどうかを制御することができます。ソース ファイルには、生成されたソースと MDF そのものがあります。 デフォルトは false です。このオプションは、-DMJF を使用しない場合には無視されます。

生成された MJF は、自らの WebLogic Server 環境にインストールすることも、顧客に配布してそれぞれの WebLogic Server 環境にインストールしてもらうこともできます。

WebLogic Server 環境に MBean タイプをインストールする

MBean タイプを WebLogic Server 環境にインストールするには、MJF を WebLogic Server の WL_HOME\server\lib\mbeantypes ディレクトリにコピーします。ここで、WL_HOME は WebLogic Server の最上位のインストール ディレクトリです。このインストール コマンドによって、カスタム認可プロバイダが「デプロイ」されます。つまり、カスタム認可プロバイダを WebLogic Server Administration Console から管理できるようになります。

注意 : MBean タイプをインストールするデフォルトのディレクトリは、WL_HOME\server\lib\mbeantypes です。ただし、サーバを起動するときに -Dweblogic.alternateTypesDirectory=<dir> コマンドライン フラグを使用すれば、WebLogic Server が追加ディレクトリで MBean タイプを検索します。<dir> は、ディレクトリ名のカンマ区切りのリストです。このフラグを使用する場合、WebLogic Server は常に最初に WL_HOME\server\lib\mbeantypes から MBean タイプをロードします。たとえば、-Dweblogic.alternateTypesDirectory = dirX,dirY の場合、WebLogic Server は最初に WL_HOME\server\lib\mbeantypes から MBean タイプをロードしてから、dirX および dirY にある有効なアーカイブをロードします。WebLogic Server に追加ディレクトリで MBean タイプを検索するように指示する際に Java セキュリティ マネージャを使用している場合には、weblogic.policy ファイルを更新して、MBean タイプ (その結果としてカスタム セキュリティ プロバイダ) に対する適切なパーミッションを付与することも必要になります。詳細については、『WebLogic Security プログラマーズ ガイド』の「Java セキュリティ マネージャを使用しての WebLogic リソースの保護」を参照してください。

カスタム認可プロバイダをコンフィグレーションすることによって (「Administration Console を使用してカスタム認可プロバイダをコンフィグレーションする」を参照)、MBean タイプのインスタンスを作成して、GUI、他の Java コード、または API からそれらの MBean インスタンスを使用することができます。たとえば、WebLogic Server Administration Console を使用して、属性を取得/設定したり操作を呼び出したりすることもできますし、他の Java オブジェクトを開発して、そのオブジェクトで MBean をインスタンス化し、それらの MBean から提供される情報に自動的に応答させることもできます。なお、これらの MBean インスタンスをバックアップしておくことをお勧めします。詳細については、『WebLogic Server のコンフィグレーションと管理』の「障害が発生したサーバの回復」の「セキュリティ データのバックアップ」を参照してください。

Administration Console を使用してカスタム認可プロバイダをコンフィグレーションする

カスタム認可プロバイダをコンフィグレーションするということは、認可サービスを必要とするアプリケーションがアクセス可能なセキュリティ レルムにカスタム認可プロバイダを追加するということです。

カスタム セキュリティ プロバイダのコンフィグレーションは管理タスクですが、カスタム セキュリティ プロバイダの開発者が行うこともできます。この節では、カスタム認可プロバイダのコンフィグレーション担当者向けの重要な情報を取り上げます。

注意 : WebLogic Server Administration Console を使用してカスタム認可プロバイダをコンフィグレーションする手順は、『WebLogic Security の管理』の「カスタム セキュリティ プロバイダのコンフィグレーション」で説明されています。

認可プロバイダとデプロイメント記述子の管理

エンタープライズ JavaBean (EJB) や Web アプリケーションなどのアプリケーションの中には、Java 2 Enterprise Edition (J2EE) の関連デプロイメント情報と WebLogic Server デプロイメント記述子を格納するものがあります。Web アプリケーションの場合、デプロイメント記述子ファイル (web.xmlweblogic.xml) には、セキュリティ ポリシーの宣言を含む J2EE セキュリティ モデルの実装情報が格納されます。この情報は、WebLogic Server Administration Console で認可プロバイダを初めてコンフィグレーションするときに格納するのが一般的です。

Administration Console には、この目的のために [今後の再デフォルトの設定] ドロップダウン メニューが用意されています。開発者または管理者は、カスタム認可プロバイダを初めてコンフィグレーションするときにこのメニューに [デプロイメント記述子のロールとポリシーを初期化] が設定されていることを確認する必要があります。

注意 : [今後の再デフォルトの設定] ドロップダウン メニューは、デフォルトで [デプロイメント記述子のロールとポリシーを初期化] に設定されています。[今後の再デフォルトの設定] ドロップダウン メニューにアクセスするには、Administration Console の左ペインで [セキュリティ|レルム|realm] (realm はセキュリティ レルムの名前) をクリックします。次に [全般] タブを選択します。

このドロップダウン メニューの値が [デプロイメント記述子のロールとポリシーを初期化] で、Web アプリケーションがデプロイされた場合、WebLogic Server は、web.xml および weblogic.xml デプロイメント記述子ファイル (コード リスト  6-3 および コード リスト  6-4 の例を参照) からセキュリティ ポリシー情報を読み出します。 この情報は、認可プロバイダのセキュリティ プロバイダ データベースにコピーされます。

注意 : [ロールとポリシーのチェック対象] ドロップダウン メニューの値を [すべての Web アプリケーションと EJB] に変更した場合は、[今後の再デプロイの設定] ドロップダウン メニューの値だけを変更できます。詳細については、『WebLogic リソースのセキュリティ』の「URL リソースおよび EJB リソースを保護する方法」および「URL リソースおよび EJB リソースを保護するための前提条件」を参照してください。

コード リスト 6-3 web.xml ファイルのサンプル

<web-app> 
   <welcome-file-list> 
      <welcome-file>welcome.jsp</welcome-file>
   </welcome-file-list>
   <security-constraint> 
      <web-resource-collection>
         <web-resource-name>Success</web-resource-name>
         <url-pattern>/welcome.jsp</url-pattern>
         <http-method>GET</http-method>
         <http-method>POST</http-method>
      </web-resource-collection>
      <auth-constraint>
         <role-name>developers</role-name>
      </auth-constraint>
   </security-constraint>
   <login-config> 
       <auth-method>BASIC</auth-method>
       <realm-name>default</realm-name>
   </login-config>
   <security-role> 
      <role-name>developers</role-name>
   </security-role>
</web-app>

コード リスト 6-4 weblogic.xml ファイルのサンプル

<weblogic-web-app> 
   <security-role-assignment>
      <role-name>developers</role-name>
      <principal-name>myGroup</principal-name>
   </security-role-assignment>
</weblogic-web-app>

セキュリティ ポリシーは web.xml/weblogic.xml デプロイメント記述子ファイルでも WebLogic Server Administration Console でも追加することができますが、Web アプリケーションまたは EJB のデプロイメント記述子で定義したセキュリティ ポリシーをいったんコピーしてから Administration Console を使用してポリシーを追加することをお勧めします。この理由は、認可プロバイダのコンフィグレーション中に Administration Console を使用してセキュリティ ポリシーを変更すると、その内容が web.xml および weblogic.xml ファイルに保持されないからです。Administration Console を使用して再デプロイする、ディスク上で Web アプリケーションを変更した、または WebLogic Server を再起動したといった場合に、Web アプリケーションを再デプロイするときには、[今後の再デプロイの設定] ドロップダウン メニューの値を [デプロイメント記述子のロールとポリシーを無視] に設定する必要があります。選択しない場合、Administration Console で定義したセキュリティ ポリシーがデプロイメント記述子に定義されているセキュリティ ポリシーによって上書きされます。詳細については、『WebLogic リソースのセキュリティ』の「組み合わせた方法による URL リソースと EJB リソースの保護」を参照してください。

注意 : EJB についてもプロセスは同じですが、ejb-jar.xml/weblogic-ejb-jar.xml デプロイメント記述子を使用します。

[今後の再デプロイの設定] ドロップダウン メニューは、ロール マッピング プロバイダおよび資格マッピング プロバイダにも影響します。詳細については、それぞれ「ロール マッピング プロバイダとデプロイメント記述子の管理」と「資格マッピング プロバイダ、リソース アダプタ、およびデプロイメント記述子の管理」を参照してください。

ポリシー デプロイメントの有効化

カスタム認可プロバイダの開発の一環として DeployableAuthorizationProvider SSPI を実装し、カスタム認可プロバイダでデプロイ可能なセキュリティ ポリシーをサポートしたい場合、カスタム認可プロバイダのコンフィグレーション担当者 (つまり、開発者または管理者) は、WebLogic Server Administration Console で [ポリシー デプロイメントを有効化] チェック ボックスがチェックされていることを確認する必要があります。チェックがはずれていると、認可プロバイダは「オフ」と見なされます。このため、複数の認可プロバイダがコンフィグレーションされている場合、[ポリシー デプロイメントを有効化] チェック ボックスを使用して、セキュリティ ポリシーのデプロイメントに使用する認可プロバイダを指定できます。

注意 : [今後の再デプロイの設定] ドロップダウン メニュー (「認可プロバイダとデプロイメント記述子の管理」で説明したようにセキュリティ レルム レベルで指定) では、コンフィグレーション対象の認可プロバイダのセキュリティ データベースにセキュリティ ポリシーをコピーするかどうかを指定します。 [ポリシー デプロイメントを有効化] チェック ボックス (コンフィグレーション対象の認可プロバイダごとに指定) では、認可プロバイダがデプロイ済みのセキュリティ ポリシーを格納するかどうかを指定します。

セキュリティ ポリシーを管理するためのメカニズムを提供する

WebLogic Server Administration Console を使用してカスタム認可プロバイダをコンフィグレーションすると、必要な認可サービスにアプリケーションからアクセスできるようにすることはできますが、このセキュリティ プロバイダに関連付けられたセキュリティ ポリシーを管理する方法を管理者にも提供する必要があります。たとえば WebLogic 認可プロバイダには、ポリシー エディタ ページ (図  6-2 を参照) が管理者向けに用意されており、リソースを右クリックして [セキュリティ ポリシーを定義] オプションを選択すると、さまざまな WebLogic リソースのセキュリティ ポリシーを追加、変更、または削除することができます。

図 6-2 WebLogic 認可プロバイダのポリシー エディタ ページ

WebLogic 認可プロバイダのポリシー エディタ ページ


 

管理者は、カスタム認可プロバイダを開発するときに、ポリシー エディタ ページも右クリック メニューも利用できません。したがって、セキュリティ ポリシーを管理するための独自のメカニズムを提供する必要があります。このメカニズムでは、カスタム認可プロバイダのデータベースのセキュリティ ポリシー データ (つまり式) を読み書きできなければなりません。

それには、以下の 3 通りの方法があります。

オプション 1 : コンソール拡張を使用して独自の「ポリシー エディタ」ページを作成する

カスタム認可プロバイダ用にコンソール拡張を作成する方法の主な利点は、WebLogic リソースの ID が自動的にわかるので、その WebLogic リソースがリソース階層のどこにあるかもわかるということです。この情報は、認可プロバイダのデータベースから式を読み書きするために必要です。また、WebLogic 認可プロバイダのポリシー エディタ ページのように、作成したページを既存の WebLogic Server Administration Console の GUI に統合できるという利点もあります。

この方法を選択した場合、次の作業が必要になります。

  1. weblogic.management.console.extensibility.SecurityExtensionV2 インタフェースの getExtensionForPolicy() メソッドを実装し、作成したポリシー エディタ ページをこのメソッドで返します。
  2. 注意 : 詳細については、「カスタム セキュリティ プロバイダ用のコンソール拡張の記述」を参照してください。

  3. また、以下のいずれかを実行する必要があります。
    1. PolicyEditor および PolicyReader 認可用任意 SSPI MBean を実装し、作成したポリシー エディタ ページと認可プロバイダのデータベースとの間の仲介役となる管理 MBean を開発します。詳細については、「拡張および実装する SSPI MBean を決定する」と表  2-4 を参照してください。
    2. この場合、文字列として表現可能なセキュリティ ポリシーを構成する式 (Role=AdminGroup=Administrators など) の構文も開発する必要があります。

      注意 : この構文は、認可プロバイダごとに異なっていてもかまいません。式の詳細については、『WebLogic リソースのセキュリティ』の「セキュリティ ポリシーの構成要素 : ポリシー条件、式、およびポリシー文」を参照してください。

    3. セキュリティ ポリシーを管理するための MBean API を開発し、それらのインタフェースを実装し、作成したポリシー エディタ ページと認可プロバイダのデータベースとの間の仲介役となる管理 MBean を開発します。
    4. MBean に委託しないで、作成したページから直接、カスタム認可プロバイダのデータベースの式を読み書きします。

オプション 2 : セキュリティ ポリシー管理用のスタンドアロン ツールを開発する

WebLogic Server Administration Console とまったく別のツールを開発する場合には、この方法を選択します。

この方法の場合、「オプション 1 : コンソール拡張を使用して独自の「ポリシー エディタ」ページを作成する」で説明したカスタム認可プロバイダ用のコンソール拡張を記述する必要もなく、管理 MBean を開発する必要もありません。ただし、ツールでは以下のことを行う必要があります。

  1. WebLogic リソースの ID を特定します。ID がコンソール拡張によって自動的に提供されないためです。詳細については、「WebLogic リソース識別子」を参照してください。
  2. セキュリティ ポリシーを構成する式を表す方法を決定します。この表現は完全に任意であり、「オプション 1 : コンソール拡張を使用して独自の「ポリシー エディタ」ページを作成する」と違って文字列である必要はありません。
  3. カスタム認可プロバイダのデータベースの式を読み書きします。

オプション 3 : 既存のセキュリティ ポリシー管理ツールを Administration Console に統合する

WebLogic Server Administration Console とは別のツールを持っており、それを Administration Console から起動する場合には、この方法を選択します。

この方法の場合、ツールでは以下のことを行う必要があります。

  1. WebLogic リソースの ID を特定します。ID がコンソール拡張によって自動的に提供されないためです。詳細については、「WebLogic リソース識別子」を参照してください。
  2. セキュリティ ポリシーを構成する式を表す方法を決定します。この表現は完全に任意であり、「オプション 1 : コンソール拡張を使用して独自の「ポリシー エディタ」ページを作成する」と違って文字列である必要はありません。
  3. カスタム認可プロバイダのデータベースの式を読み書きします。
  4. Administration Console の拡張』に説明されているように、基本コンソール拡張を使用して Administration Console にリンクします。

 

フッタのナビゲーションのスキップ  ページの先頭 前 次