プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle Coherenceの保護
12c (12.2.1)
E69905-02
目次へ移動
目次

前
次

4 サーバー側操作へのアクセスの許可

この章では、認可を使用してCoherence操作へのアクセスをセキュアにする手順を説明します。

この章の内容は次のとおりです。

アクセス制御認可の概要

アクセス制御認可により、アプリケーションで独自の認可論理を定義して、クラスタ操作へのアクセスを制限できます。認可は、Subject内のPrincipalとして表される識別情報に基づきます。アプリケーションは、Subjectがコール元スレッドに存在することを確認します。Subjectが存在しない、または取得できない場合、操作は失敗し、SecurityExceptionエラーが発生します。

アプリケーションは、StorageAccessAuthorizerインタフェースを実装して、認可論理を指定します。実装は、オペレーション・オーバーライド構成ファイルで宣言され、また、キャッシュ構成ファイル内の分散スキーマのバッキング・マップを構成して、パーティション化キャッシュ上で有効化する必要があります。アクセス制御認可は、パーティション化キャッシュでのみ使用できます。

StorageAccessAuthorizerインタフェースにより、Read、Write、Read AnyおよびWrite Any認可チェックを実行するために使用するメソッドが提供されます。Coherenceは、StorageAccessAuthorizer実装による認可の決定が、論理的に一貫しているとみなします。特定のSubjectで、Write認可は特定のエントリに対するREAD認可を指し、Read Any認可はすべてのエントリに対するRead認可を指し、Write Any認可はすべてのエントリに対するWriteおよびRead認可を指します。

表4-1 に、NamedCache APIおよびBinaryEntry APIメソッドで発生する認可チェックの一覧を示します。

表4-1 共通メソッドの認可チェック

認可チェック NamedCache APIメソッド BinaryEntry APIメソッド

なし

  • containsKey

  • containsValue

  • isEmpty

  • size

  • lock

  • unlock

Read

  • get

  • getAll

  • getValue

  • getBinaryValue

  • extract

  • getOriginalValue

  • getOriginalBinaryValue

Write

  • invoke

  • put

  • putAll

  • remove

  • removeAll

  • setValue

  • update

  • updtaeBinaryValue

  • remove

  • expire

Read Any

  • addMapListener1

  • aggregate

  • entrySet

  • keySet

  • removeMapListener1

Write Any

  • addIndex

  • clear

  • invokeAll

  • removeIndex

  • values

アクセス制御認可の実装の作成

アクセス制御認可実装を作成するには、com.tangosol.net.security.StorageAccessAuthorizerインタフェースを実装するクラスを作成します。実装では、どのコール元(Subjectに基づき)を認可してエントリおよびバッキング・マップ・コンテキスト(それぞれBinaryEntryおよびBackingMapManagerContext)にアクセスするか定義する必要があります。

注意:

BinaryEntryおよびBackingMapManagerContext APIにより、キャッシュ名、サービス名およびサービスおよびクラスタ・レジストリへの完全なアクセスを取得することができます。

例4-1 に、各認可リクエストのログ・メッセージを出力するサンプルのStorageAccessAuthorizer実装を示します。これは、Coherenceで提供されるAuditingAuthorizerクラスに基づき、 デフォルトのアクセス・コントローラ実装で使用されます。

例4-1 StorageAccessAuthorizer実装のサンプル

package com.examples.security;
 
import com.tangosol.net.BackingMapContext;
import com.tangosol.net.CacheFactory;
import com.tangosol.net.security.StorageAccessAuthorizer;
import com.tangosol.util.BinaryEntry;
 
import javax.security.auth.Subject;
 
public class MyLogAuthorizer implements StorageAccessAuthorizer
{
    public MyLogAuthorizer()
        {
        this(false);
        }
 
    public MyLogAuthorizer(boolean fStrict)
        {
        f_fStrict = fStrict;
        }
 
    @Override
    public void checkRead(BinaryEntry entry, Subject subject, int nReason)
        {
        logEntryRequest(entry, subject, false, nReason);
 
        if (subject == null && f_fStrict)
            {
            throw new SecurityException("subject is not provided");
            }
        }
 
