フィルタは、低レベルのTCMPストリーム・プロトコルにプラグインするためのメカニズムです。Coherenceによってネットワーク経由で送信されるメッセージはすべて、このプロトコルを使用してストリームされます。Coherenceでは、カスタム・フィルタをサポートしています。フィルタを作成することにより、ネットワーク・トラフィックのコンテンツを変更できます。変更の最も一般的な例は、暗号化と圧縮です。
圧縮フィルタはjava.util.zipパッケージに基づいており、メッセージ・コンテンツを圧縮してネットワークの負荷を軽減します。これは、CPUの使用率に余裕があり、ネットワーク帯域幅が不十分な場合に便利です。このフィルタを有効にする方法は、「フィルタの構成」を参照してください。
Coherenceでは、対称型暗号化フィルタとPKCS暗号化フィルタというJCAベースの2つの暗号化フィルタが用意されており、クラスタ通信のプライバシや認証性の保護に使用できます。
このフィルタは、対称型暗号化を使用してクラスタ通信を保護します。暗号化キーは、すべてのクラスタ・メンバーで認識される共有パスワードから生成されます。このフィルタは、小規模なデプロイメント、または共有パスワードの維持および保護が可能な場合に適しています。
このフィルタを有効にするには、このフィルタを使用してトラフィックを暗号化するサービスを指定します。すべてのクラスタ・トラフィックに対して有効にする場合は、これを<outgoing-message-handler>要素のフィルタとして指定します。
例9-1 すべてのネットワーク・トラフィックに対するフィルタの有効化
<outgoing-message-handler>
  <use-filters>
    <filter-name>symmetric-encryption</filter-name>
  </use-filters>
</outgoing-message-handler>
共有パスワードは、オペレーション構成ファイルの<filters>セクションで指定するか、tangosol.coherence.security.passwordシステム・プロパティを使用して指定することができます。その他の構成オプションについては、「対称型暗号化フィルタのパラメータ」を参照してください。
対照型暗号化フィルタは、表9-1に示すパラメータをサポートしています。構成の詳細は、Javadocのcom.tangosol.net.security.PasswordBasedEncryptionFilterを参照してください。
このフィルタは、公開鍵暗号化(非対称型暗号化)を使用してクラスタ参加プロトコルを保護してから、より高速な対称型暗号化に切り替えてサービス・レベルのデータ転送を行います。対称型暗号化フィルタとは異なり、共有の秘密は永続化されません。対称型暗号化キーがクラスタの上位メンバーによってランダムに生成され、クラスタ参加プロトコルの一部として、認証されたクラスタ・メンバーにセキュアに転送されます。この暗号化フィルタは、共有の秘密を維持できないデプロイメントに適しています。
| 注意:このフィルタを使用するには、Bouncy Castleのような、非対称型ブロック暗号をサポートするJCA公開鍵暗号化プロバイダ実装でJVMを構成する必要があります。JCAプロバイダのインストールおよび構成の詳細は、JCAのドキュメントを参照してください。 | 
デフォルトの設定では、各クラスタ・ノードにJavaキーストアを構成する必要があります。ここから、ID証明書と関連する秘密鍵、および他のクラスタ・メンバー用の信頼できる証明書セットを取得できます。このキーストアは次のように作成できます。
Javaキーストアと、ローカル・クラスタ・メンバーのパスワード保護された証明書および秘密鍵を作成します。
keytool -genkey -alias local -keypass secret -keyalg rsa -storepass secret -keystore ./keystore.jks
この公開証明書を、すべてのクラスタ・メンバーのキーストアに含めるためにエクスポートします。
keytool -export -alias local -keypass secret -storepass secret -keystore ./keystore.jks -rfc -file local.cert
他の信頼できるクラスタ・メンバーの証明書をインポートします。各証明書は、一意の別名で保存する必要があります(一意である点を除けば、この名前に重要性はありません)。
keytool -import -alias remote_1 -storepass secret -keystore ./keystore.jks -file local_1.cert keytool -import -alias remote_2 -storepass secret -keystore ./keystore.jks -file local_2.cert keytool -import -alias remote_3 -storepass secret -keystore ./keystore.jks -file local_3.cert
この時点で、各クラスタ・ノードでキーストアが1つずつ構成されます。それぞれに秘密鍵が1つと、信頼できる公開証明書の完全なセットが含まれています。クラスタに新しいノードを追加する場合は、すべての既存ノードのキーストアを、新しいノードの証明書で更新する必要があります。
| 注意:カスタム・キーと信頼管理ロジックを指定すると、ノードごとにキーストアを構成する必要がなくなります。カスタマイズの詳細は、実装に関するドキュメントを参照してください。 | 
次に、このフィルタを<outgoing-message-handler>要素で指定し、すべてのトラフィックの暗号化でこのフィルタが使用されるようにクラスタを構成します。
<outgoing-message-handler>
  <use-filters>
    <filter-name>pkcs-encryption</filter-name>
  </use-filters>
