フィルタは、低レベルのTCMPストリーム・プロトコルにプラグインするためのメカニズムです。Coherenceによってネットワーク経由で送信されるメッセージはすべて、このプロトコルを使用してストリームされます。Coherenceでは、カスタム・フィルタをサポートしています。フィルタを作成することにより、ネットワーク・トラフィックのコンテンツを変更できます。変更の最も一般的な例は、暗号化と圧縮です。
圧縮フィルタは、java.util.zip
パッケージに基づいており、メッセージ・コンテンツを圧縮することによってネットワークの負荷を軽減します。CPUの使用率に余裕があり、ネットワーク帯域幅が不十分な場合に便利です。このフィルタを有効にする方法については、「フィルタの構成」を参照してください。
CoherenceにはJCAベースの2つの暗号化フィルタが同梱されており、クラスタ通信のプライバシや認証性の保護に使用できます。
このフィルタは、対称型暗号化を使用してクラスタ通信を保護します。暗号化キーは、すべてのクラスタ・メンバーで認識される共有パスワードから生成されます。このフィルタは、小規模なデプロイメント、または共有パスワードの維持および保護が可能な場合に適しています。
このフィルタを有効にするには、このフィルタを使用してトラフィックを暗号化するサービスを指定します。すべてのクラスタ・トラフィックに対して有効にする場合は、これを<outgoing-message-handler
>要素のフィルタとして指定します。
例8-1 すべてのネットワーク・トラフィックに対するフィルタの有効化
<outgoing-message-handler> <use-filters> <filter-name>symmetric-encryption</filter-name> </use-filters> </outgoing-message-handler>
共有パスワードは、オペレーション・コンフィギュレーション・ファイルの<filters
>セクションで指定するか、またはtangosol.coherence.security.password
システム・プロパティを使用して指定できます。その他の構成オプションについては、「対称型暗号化フィルタのパラメータ」を参照してください。
対称型暗号化フィルタでは、表8-1に記載されたパラメータがサポートされます。構成の詳細は、Javadocの「com.tangosol.net.security.PasswordBasedEncryptionFilter
」を参照してください。
表8-1 対称型暗号化フィルタのパラメータ
パラメータ名 | 値の説明 |
---|---|
algorithm |
前述のマテリアルからの秘密鍵の導出に使用するメカニズムを指定します。デフォルト値は |
iterations |
キーの導出に使用する反復カウントを指定します。デフォルト値は32です。 |
password |
秘密鍵の生成に使用するRAWマテリアルを指定します。事前構成されている値は |
salt |
キーの導出に使用するsaltを指定します。デフォルト値は |
このフィルタは、公開鍵暗号化(非対称型暗号化)を使用してクラスタ参加プロトコルを保護してから、より高速な対称型暗号化に切り替えてサービス・レベルのデータ転送を行います。対称型暗号化フィルタとは異なり、共有の秘密は永続化されません。対称型暗号化キーがクラスタの上位メンバーによってランダムに生成され、クラスタ参加プロトコルの一部として、認証されたクラスタ・メンバーにセキュアに転送されます。この暗号化フィルタは、共有の秘密を維持できないデプロイメントに適しています。
注意: このフィルタを使用するには、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
システム・プロパティを使用して指定できます。その他の構成オプションについては、「PKCS暗号化フィルタのパラメータ」を参照してください。
対称型暗号化フィルタとは異なり、このフィルタは、Coherence*Extendやサービスごとの各レベルでは現在サポートされていません。
PKCS暗号化フィルタは、次のパラメータをサポートしています。例については、「暗号化フィルタ」を、構成の詳細は、Javadocの「com.tangosol.net.security.ClusterEncryptionFilter
」を参照してください。
表8-2 PKCS暗号化フィルタのパラメータ
パラメータ名 | 説明 |
---|---|
asymmetricFilterClassName |
非対称型フィルタ実装を指定します。デフォルト値は |
keyAlias |
キーストアからのキーの読取りに使用する別名を指定します。 |
keyPassword |
キーの読取りに使用するパスワードを指定します。事前構成されている値は |
store |
|
sharedKeySize |
共有キーのサイズを指定します。デフォルト値は |
sharedKeyType |
共有キーのタイプを指定します。デフォルト値は |
storePassword |
ストアへのアクセスに使用するパスワードを指定します。指定しない場合は、 |
storeType |
|
transformation |
使用する変換を指定します。デフォルト値は |
フィルタの構成には、次の2つの手順があります。
tangosol-coherence.xml
ファイルの<filters
> XML要素でフィルタを宣言します。
例8-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>
tangosol-coherence.xml
ファイルの<filters>
XML要素の構造の詳細は、coherence.dtd
ファイルの記述を参照してください。このファイルは、coherence.jar
内にもあります。
2つ目の手順は、1つ以上の特定のサービスにフィルタを添付するか、そのフィルタをすべてのサービスに対してグローバルにすることです。フィルタを特定のサービス(ReplicatedCache
サービスなど)に対して指定するには、tangosol-coherence.xml
ファイルで、サービス宣言の<use-filters>
要素に<filter-name>
要素を追加します。
フィルタをすべてのサービスに追加するには、<service>
XML要素ではなく<outgoing-message-handler> XML要素で、同じ処理を行います。
例8-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
インタフェースを実装する場合、フィルタは、インスタンス化された後に構成されます。例8-5は、tangosol-coherence.xml
ファイル内のフィルタ宣言を示しています。フィルタがサービス・タイプに関連付けられている場合、そのタイプの新しいサービスが開始されるたびに、CompressionFilter
クラスがインスタンス化され、サービスが停止するまで、サービスとともに保持されます。フィルタがすべての送信メッセージに関連付けられている場合、起動時にフィルタがインスタンス化され、クラスタが停止するまで保持されます。
例8-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
が実装されている場合)。