クライアント許可プログラミング

WebSphere® eXtreme Scale は、Java 認証・承認サービス (JAAS) 許可をすぐに使用できるようサポートし、ObjectGridAuthorization インターフェースを使用するカスタム許可もサポートします。

ObjectGridAuthorization プラグインは、Subject オブジェクトで表されるプリンシパルに対して ObjectGrid、ObjectMap、および JavaMap の各アクセスを独自の方法で許可する場合に使用します。このプラグインの通常の実装の目的は、Subject オブジェクトからプリンシパルを取得し、このプリンシパルに指定の許可が付与されているかどうかを確認することです。

checkPermission(Subject, Permission) メソッドに渡される許可は、以下の許可のいずれかです。

詳しくは、ObjectGridAuthorization API 資料を参照してください。

MapPermission

com.ibm.websphere.objectgrid.security.MapPermission パブリック・クラスは ObjectGrid リソース 、特に ObjectMap または JavaMap インターフェースのメソッドへの許可を表します。 WebSphere eXtreme Scale は、ObjectMap および JavaMap のメソッドにアクセスするための 以下の許可ストリングを定義します。

詳しくは、MapPermission API 資料を参照してください。

([ObjectGrid_name].[ObjectMap_name]) というフォーマットの完全修飾 ObjectGrid マップ名、および許可ストリングまたは整数値を渡すことによって、MapPermission オブジェクトを構成できます。 許可ストリングは、上記の許可ストリングで構成されるコンマ区切りストリングにしたり (read, insert など)、 または all にしたりできます。許可整数値は、 上記のすべての許可整数定数いずれにも、または MapPermission.READ|MapPermission.WRITE など、 いくつかの整数許可定数の数値にすることができます。

ObjectMap または JavaMap メソッドが 呼び出されると、許可が実行されます。 ランタイムはさまざまなメソッドに対するさまざまな許可を検査します。 必要な許可がクライアントに与えられていない場合は、AccessControlException が発生します。

表 1. メソッドと必要な MapPermission のリスト
許可 ObjectMap/JavaMap
read Boolean containsKey(Object)
Boolean equals(Object)
Object get(Object)
Object get(Object, Serializable)
List getAll(List)
List getAll(List keyList, Serializable)
List getAllForUpdate(List)
List getAllForUpdate(List, Serializable)
Object getForUpdate(Object)
Object getForUpdate(Object, Serializable)
public Object getNextKey(long)
write Object put(Object key, Object value)
void put(Object, Object, Serializable)
void putAll(Map)
void putAll(Map, Serializable)
void update(Object, Object)
void update(Object, Object, Serializable)
insert public void insert (Object, Object)
void insert(Object, Object, Serializable)
remove Object remove (Object)
void removeAll(Collection)
void clear()
invalidate public void invalidate (Object, Boolean)
void invalidateAll(Collection, Boolean)
void invalidateUsingKeyword(Serializable)
int setTimeToLive(int)

許可の基になるのは、使用するメソッドのみであり、 メソッドが実際に行う機能ではありません。例えば、put メソッドでは、 レコードの有無に基づいて、レコードを挿入または更新できます。ただし、挿入と更新の事例の区別はされません。

ある種類の操作を組み合わせて、別の種類の操作を実現することもできます。例えば、更新は、除去と挿入によって達成することができます。 許可ポリシーを設計する場合は、これらの組み合わせを考慮に入れてください。

ObjectGridPermission

com.ibm.websphere.objectgrid.security.ObjectGridPermission は、ObjectGrid への 許可を表します。
  • Query: オブジェクト照会またはエンティティー照会を作成する許可。整数定数は ObjectGridPermission.QUERY として定義されます。
  • Dynamic map: マップ・テンプレートに基づいて動的マップを作成 する許可。整数定数は ObjectGridPermission.DYNAMIC_MAP として定義されます。
詳しくは、ObjectGridPermission API 資料を参照してください。

以下の表は、メソッドと必要な ObjectGridPermission のリストです。

表 2. メソッドと必要な ObjectGridPermission のリスト
許可アクション 方式
query com.ibm.websphere.objectgrid.Session.createObjectQuery(String)
query com.ibm.websphere.objectgrid.em.EntityManager.createQuery(String)
dynamicmap com.ibm.websphere.objectgrid.Session.getMap(String)

ServerMapPermission

