2 全般的なセキュリティ対策の有効化

一般的なセキュリティ対策を使用すると、Oracle Coherence API、システム・リソースおよびクラスタ接続の無許可の使用を防ぐのに役立ちます。一般的なセキュリティ対策は、Coherenceのソリューションを保護する最初のステップとして有効化される場合があります。

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

Javaセキュリティ・マネージャの使用方法

Javaセキュリティ・マネージャを有効化して、Coherenceでアクセスするリソースを制御および使用できます。セキュリティ・マネージャは、各リソースに明示的に権限を付与するポリシー・ファイルを使用します。COHERENCE_HOME/lib/security/security.policyポリシー構成ファイルでは、Oracle Coherenceの最小限のパーミッションのセットが指定されています。提供されているファイルを使用するか、追加のパーミッションを設定するようにファイルを変更します。ローカル(非クラスタ化)・パーミッションのセットも提供されます。

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

Javaセキュリティ・マネージャの有効化

Javaセキュリティ・マネージャを有効にし、COHERENCE_HOME/lib/security/security.policyファイルを使用するには、クラスタ・メンバーで次のプロパティを設定します。

  1. java.security.managerプロパティを、Javaセキュリティ・マネージャを有効にするように設定します。たとえば:
    -Djava.security.manager
    
  2. java.security.policyプロパティをポリシー・ファイルの場所に設定します。たとえば:
    -Djava.security.manager
    -Djava.security.policy=/coherence/lib/security/security.policy
    
  3. coherence.homeシステム・プロパティをCOHERENCE_HOMEに設定します。たとえば:
    -Djava.security.manager
    -Djava.security.policy=/coherence/lib/security/security.policy
    -Dcoherence.home=/coherence
    

ノート:

セキュリティ・ポリシー・ファイルでは、デフォルトのJava Runtime Environment (JRE)セキュリティ・パーミッションが付与されていることが想定されています。そのため、java.security.policyシステム・プロパティを設定するときは、2つの等号(==)ではなく、1つの等号(=)を使用するように注意してください。

パーミッションの指定

必要に応じて追加のパーミッションを含むようにCOHERENCE_HOME/lib/security/security.policyファイルを変更します。『Java SEセキュリティ』Java Development Kit(JDK)での権限に関する項を参照してください。

security.policyファイルで追加のパーミッションを指定するには:

  1. security.policyファイルを編集し、リソースに対するパーミッションを追加します。たとえば、次のパーミッションでは、coherence.jarライブラリへのアクセスが付与されます。
    grant codeBase "file:${coherence.home}/lib/coherence.jar"
        {
                permission java.security.AllPermission;
        };
    
  2. バイナリを宣言する場合は、JDK jarsignerツールを使用してバイナリに署名します。次の例では、前のステップで宣言されたcoherence.jarリソースに署名します。
    jarsigner -keystore ./keystore.jks -storepass password coherence.jar admin
    

    パーミッション宣言に署名者を追加します。たとえば、元のパーミッションを次のように変更して、admin署名者を追加します。

    grant SignedBy "admin" codeBase "file:${coherence.home}/lib/coherence.jar"
        {
                permission java.security.AllPermission;
        };
    
  3. オペレーティング・システム・メカニズムを使用して、関連するすべてのファイルを悪質な変更から保護します。

ローカル・パーミッションのプログラムでの指定

com.tangosol.net.security.LocalPermissionクラスにより、パーミッションをローカル(非クラスタ化)のCoherence API操作に設定できます。クライアントは、宣言された操作(ターゲットを指します)の実行を許可される、または許可されないのいずれかに設定されます。たとえば:

LocalPermission lp = new LocalPermission("Cluster.shutdown");

ローカル・パーミッションを使用するには、Javaセキュリティ・マネージャを有効化する必要があります。「Javaセキュリティ・マネージャの有効化」を参照してください。

表2-1に、宣言できるターゲット名の一覧および説明を示します。

表2-1 ローカル・パーミッションのターゲット

ターゲット名 説明

CacheFactory.setCacheFactoryBuilder

カスタム・キャッシュ・ファクトリ・ビルダのプログラムでのインストールを保護します。パーミッションを付与する際には、十分注意する必要があります。このパーミッションを付与すると、コードを使用してキャッシュ・ファクトリ・ビルダーを設定して、任意のキャッシュへのアクセスまたは変更リクエストをインターセプトできるようになり、これらのキャッシュとの間でやりとりされる任意のデータへのアクセスも可能になります。

Cluster.shutdown

すべてのサービスが停止するのを保護します。このパーミッションを付与すると、コードを使用してクラスタ・ノードをプログラムで停止できます。

BackingMapManagerContext.getBackingMap

バッキング・マップへの直接アクセスを保護します。パーミッションを付与する際には、十分注意する必要があります。このパーミッションを付与すると、コードを使用してバッキング・マップへの参照を取得でき、追加のセキュリティ・チェックなしに格納された任意のデータにアクセスできます。

BackingMapManagerContext.setClassLoader

