Java SE セキュリティー・チュートリアル - ステップ 5

前のステップのようにクライアントを認証した後、 eXtreme Scale 許可メカニズムによりセキュリティー特権を付与することができます。

始める前に

このタスクを続行する前に Java SE セキュリティー・チュートリアル - ステップ 4 を完了している必要があります。

このタスクについて

このチュートリアルの前のステップでは、eXtreme Scale グリッドで認証を使用可能にする方法について説明しました。 この結果として、非認証クライアントは、 サーバーに接続することができず、システムに要求の実行依頼をすることができません。ただし、 認証されている各クライアントは、ObjectGrid マップに格納されているデータの読み取り、 書き込み、削除など、サーバーに対して同じアクセス権または特権を持っています。クライアントは、どのような照会でも実行できます。 このセクションでは、eXtreme Scale 許可を使用してさまざまな認証済みユーザーにさまざまな特権を付与する方法について説明します。

他の多くのシステムと同様、eXtreme Scale でもアクセス権ベースの許可メカニズムを採用しています。 WebSphere® eXtreme Scale には、各種の許可クラスによって表されるさまざまな許可カテゴリーがあります。 このトピックでは、MapPermission について説明します。許可のすべてのカテゴリーは、クライアント許可プログラミングを参照してください。

WebSphere eXtreme Scale では、com.ibm.websphere.objectgrid.security.MapPermission クラスは eXtreme Scale リソース、特に ObjectMap インターフェースまたは JavaMap インターフェースのメソッドに対する許可を表しています。 WebSphere eXtreme Scale は、ObjectMap および JavaMap のメソッドにアクセスするための 以下の許可ストリングを定義します。
  • read: マップからデータを読み取る許可を与えます。
  • write: マップのデータを更新する許可を与えます。
  • insert: マップにデータを挿入する許可を与えます。
  • remove: マップからデータを削除する許可を与えます。
  • invalidate: マップからのデータを無効にする許可を与えます。
  • all: read、write、insert、remove、および invalidate に対するすべての許可を与えます。

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

このチュートリアルでは、Java 認証・承認サービス (JAAS) 許可を使用して、さまざまなユーザーに対する許可マップ・アクセスを付与する方法について説明します。