    @Override
    public void checkWrite(BinaryEntry entry, Subject subject, int nReason)
        {
        logEntryRequest(entry, subject, true, nReason);
 
        if (subject == null && f_fStrict)
            {
            throw new SecurityException("subject is not provided");
            }
        }
 
    @Override
    public void checkReadAny(BackingMapContext context, Subject subject, 
        int nReason)
        {
        logMapRequest(context, subject, false, nReason);
 
        if (subject == null && f_fStrict)
            {
            throw new SecurityException("subject is not provided");
            }
        }
 
    @Override
    public void checkWriteAny(BackingMapContext context, Subject subject, 
        int nReason)
        {
        logMapRequest(context, subject, true, nReason);
 
        if (subject == null && f_fStrict)
            {
            throw new SecurityException("subject is not provided");
            }
        }
 
    protected void logEntryRequest(BinaryEntry entry, Subject subject, 
        boolean fWrite, int nReason)
        {
        CacheFactory.log('"' + (fWrite ? "Write" : "Read") 
            + "\" request for key=\""
            + entry.getKey()
            + (subject == null ?
                "\" from unidentified user" :
                "\" on behalf of " + subject.getPrincipals())
            + " caused by \"" + nReason + "\""
            , CacheFactory.LOG_INFO);
        }
 
    protected void logMapRequest(BackingMapContext context, Subject subject,
        boolean fWrite, int nReason)
        {
        CacheFactory.log('"' + (fWrite ? "Write-any" : "Read-any") 
            + "\" request for cache \""
            + context.getCacheName() + '"'
            + (subject == null ?
                " from unidentified user" :
                " on behalf of " + subject.getPrincipals())
            + " caused by \"" + nReason + "\""
            , CacheFactory.LOG_INFO);
        }
 
    private final boolean f_fStrict;
    }

アクセス制御認可の実装の宣言

アクセス制御認可実装を宣言するには、オペレーション・オーバーライド・ファイルを編集して、<storage-authorizers要素を<cluster-config要素内に含め、各認可実装を<storage-authorizer要素を使用して宣言します。<storage-auhorizer要素の詳細は、『Oracle Coherenceでのアプリケーションの開発』を参照してください。各宣言には、実装を選択するためにパーティション化キャッシュで使用される一意のid属性が含まれている必要があります。次に例を示します。

<cluster-config>
   <storage-authorizers>
      <storage-authorizer id="LogAuthorizer">
         <class-name>package.MyLogAuthorizer</class-name>
      </storage-authorizer>
   </storage-authorizers>
</cluster-config>

代替案として、<storage-authorizer>要素では、インスタンスを作成するためのファクトリ・クラスを使用する<class-factory-name>要素、およびオブジェクトのインスタンス化を実行するファクトリ・クラス上で静的なファクトリ・メソッドを指定する<method-name>要素の使用がサポートされています。次に例を示します。

<cluster-config>
   <storage-authorizers>
      <storage-authorizer id="LogAuthorizer">
         <class-factory-name>package.MyAuthorizerFactory</class-factory-name>
         <method-name>getAuthorizer</method-name>
      </storage-authorizer>
   </storage-authorizers>
</cluster-config>

実装に必要な初期化パラメータはすべて、<init-params>要素を使用して指定できます。次に例を示します。

<cluster-config>
   <storage-authorizers>
      <storage-authorizer id="LogAuthorizer">
         <class-name>package.MyLogAuthorizer</class-name>
         <init-params>
            <init-param>
               <param-name>f_fStrict</param-name>
               <param-value>true</param-value>
            </init-param>
         </init-params>
      </storage-authorizer>
   </storage-authorizers>
</cluster-config>

パーティション化キャッシュ上でのアクセス制御認可の有効化

パーティション化キャッシュでアクセス制御認可を有効化するには、キャッシュ構成ファイルを編集して、その値が、オペレーション・オーバーライド・ファイル内で宣言される認可実装のid属性値である分散スキーマの<backing-map-scheme>要素内で<storage-authorizer>要素を追加します。次に例を示します。

<distributed-scheme>
   ...
   <backing-map-scheme>
      <storage-authorizer>LogAuthorizer</storage-authorizer>
      <local-scheme/>
   </backing-map-scheme>
   <autostart>true</autostart>
</distributed-scheme>
1

リスナーがMapTriggerListenerの場合、かわりにWrite Any認可チェックが実行されます。