ServerMapPermission は、 サーバーでホストされる ObjectMap への許可を表します。許可の名前は ObjectGrid マップ名のフルネームです。以下の 2 つのアクションを備えています。

詳しくは、ServerMapPermission API 資料を 参照してください。以下の表に、さまざまな ServerMapPermission を必要とするメソッドを示します。
表 3. サーバーでホストされる ObjectMap への許可
許可アクション 方式
replicate com.ibm.websphere.objectgrid.ClientReplicableMap.enableClientReplication(Mode, int[], ReplicationMapListener)
dynamicIndex com.ibm.websphere.objectgrid.BackingMap.createDynamicIndex(String, Boolean, String, DynamicIndexCallback)
dynamicIndex com.ibm.websphere.objectgrid.BackingMap.removeDynamicIndex(String)

AgentPermission

AgentPermission は、datagrid エージェントに対する許可を表します。許可の 名前は、ObjectGrid マップのフルネームで、アクションの名前は、エージェント実装クラス名 またはパッケージ名をコンマで区切ったストリングです。

詳しくは、AgentPermission API 資料を参照してください。

クラス com.ibm.websphere.objectgrid.datagrid.AgentManager の以下のメソッドには、AgentPermission が必要です。
com.ibm.websphere.objectgrid.datagrid.AgentManager#callMapAgent(MapGridAgent, Collection)
com.ibm.websphere.objectgrid.datagrid.AgentManager#callMapAgent(MapGridAgent)
com.ibm.websphere.objectgrid.datagrid.AgentManager#callReduceAgent(ReduceGridAgent, Collection)
com.ibm.websphere.objectgrid.datagrid.AgentManager#callReduceAgent(ReduceGridAgent, Collection)

許可メカニズム

WebSphere eXtreme Scale は、2 種類の許可メカニズム、Java 認証・承認サービス (JAAS) 許可とカスタム許可をサポートしています。 これらのメカニズムは、すべての許可に適用されます。JAAS 許可は、ユーザー中心のアクセス制御により Java セキュリティー・ポリシーを拡張します。 許可の付与は、実行されているコードだけではなく、コードの実行者に基づいて行うこともできます。JAAS 許可は、SDK バージョン 5 以降に付属しています。

さらに、WebSphere eXtreme Scale では、以下のプラグインによって カスタム許可もサポートしています。

JAAS 許可を使用したくない場合は、独自の許可メカニズムを実装できます。 カスタム許可メカニズムでは、ポリシー・データベース、ポリシー・サーバー、または Tivoli® Access Manager を 使用して、許可を管理できます。

許可メカニズムを構成するには、 以下の 2 とおりの方法があります。

JAAS 許可

javax.security.auth.Subject オブジェクトは、認証済みユーザーを表します。 Subject は、プリンシパルのセットから構成され、各プリンシパルはそのユーザーの ID を表します。例えば、Subject には、 名前のプリンシパル (Joe Smith など) とグループのプリンシパル (manager など) を持たせることができます。

JAAS 許可ポリシーを使用すると、許可を特定のプリンシパルに付与することができます。WebSphere eXtreme Scale は、Subject と現行のアクセス制御コンテキストを関連付けます。 ObjectMap または JavaMap メソッドに対する各呼び出しごとに、Java ランタイムによって自動的に、 ポリシーが特定のプリンシパルのみに必要な許可を付与しているかどうかが判断されます。 付与している場合、アクセス制御コンテキストに関連付けられた Subject に、 指定されたプリンシパルが含まれているときにのみ操作が許可されます。

ポリシー・ファイルのポリシー構文について理解している 必要があります。JAAS 許可について詳しくは、「JAAS Reference Guide」を参照してください。

WebSphere eXtreme Scale には、ObjectMap および JavaMap メソッドの呼び出しに 対する JAAS 許可の検査に使用される特別なコードベースがあります。この特別なコードベース は、http://www.ibm.com/com/ibm/ws/objectgrid/security/PrivilegedAction です。プリンシパルに ObjectMap または JavaMap 許可を与える場合は、このコード・ベースを使用します。 この特別なコードは、eXtreme Scale の Java アーカイブ (JAR) ファイルにすべての許可が 与えられるため、作成されました。

MapPermission 許可を付与するためのポリシーのテンプレートは、以下のとおりです。

