WebSphere® eXtreme Scale は、Java 認証・承認サービス (JAAS) 許可をすぐに使用できるようサポートし、ObjectGridAuthorization インターフェースを使用するカスタム許可もサポートします。
ObjectGridAuthorization プラグインは、Subject オブジェクトで表されるプリンシパルに対して ObjectGrid、ObjectMap、および JavaMap の各アクセスを独自の方法で許可する場合に使用します。このプラグインの通常の実装の目的は、Subject オブジェクトからプリンシパルを取得し、このプリンシパルに指定の許可が付与されているかどうかを確認することです。
checkPermission(Subject, Permission) メソッドに渡される許可は、以下の許可のいずれかです。
詳しくは、ObjectGridAuthorization API 資料を参照してください。
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 が発生します。
許可 | 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 のリストです。
許可アクション | 方式 |
---|---|
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 は、 サーバーでホストされる ObjectMap への許可を表します。許可の名前は ObjectGrid マップ名のフルネームです。以下の 2 つのアクションを備えています。
許可アクション | 方式 |
---|---|
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 は、datagrid エージェントに対する許可を表します。許可の 名前は、ObjectGrid マップのフルネームで、アクションの名前は、エージェント実装クラス名 またはパッケージ名をコンマで区切ったストリングです。
詳しくは、AgentPermission API 資料を参照してください。
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 とおりの方法があります。
ObjectGrid XML ファイルを使用して ObjectGrid を定義し、許可メカニズムを AUTHORIZATION_MECHANISM_JAAS または AUTHORIZATION_MECHANISM_CUSTOM のいずれかに設定します。以下は、エンタープライズ・アプリケーション ObjectGridSample で 使用している secure-objectgrid-definition.xml ファイルです。
<objectGrids>
<objectGrid name="secureClusterObjectGrid" securityEnabled="true"
authorizationMechanism="AUTHORIZATION_MECHANISM_JAAS">
<bean id="TransactionCallback"
classname="com.ibm.websphere.samples.objectgrid.HeapTransactionCallback" />
...
</objectGrids>
メソッド ObjectGrid.setAuthorizationMechanism(int) を使用して ObjectGrid を作成する場合、以下のメソッドを呼び出して許可メカニズムを設定できます。このメソッドの呼び出しは、 直接 ObjectGrid インスタンスを生成する場合のローカル WebSphere eXtreme Scale プログラミング・モデルにのみ適用されます。
/**
* Set the authorization Mechanism. The default is
* com.ibm.websphere.objectgrid.security.SecurityConstants.
* AUTHORIZATION_MECHANISM_JAAS.
* @param authMechanism the map authorization mechanism
*/
void setAuthorizationMechanism(int authMechanism);
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 つのうちいずれかの方法で設定することができます。
-Djava.security.auth.policy=file:[JAAS_AUTH_POLICY_FILE]
-Dauth.policy.url.x=file:[JAAS_AUTH_POLICY_FILE]
カスタム ObjectGrid 許可
ObjectGridAuthorization プラグインは、Subject オブジェクトで表されるプリンシパルに対して ObjectGrid、ObjectMap、および JavaMap の各アクセスを独自の方法で許可する場合に使用します。このプラグインの通常の 実装の目的は、Subject オブジェクトからプリンシパルを取得し、このプリンシパルに指定の許可が 付与されているかどうかを確認することです。
checkPermission(Subject, Permission) メソッドに渡される許可は、 以下のいずれかです。
詳しくは、ObjectGridAuthorization API 資料を参照してください。
ObjectGridAuthorization プラグインは、以下の方法で構成することができます。
ObjectGrid XML ファイルを使用して、ObjectAuthorization プラグインを定義できます。以下に例を示します。
<objectGrids>
<objectGrid name="secureClusterObjectGrid" securityEnabled="true"
authorizationMechanism="AUTHORIZATION_MECHANISM_CUSTOM">
...
<bean id="ObjectGridAuthorization"
className="com.acme.ObjectGridAuthorizationImpl" />
</objectGrids>
API メソッド ObjectGrid.setObjectGridAuthorization(ObjectGridAuthorization) を使用して ObjectGrid を作成する場合、以下のメソッドを呼び出して許可プラグインを設定できます。このメソッドは、 直接 ObjectGrid インスタンスを生成するときに、ローカル eXtreme Scale プログラミング・モデルにのみ適用されます。
/**
* Sets the <code>ObjectGridAuthorization</code> for this ObjectGrid instance.
* <p>
* Passing <code>null</code> to this method removes a previously set
* <code>ObjectGridAuthorization</code> object from an earlier invocation of this method
* and indicates that this <code>ObjectGrid</code> is not associated with a
* <code>ObjectGridAuthorization</code> object.
* <p>
* This method should only be used when ObjectGrid security is enabled. If
* the ObjectGrid security is disabled, the provided <code>ObjectGridAuthorization</code> object
* will not be used.
* <p>
* A <code>ObjectGridAuthorization</code> plugin can be used to authorize
* access to the ObjectGrid and maps. Please refer to <code>ObjectGridAuthorization</code> for more details.
*
* <p>
* As of XD 6.1, the <code>setMapAuthorization</code> is deprecated and
* <code>setObjectGridAuthorization</code> is recommended for use. However,
* if both <code>MapAuthorization</code> plugin and <code>ObjectGridAuthorization</code> plugin
* are used, ObjectGrid will use the provided <code>MapAuthorization</code> to authorize map accesses,
* even though it is deprecated.
* <p>
* Note, to avoid an <code>IllegalStateException</code>, this method must be
* called prior to the <code>initialize()</code> method. Also, keep in mind
* that the <code>getSession</code> methods implicitly call the
* <code>initialize()</code> method if it has yet to be called by the
* application.
*
* @param ogAuthorization the <code>ObjectGridAuthorization</code> plugin
*
* @throws IllegalStateException if this method is called after the
* <code>initialize()</code> method is called.
*
* @see #initialize()
* @see ObjectGridAuthorization
* @since WAS XD 6.1
*/
void setObjectGridAuthorization(ObjectGridAuthorization ogAuthorization);
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;
}