</outgoing-message-handler>
キーストアと別名のパスワードは、オペレーション構成ファイルの<filters>ノードで指定するか、tangosol.coherence.security.passwordシステム・プロパティを使用して指定することができます。
対称型暗号化フィルタとは異なり、このフィルタは、Coherence*Extendやサービスごとの各レベルでは現在サポートされていません。
| 注意:使用される証明書のサイズによっては、このフィルタの使用時にパケット・サイズの構成の変更が必要になる場合があります。 <maximum-length>を、証明書のサイズより大きい値に設定します(若干のオーバーヘッドを見込んでおきます)。「packet-size」を参照してください。 | 
PKCS暗号化フィルタは、次のパラメータをサポートしています。例については「暗号化フィルタ」を、構成の詳細はJavadocのcom.tangosol.net.security.ClusterEncryptionFilterを参照してください。
表9-2 PKCS暗号化フィルタのパラメータ
| パラメータ名 | 説明 | 
|---|---|
| asymmetricFilterClassName | 非対称フィルタ実装を指定します。デフォルト値は | 
| keyAlias | キーストアからのキーの読取りに使用する別名を指定します。 | 
| keyPassword | キーの読取りに使用するパスワードを指定します。システム・プロパティの事前構成値は | 
| store | 
 | 
| sharedKeySize | 共有キーのサイズを指定します。デフォルト値は | 
| sharedKeyType | 共有キーのタイプを指定します。デフォルト値は | 
| storePassword | ストアへのアクセスに使用するパスワードを指定します。指定しない場合は、 | 
| storeType | 
 | 
| transformation | 使用する変換を指定します。デフォルト値は | 
フィルタを構成するには、次の2つの手順があります。
tangosol-coherence.xmlファイルの<filters> XML要素でフィルタを宣言します。
例9-2 tangosol-coherence.xmlファイルでのフィルタの宣言
<filter>
  <filter-name>gzip</filter-name>
  <filter-class>com.tangosol.net.CompressionFilter</filter-class>
  <init-params>
    <init-param>
      <param-name>strategy</param-name>
      <param-value>gzip</param-value>
    </init-param>
  </init-params>
</filter>
<filters> XML要素の構造の詳細は、付録A「オペレーション構成の要素」を参照してください。
2つ目の手順は、1つ以上の特定のサービスにフィルタを添付するか、そのフィルタをすべてのサービスに対してグローバルにすることです。特定のサービス(ReplicatedCacheサービスなど)に対してフィルタを指定するには、tangosol-coherence.xmlファイルで、サービス宣言の<use-filters>要素に<filter-name>要素を追加します。
フィルタをすべてのサービスに追加するには、<service>要素ではなく<outgoing-message-handler>要素で同じ処理を実行します。
例9-4 フィルタをすべてのサービスに追加
<outgoing-message-handler>
  <use-daemon>false</use-daemon>
  <use-filters>
    <filter-name>gzip</filter-name>
  </use-filters>
</outgoing-message-handler>
| 注意:フィルタは、すべてのメンバーで使用するか、まったく使用しないかのいずれかになります。一方のクラスタ・メンバーがフィルタを使用しているのにもう一方のクラスタ・メンバーが使用していない場合、メッセージ・プロトコルに障害が発生します。フィルタを構成する前に、クラスタ全体を停止する必要があります。 | 
新しいフィルタを作成するには、com.tangosol.io.WrapperStreamFactoryインタフェースを実装し、オプションでcom.tangosol.run.xml.XmlConfigurableインタフェースを実装するJavaクラスを作成します。WrapperStreamFactoryインタフェースにより、入力(受信メッセージ)または出力(送信メッセージ)でラップ(フィルタリング)されるストリームが提供され、元のストリームをラップするストリーム・バックが見込まれます。これらのメソッドは、メッセージの受信および送信のたびにコールされます。
フィルタ・クラスがXmlConfigurableインタフェースを実装する場合、フィルタは、インスタンス化された後に構成されます。例9-5は、tangosol-coherence.xmlファイル内のフィルタ宣言を示しています。フィルタがサービス・タイプに関連付けられている場合、そのタイプの新しいサービスが開始されるたびに、CompressionFilterクラスがインスタンス化され、サービスが停止するまで、サービスとともに保持されます。フィルタがすべての送信メッセージに関連付けられている場合、起動時にフィルタがインスタンス化され、クラスタが停止するまで保持されます。
例9-5 カスタム・フィルタの構成
<filter>
  <filter-name>my-gzip-filter</filter-name>
  <filter-class>com.tangosol.net.CompressionFilter</filter-class>
  <init-params>
    <init-param>
      <param-name>strategy</param-name>
      <param-value>gzip</param-value>
    </init-param>
    <init-param>
      <param-name>buffer-length</param-name>
      <param-value>1024</param-value>
    </init-param>
  </init-params>
</filter>
フィルタをインスタンス化した後に、次のXML要素を指定したsetConfigメソッドがコールされます(フィルタでXmlConfigurableが実装されている場合)。