grant codeBase "http://www.ibm.com/com/ibm/ws/objectgrid/security/PrivilegedAction" 
   <Principal field(s)>{
    permission com.ibm.websphere.objectgrid.security.MapPermission 
               "[ObjectGrid_name].[ObjectMap_name]", "action";
    ....
    permission com.ibm.websphere.objectgrid.security.MapPermission 
               "[ObjectGrid_name].[ObjectMap_name]", "action";
  };
Principal フィールドの例は、以下のとおりです。
principal Principal_class "principal_name"

このポリシーでは、特定のプリンシパルに、これらの 4 つのマップに対する insert 許可および read 許可のみが付与されます。他のポリシー・ファイル fullAccessAuth.policy では、プリンシパルに、これらのマップに対するすべての許可が付与されます。 アプリケーションを実行する前に、principal_name とプリンシパル・クラスを適切な 値に変更してください。 principal_name の値は、ユーザー・レジストリーに応じて異なります。 例えば、ローカル OS をユーザー・レジストリーとして使用する場合は、マシン名は MACH1、ユーザー ID は user1、principal_name は MACH1/user1 になります。

JAAS 許可ポリシーは、Java ポリシー・ファイルに直接入れる ことができます。または、別の JAAS 許可ファイルに入れてから、以下の 2 つのうちいずれかの方法で設定することができます。

カスタム ObjectGrid 許可

ObjectGridAuthorization プラグインは、Subject オブジェクトで表されるプリンシパルに対して ObjectGrid、ObjectMap、および JavaMap の各アクセスを独自の方法で許可する場合に使用します。このプラグインの通常の 実装の目的は、Subject オブジェクトからプリンシパルを取得し、このプリンシパルに指定の許可が 付与されているかどうかを確認することです。

checkPermission(Subject, Permission) メソッドに渡される許可は、 以下のいずれかです。

詳しくは、ObjectGridAuthorization API 資料を参照してください。

ObjectGridAuthorization プラグインは、以下の方法で構成することができます。

ObjectGridAuthorization の実装

ObjectGridAuthorization インターフェースの Boolean checkPermission(Subject subject, Permission permission) メソッドが WebSphere eXtreme Scale ランタイムによって呼び出されて、渡された Subject オブジェクトに、渡された許可があるかどうかが検査されます。 オブジェクトに許可がある場合は、ObjectGridAuthorization インターフェースの実装によって true が返され、許可がない場合は false が返されます。

このプラグインの通常の実装は、Subject オブジェクトからプリンシパルを検索し、 指定された許可が特定のポリシーを参照してプリンシパルに与えられているかどうかを確認することです。 これらのポリシーは、ユーザーが定義します。 例えば、ポリシーはデータベース、プレーン・ファイル、または Tivoli Access Manager で定義できます。

例えば、Tivoli Access Manager ポリシー・サーバーを 使用して許可ポリシーを管理し、その API を使用してアクセスを許可できます。 Tivoli Access Manager Authorization API の使用方法について詳しくは、「IBM® Tivoli Access Manager Authorization Java Classes デベロッパーズ・リファレンス」を 参照してください。

このサンプル実装では、以下を想定します。

以下は、checkPermission メソッドの実装方法を示したコード・スニペットです。

/**
* @see com.ibm.websphere.objectgrid.security.plugins.
* 		MapAuthorization#checkPermission
* (javax.security.auth.Subject, com.ibm.websphere.objectgrid.security.
* 		MapPermission)
*/
public boolean checkPermission(final Subject subject, 
	Permission p) {
  
  // For non-MapPermission, we always authorize.
  if (!(p instanceof MapPermission)){
    return true;
  }

  MapPermission permission = (MapPermission) p;

  String[] str = permission.getParsedNames();
  
  StringBuffer pdPermissionStr = new StringBuffer(5); 
  for (int i=0; i<str.length; i++) {
    pdPermissionStr.append(str[i].substring(0,1));
  }
  
  PDPermission pdPerm = new PDPermission(permission.getName(), 
		pdPermissionStr.toString());
  
  Set principals = subject.getPrincipals();
  
  Iterator iter= principals.iterator(); 
  while(iter.hasNext()) {
    try {
      PDPrincipal principal = (PDPrincipal) iter.next();
      if (principal.implies(pdPerm)) {
        return true;
      }
    }
    catch (ClassCastException cce) {
      // Handle exception
    }
  }
  return false;
}