ストレージで使用されるクラス・ローダーへの変更を保護します。クラス・ローダーは、システム・クラス・ローダーに存在しない可能性のあるアプリケーション・クラスをロードするためにキャッシュ・サービスによって使用されます。この権限を付与すると、コードを使用して、特定のサービスで使用するクラス・ローダーを変更できます。

Service.getInternalService

内部サービス、クラスタまたはキャッシュ参照へのアクセスを保護します。このパーミッションを付与すると、コードを使用して基盤となるサービス、クラスタまたはキャッシュ・ストレージ実装への直接アクセスが取得できます。

Service.registerResource

サービス・レジストリを保護します。この権限を付与すると、コードを使用して、サービスに関連付けられたさまざまなリソースを再登録または登録解除できます。

Service.registerEventInterceptor

プログラムでのインストールを保護します。パーミッションを付与する際には、十分注意する必要があります。このパーミッションを付与すると、コードを使用して、キャッシュ・サービスに関連付けられたイベント・インターセプタを変更または削除でき、つまり、基盤となるデータへのアクセス、またはデータの一貫性を保護するために設計されたライブ・イベントの削除のいずれかが可能です。

ホストベースの認可の使用方法

ホストベースの認可は、指定されたホスト(ホスト名またはIPアドレス・ベース)のみがクラスタに接続できるようにするタイプのアクセス制御です。この機能は、クラスタ・メンバー接続とExtendクライアント接続の両方で使用できます。

この項には次のトピックが含まれます:

ホストベースの認可の概要

ホストベースの認可では、クラスタ・メンバーまたはExtendクライアントのホスト名およびIPアドレスを使用して、クラスタへの接続が許可されるかどうかを決定します。特定のホスト名、アドレスおよびアドレス範囲を定義できます。カスタム処理では、カスタム・フィルタを作成してホストの検証ができます。

ホストベースの認可は、相対的な静的ネットワーク・アドレスを持つ既知のホストがクラスタに参加またはアクセスしている環境に適しています。動的な環境の場合、またはDNSサーバーの更新中の場合は、IPアドレスが変わり、クラスタ・メンバーまたはExtendクライアントが認可に失敗する可能性があります。クラスタ・メンバーまたはExtendクライアントが認可されない場合、キャッシュ操作が完了しないことがあります。Extendクライアントは、一時的な性質が原因となるアクセスの問題が起きる可能性があります。

ホストベースの認可を使用する場合、ネットワーク環境の動的性質を考慮します。認可されるホストのリストを再構成するという要求は、現実的ではない場合があります。可能な場合、特定のホスト名を使用するかわりに、常にIPアドレスの範囲を使用します。または、変更されたアドレスを解決できるカスタム・フィルタを作成します。ホストベースの認可が現実的ではない場合、ExtendクライアントIDトークンまたはSSLの使用を考慮します。それぞれ、「IDトークンを使用したクライアント接続の制限」および「SSLを使用した通信の保護」を参照してください。

クラスタ・メンバーの認可済ホストの指定

クラスタのデフォルトの動作では、いずれのホストもクラスタに接続し、クラスタ・メンバーになることができます。ホストベースの認可は、この動作を変更して、特定のホスト名またはIPアドレスを持つホストのみがクラスタに接続できるようにします。

<cluster-config>要素内の<authorized-hosts>要素を使用して、オペレーション・オーバーライド・ファイルで認可済のホストを構成します。<host-address>要素を使用して特定のアドレスを入力するか、<host-range>要素を使用してアドレスを範囲を入力します。<host-address>要素および<host-range>要素は、複数の要素を一意に識別するid属性をサポートします。

次の例では、IPアドレスが192.168.0.5か192.168.0.6であるか、または192.168.0.10から192.168.0.20および192.168.0.30から192.168.0.40の範囲内であるクラスタ・メンバーのみを受け入れるようにクラスタを構成します。

<?xml version='1.0'?>

<coherence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns="http://xmlns.oracle.com/coherence/coherence-operational-config"
   xsi:schemaLocation="http://xmlns.oracle.com/coherence/coherence-operational-config
   coherence-operational-config.xsd">
   <cluster-config>
      <authorized-hosts>
         <host-address id="1">192.168.0.5</host-address>
         <host-address id="2">192.168.0.6</host-address>
         <host-range id="1">
            <from-address>192.168.0.10</from-address>
            <to-address>192.168.0.20</to-address>
         </host-range>
         <host-range id="2">
            <from-address>192.168.0.30</from-address>
            <to-address>192.168.0.40</to-address>
         </host-range>
      </authorized-hosts>
   </cluster-config>
</coherence>

Extendクライアントの認可済ホストの指定

拡張プロキシ・サーバーのデフォルトの動作では、いずれのExtendクライアントもクラスタに接続できます。ホストベースの認可は、この動作を変更して、特定のホスト名またはIPアドレスを持つホストのみがクラスタに接続できるようにします。

プロキシ・スキーム定義の<tcp-acceptor>要素内の<authorized-hosts>要素を使用して、キャッシュ構成ファイルで認可済のホストを構成します。<host-address>要素を使用して特定のアドレスを入力するか、<host-range>要素を使用してアドレスを範囲を入力します。<host-address>要素および<host-range>要素は、複数の要素を一意に識別するid属性をサポートします。