手順

  1. eXtreme Scale 許可を使用可能にします。
    ObjectGrid で許可を使用可能にするには、 XML ファイルで、その特定の ObjectGrid の securityEnabled 属性を true に設定する必要があります。 ObjectGrid でセキュリティーを使用可能にするということは、許可を使用可能にするということです。 以下のコマンドを使用して、セキュリティーが使用可能な新しい ObjectGrid XML ファイルを作成します。
    1. xml ディレクトリーに移動します。
      cd objectgridRoot/xml
    2. SimpleApp.xml ファイルを SecureSimpleApp.xml ファイルにコピーします。
      cp SimpleApp.xml SecureSimpleApp.xml
    3. SecureSimpleApp.xml ファイルを開いて、 以下の XML に示すように、ObjectGrid レベルで securityEnabled="true" を追加します。
      <?xml version="1.0" encoding="UTF-8"?>
      <objectGridConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
          xsi:schemaLocation="http://ibm.com/ws/objectgrid/config ../objectGrid.xsd" 
      		 xmlns="http://ibm.com/ws/objectgrid/config">
          <objectGrids>
              <objectGrid name="accounting" securityEnabled="true">
                  <backingMap name="customer" readOnly="false" copyKey="true"/>
              </objectGrid>
          </objectGrids>
      </objectGridConfig>
  2. 許可ポリシーを定義します。
    クライアントごとの認証のセクションで、鍵ストアに 3 人のユーザー (cashier、manager、および administrator) を作成しました。 この例では、ユーザー「cashier」は すべてのマップに対する読み取り許可のみを持ち、ユーザー「manager」はすべての許可を持ちます。 この例では、JAAS 許可が使用されます。JAAS 許可では許可ポリシー・ファイルを使用して、 プリンシパルに許可を付与します。次の og_auth.policy ファイルはセキュリティー・ディレクトリーに定義されています。
    og_auth.policy
    grant codebase "http://www.ibm.com/com/ibm/ws/objectgrid/security/PrivilegedAction"
        principal javax.security.auth.x500.X500Principal "CN=cashier,O=acme,OU=OGSample" {
        permission com.ibm.websphere.objectgrid.security.MapPermission "accounting.*", "read ";
    };
    
    grant codebase "http://www.ibm.com/com/ibm/ws/objectgrid/security/PrivilegedAction"
        principal javax.security.auth.x500.X500Principal "CN=manager,O=acme,OU=OGSample" {
        permission com.ibm.websphere.objectgrid.security.MapPermission "accounting.*", "all";
    };
    注:
    • codebase "http://www.ibm.com/com/ibm/ws/objectgrid/security/PrivilegedAction" は、ObjectGrid 用の特別予約 URL です。 プリンシパルに付与されているすべての ObjectGrid 許可では、この特別なコードベースを使用します。
    • 1 番目の grant ステートメントでは、「read」マップ許可が プリンシパル "CN=cashier,O=acme,OU=OGSample" に付与されるので、cashier には、ObjectGrid アカウンティングの すべてのマップに対するマップ読み取り許可のみが付与されます。
    • 2 番目の grant ステートメントでは「all」マップ許可が プリンシパル "CN=manager,O=acme,OU=OGSample" に付与されるので、manager には、ObjectGrid アカウンティングのマップに対するすべての許可が付与されます。
    これで、許可ポリシーを使用してサーバーを起動することができます。 次のように標準の -D プロパティーを使用して JAAS 許可ポリシー・ファイルを設定することができます。-Djava.security.auth.policy=../security/og_auth.policy
  3. アプリケーションを実行します。

    上記のファイルを作成すると、アプリケーションを実行することができます。

    以下のコマンドを使用して、カタログ・サーバーを始動します。カタログ・サービスの開始について詳しくは、スタンドアロン・カタログ・サービスの開始を参照してください。

    1. bin ディレクトリーに移動します。cd objectgridRoot/bin
    2. カタログ・サーバーを始動します。
      • [Unix][Linux] startOgServer.sh catalogServer -clusterSecurityFile ../security/security.xml -serverProps ../security/server.properties -jvmArgs -Djava.security.auth.login.config="../security/og_jaas.config"
      • [Windows] startOgServer.bat catalogServer -clusterSecurityFile ../security/security.xml -serverProps ../security/server.properties -jvmArgs -Djava.security.auth.login.config="../security/og_jaas.config"

      security.xml ファイルおよび server.properties ファイルは、このチュートリアルの前のステップで作成されています。

      T

    3. 次に、以下のスクリプトを使用して、セキュア・コンテナー・サーバーを始動できます。 bin ディレクトリーから以下のスクリプトを実行します。
      • [Unix][Linux] # startOgServer.sh c0 -objectGridFile ../xml/SecureSimpleApp.xml -deploymentPolicyFile ../xml/SimpleDP.xml -catalogServiceEndPoints localhost:2809 -serverProps ../security/server.properties -jvmArgs -Djava.security.auth.login.config="../security/og_jaas.config" -Djava.security.auth.policy="../security/og_auth.policy"
      • [Windows] startOgServer.bat c0 -objectGridFile ../xml/SecureSimpleApp.xml -deploymentPolicyFile ../xml/SimpleDP.xml -catalogServiceEndPoints localhost:2809 -serverProps ../security/server.properties -jvmArgs -Djava.security.auth.login.config="../security/og_jaas.config" -Djava.security.auth.policy="../security/og_auth.policy"
    前のコンテナー・サーバー始動コマンドとの以下の違いに注意してください。
    • SimpleApp.xml ファイルの代わりに、SecureSimpleApp.xml ファイルを使用します。
    • 別の -Djava.security.auth.policy 引数を追加して、JAAS 許可ポリシー・ファイルをコンテナー・サーバー・プロセスに設定します。
    このチュートリアルの直前のステップで使用したのと同じコマンドを使用します。
    1. bin ディレクトリーに移動します。
    2. java -classpath ../lib/objectgrid.jar;../applib/sec_sample.jar com.ibm.websphere.objectgrid.security.sample.guide.SecureSimpleApp ../security/client.properties manager manager1

      ユーザー「manager」にはアカウンティング ObjectGrid のマップに対するすべての許可が付与されているため、アプリケーションは正しく実行されます。

      次に、ユーザー「manager」を使用する代わりに、ユーザー「cashier」を使用して、クライアント・アプリケーションを開始します。

    3. bin ディレクトリーに移動します。
    4. java -classpath ../lib/objectgrid.jar;../applib/sec_sample.jar com.ibm.ws.objectgrid.security.sample.guide.SecureSimpleApp ../security/client.properties cashier cashier1

    以下の例外が発生します。

    Exception in thread "P=387313:O=0:CT" com.ibm.websphere.objectgrid.TransactionException: 
    rolling back transaction, see caused by exception
    	at com.ibm.ws.objectgrid.SessionImpl.rollbackPMapChanges(SessionImpl.java:1422)
     	at com.ibm.ws.objectgrid.SessionImpl.commit(SessionImpl.java:1149)
     	at com.ibm.ws.objectgrid.SessionImpl.mapPostInvoke(SessionImpl.java:2260)
     	at com.ibm.ws.objectgrid.ObjectMapImpl.update(ObjectMapImpl.java:1062)
     	at com.ibm.ws.objectgrid.security.sample.guide.SimpleApp.run(SimpleApp.java:42)
    	at com.ibm.ws.objectgrid.security.sample.guide.SecureSimpleApp.main(SecureSimpleApp.java:27)
    Caused by: com.ibm.websphere.objectgrid.ClientServerTransactionCallbackException: 
       Client Services - received exception from remote server:
         com.ibm.websphere.objectgrid.TransactionException: transaction rolled back, 
    			see caused by Throwable
            at com.ibm.ws.objectgrid.client.RemoteTransactionCallbackImpl.processReadWriteResponse(
                RemoteTransactionCallbackImpl.java:1399)
            at com.ibm.ws.objectgrid.client.RemoteTransactionCallbackImpl.processReadWriteRequestAndResponse(
                RemoteTransactionCallbackImpl.java:2333)
            at com.ibm.ws.objectgrid.client.RemoteTransactionCallbackImpl.commit(RemoteTransactionCallbackImpl.java:557)
            at com.ibm.ws.objectgrid.SessionImpl.commit(SessionImpl.java:1079)
            ... 4 more
    Caused by: com.ibm.websphere.objectgrid.TransactionException: transaction rolled back, see caused by Throwable
            at com.ibm.ws.objectgrid.ServerCoreEventProcessor.processLogSequence(ServerCoreEventProcessor.java:1133)
            at com.ibm.ws.objectgrid.ServerCoreEventProcessor.processReadWriteTransactionRequest
    					(ServerCoreEventProcessor.java:910)
            at com.ibm.ws.objectgrid.ServerCoreEventProcessor.processClientServerRequest(ServerCoreEventProcessor.java:1285)
    
            at com.ibm.ws.objectgrid.ShardImpl.processMessage(ShardImpl.java:515)
            at com.ibm.ws.objectgrid.partition.IDLShardPOA._invoke(IDLShardPOA.java:154)
            at com.ibm.CORBA.poa.POAServerDelegate.dispatchToServant(POAServerDelegate.java:396)
            at com.ibm.CORBA.poa.POAServerDelegate.internalDispatch(POAServerDelegate.java:331)
            at com.ibm.CORBA.poa.POAServerDelegate.dispatch(POAServerDelegate.java:253)
            at com.ibm.rmi.iiop.ORB.process(ORB.java:503)
            at com.ibm.CORBA.iiop.ORB.process(ORB.java:1553)
            at com.ibm.rmi.iiop.Connection.respondTo(Connection.java:2680)
            at com.ibm.rmi.iiop.Connection.doWork(Connection.java:2554)
            at com.ibm.rmi.iiop.WorkUnitImpl.doWork(WorkUnitImpl.java:62)
            at com.ibm.rmi.iiop.WorkerThread.run(ThreadPoolImpl.java:202)
            at java.lang.Thread.run(Thread.java:803)
    Caused by: java.security.AccessControlException: Access denied (
       com.ibm.websphere.objectgrid.security.MapPermission accounting.customer write)
            at java.security.AccessControlContext.checkPermission(AccessControlContext.java:155)
            at com.ibm.ws.objectgrid.security.MapPermissionCheckAction.run(MapPermissionCheckAction.java:141)
            at java.security.AccessController.doPrivileged(AccessController.java:275)
            at javax.security.auth.Subject.doAsPrivileged(Subject.java:727)
            at com.ibm.ws.objectgrid.security.MapAuthorizer$1.run(MapAuthorizer.java:76)
            java.security.AccessController.doPrivileged(AccessController.java:242)
            at com.ibm.ws.objectgrid.security.MapAuthorizer.check(MapAuthorizer.java:66)
            at com.ibm.ws.objectgrid.security.SecuredObjectMapImpl.checkMapAuthorization(SecuredObjectMapImpl.java:429)
            at com.ibm.ws.objectgrid.security.SecuredObjectMapImpl.update(SecuredObjectMapImpl.java:490)
            at com.ibm.ws.objectgrid.SessionImpl.processLogSequence(SessionImpl.java:1913)
            at com.ibm.ws.objectgrid.SessionImpl.processLogSequence(SessionImpl.java:1805)
            at com.ibm.ws.objectgrid.ServerCoreEventProcessor.processLogSequence(ServerCoreEventProcessor.java:1011)
            ... 14 more

    この例外は、ユーザー「cashier」に書き込み許可が付与されていないため、map customer を更新できないことが原因です。

    これで、システムは許可をサポートするようになりました。許可ポリシーを定義して、 ユーザーごとに各種の許可を付与することができます。許可について詳しくは、アプリケーション・クライアントの許可を参照してください。

次のタスク

チュートリアルの次のステップを完了します。Java SE セキュリティー・チュートリアル - ステップ 6を参照してください。