次の例では、IPアドレスが192.168.0.5か192.168.0.6であるか、または192.168.0.10から192.168.0.20および192.168.0.30から192.168.0.40の範囲内であるクライアントからの接続のみを受け入れるように拡張プロキシを構成します。

<proxy-scheme>
   <service-name>ExtendTcpProxyService</service-name>
   <thread-count>5</thread-count>
   <acceptor-config>
      <tcp-acceptor>
         ...
         <authorized-hosts>
            <host-address id="1">192.168.0.5</host-address>
            <host-address id="2">192.168.0.6</host-address>
            <host-range id="1">
               <from-address>192.168.0.10</from-address>
               <to-address>192.168.0.20</to-address>
            </host-range>
            <host-range id="2">
               <from-address>192.168.0.30</from-address>
               <to-address>192.168.0.40</to-address>
            </host-range>
         </authorized-hosts>
         ...
      </tcp-acceptor>
   </acceptor-config>
   <autostart>true</autostart>
</proxy-scheme>

フィルタ・クラスを使用した認可の決定

フィルタ・クラスは、特定のホスト接続を受け入れるかどうかを決定します。Extendクライアント接続とクラスタ・メンバー接続の両方とも、フィルタ・クラスの使用をサポートしています。フィルタ・クラスでは、com.tangosol.util.Filterインタフェースを実装する必要があります。インタフェースのevaluate()メソッドに、ホストのjava.net.InetAddressが渡されます。実装は、trueを返して接続を受け入れます。

フィルタ・クラスを有効にするには、<host-filter>要素内の<class-name>要素を使用して、完全修飾クラス名を入力します。<init-params>要素を使用して、初期化パラメータを設定します。

次の例では、MyFilterという名前のフィルタを構成します。このフィルタは、ホスト接続が許可されるかどうかを決定します。

<authorized-hosts>
   <host-address id="1">192.168.0.5</host-address>
   <host-address id="2">192.168.0.6</host-address>
   <host-range id="1">
      <from-address>192.168.0.10</from-address>
      <to-address>192.168.0.20</to-address>
   </host-range>
   <host-filter>
      <class-name>package.MyFilter</class-name>
         <init-params>
            <init-param>
               <param-name>sPolicy</param-name>
               <param-value>strict</param-value>
            </init-param>
         </init-params>
   </host-filter>
</authorized-hosts>

不正なクライアントの管理

疑いのあるプロトコルを使用して、許容範囲外で操作する不正なクライアントから保護することができます。不正なクライアントは、応答の遅いクライアントや、サービス拒否攻撃の場合のようにプロキシを過剰に使用しようとする悪質なクライアントです。いずれの場合も、プロキシがメモリーを使い果たし、応答しない状態になる可能性があります。

サスペクト・アルゴリズムを使用してクライアント接続をモニターし、異常に遅い、または悪用されているクライアントを探します。不正なクライアント接続が検出されると、プロキシ・サーバーがメモリー不足になることを防ぐために、アルゴリズムによって接続が閉じられます。プロトコルは、クライアントの送信接続バッファ・バックログのサイズ(バイト数)と長さ(メッセージ数)の両方をモニタリングすることによって機能します。様々なレベルによって、クライアントが疑わしいとき、正常に戻ったとき、または不正と見なされるときが判断されます。

サスペクト・プロトコルは、プロキシ・スキーム定義の<tcp-acceptor>要素内で構成します。『Oracle Coherenceでのアプリケーションの開発』tcp-acceptorに関する項を参照してください。疑いのあるプロトコルはデフォルトで有効です。

次の例は、サスペクト・プロトコルの構成方法を示しており、デフォルト設定に類似しています。クライアントの送信接続バッファ・バックログが10MBまたはメッセージ数が10000個に達すると、クライアントは疑わしいと見なされ、モニターされます。クライアントの接続バッファ・バックログが2MBまたはメッセージ数が2000個まで戻ると、クライアントは安全と見なされ、モニターされなくなります。クライアントの接続バッファ・バックログが95MBまたはメッセージ数が60000個に達すると、クライアントは安全でないと見なされ、プロキシは接続を閉じます。

<proxy-scheme>
   <service-name>ExtendTcpProxyService</service-name>
   <thread-count>5</thread-count>
   <acceptor-config>
      <tcp-acceptor>
         ...
         <suspect-protocol-enabled>true</suspect-protocol-enabled>
         <suspect-buffer-size>10M</suspect-buffer-size>
         <suspect-buffer-length>10000</suspect-buffer-length>
         <nominal-buffer-size>2M</nominal-buffer-size>
         <nominal-buffer-length>2000</nominal-buffer-length>
         <limit-buffer-size>95M</limit-buffer-size>
         <limit-buffer-length>60000</limit-buffer-length>
      </tcp-acceptor>
   </acceptor-config>
   <autostart>true</autostart>
</proxy-scheme>