4.8. クラスタートランスポートの暗号化
ノードが暗号化されたメッセージと通信できるように、クラスタートランスポートを保護します。また、有効なアイデンティティーを持つノードのみが参加できるように、証明書認証を実行するように Data Grid クラスターを設定することもできます。
4.8.1. Data Grid クラスターのセキュリティー
クラスタートラフィックのセキュリティーを保護するには、Data Grid ノードを設定し、シークレットキーで JGroups メッセージペイロードを暗号化します。
Data Grid ノードは、以下のいずれかから秘密鍵を取得できます。
- コーディネーターノード (非対称暗号化)
- 共有キーストア (対称暗号化)
コーディネーターノードからの秘密鍵の取得
非対称暗号化は、Data Grid 設定の JGroups スタックに ASYM_ENCRYPT
プロトコルを追加して対称暗号化を設定します。これにより、Data Grid クラスターはシークレットキーを生成して配布できます。
非対称暗号化を使用する場合は、ノードが証明書認証を実行し、シークレットキーを安全に交換できるようにキーストアを提供する必要もあります。これにより、中間者 (MitM) 攻撃からクラスターが保護されます。
非対称暗号化は、以下のようにクラスタートラフィックのセキュリティーを保護します。
- Data Grid クラスターの最初のノードであるコーディネーターノードは、秘密鍵を生成します。
- 参加ノードは、コーディネーターとの証明書認証を実行して、相互に ID を検証します。
- 参加ノードは、コーディネーターノードに秘密鍵を要求します。その要求には、参加ノードの公開鍵が含まれています。
- コーディネーターノードは、秘密鍵を公開鍵で暗号化し、参加ノードに返します。
- 参加ノードは秘密鍵を復号してインストールします。
- ノードはクラスターに参加し、秘密鍵でメッセージを暗号化および復号化します。
共有キーストアからの秘密鍵の取得
対称暗号化は、Data Grid 設定の JGroups スタックに SYM_ENCRYPT
プロトコルを追加して対称暗号化を設定します。これにより、Data Grid クラスターは、指定したキーストアから秘密鍵を取得できます。
- ノードは、起動時に Data Grid クラスパスのキーストアから秘密鍵をインストールします。
- ノードはクラスターに参加し、秘密鍵でメッセージを暗号化および復号化します。
非対称暗号化と対称暗号化の比較
証明書認証を持つ ASYM_ENCRYPT
は、SYM_ENCRYPT
と比較して、暗号化の追加の層を提供します。秘密鍵のコーディネーターノードへのリクエストを暗号化するキーストアを提供します。Data Grid は、そのシークレットキーを自動的に生成し、クラスタートラフィックを処理し、秘密鍵の生成時に指定します。たとえば、ノードが離れる場合に新規のシークレットキーを生成するようにクラスターを設定できます。これにより、ノードが証明書認証を回避して古いキーで参加できなくなります。
一方、SYM_ENCRYPT
は ASYM_ENCRYPT
よりも高速です。ノードがクラスターコーディネーターとキーを交換する必要がないためです。SYM_ENCRYPT
への潜在的な欠点は、クラスターのメンバーシップの変更時に新規シークレットキーを自動的に生成するための設定がないことです。ユーザーは、ノードがクラスタートラフィックを暗号化するのに使用するシークレットキーを生成して配布する必要があります。
4.8.2. 非対称暗号化を使用したクラスタートランスポートの設定
Data Grid クラスターを設定し、JGroups メッセージを暗号化するシークレットキーを生成して配布します。
手順
- Data Grid がノードの ID を検証できるようにする証明書チェーンでキーストアを作成します。
クラスター内の各ノードのクラスパスにキーストアを配置します。
Data Grid Server の場合は、$RHDG_HOME ディレクトリーにキーストアを配置します。
以下の例のように、
SSL_KEY_EXCHANGE
プロトコルおよびASYM_ENCRYPT
プロトコルを Data Grid 設定の JGroups スタックに追加します。<infinispan> <jgroups> <stack name="encrypt-tcp" extends="tcp"> 1 <SSL_KEY_EXCHANGE keystore_name="mykeystore.jks" 2 keystore_password="changeit" 3 stack.combine="INSERT_AFTER" stack.position="VERIFY_SUSPECT"/> 4 <ASYM_ENCRYPT asym_keylength="2048" 5 asym_algorithm="RSA" 6 change_key_on_coord_leave = "false" 7 change_key_on_leave = "false" 8 use_external_key_exchange = "true" 9 stack.combine="INSERT_AFTER" stack.position="SSL_KEY_EXCHANGE"/> 10 </stack> </jgroups> <cache-container name="default" statistics="true"> <transport cluster="${infinispan.cluster.name}" stack="encrypt-tcp" 11 node-name="${infinispan.node.name:}"/> </cache-container> </infinispan>
- 1
- Data Grid のデフォルト TCP スタックを拡張する "encrypt-tcp" という名前のセキュアな JGroups スタックを作成します。
- 2
- ノードが証明書認証を実行するために使用するキーストアに名前を付けます。
- 3
- キーストアのパスワードを指定します。
- 4
stack.combine
属性とstack.position
属性を使用して、デフォルトの TCP スタックのVERIFY_SUSPECT
プロトコルの後にSSL_KEY_EXCHANGE
を挿入します。- 5
- コーディネーターノードが生成する秘密鍵の長さを指定します。デフォルト値は
2048
です。 - 6
- コーディネーターノードが秘密鍵の生成に使用する暗号化エンジンを指定します。デフォルト値は
RSA
です。 - 7
- コーディネーターノードが変更されたときに新しい秘密鍵を生成して配布するように Data Grid を設定します。
- 8
- ノードが離脱するときに新しい秘密鍵を生成して配布するように Data Grid を設定します。
- 9
- 証明書認証に
SSL_KEY_EXCHANGE
プロトコルを使用するように Data Grid ノードを設定します。 - 10
stack.combine
属性とstack.position
属性を使用して、デフォルトの TCP スタックのSSL_KEY_EXCHANGE
プロトコルの後にASYM_ENCRYPT
を挿入します。- 11
- セキュアな JGroups スタックを使用するように Data Grid クラスターを設定します。
検証
Data Grid クラスターを起動した際、以下のログメッセージは、クラスターがセキュアな JGroups スタックを使用していることを示しています。
[org.infinispan.CLUSTER] ISPN000078: Starting JGroups channel cluster with stack <encrypted_stack_name>
Data Grid ノードは ASYM_ENCRYPT
を使用している場合のみクラスターに参加でき、コーディネーターノードからシークレットキーを取得できます。それ以外の場合は、次のメッセージが Data Grid ログに書き込まれます。
[org.jgroups.protocols.ASYM_ENCRYPT] <hostname>: received message without encrypt header from <hostname>; dropping it
参照資料
この手順の ASYM_ENCRYPT
の設定例は、一般的に使用されるパラメーターを示しています。利用可能なパラメーターの完全なセットについては、JGroups のドキュメントを参照してください。
4.8.3. 対称暗号化を使用したクラスタートランスポートの設定
指定したキーストアからの秘密鍵を使用して JGroups メッセージを暗号化するように Data Grid クラスターを設定します。
手順
- シークレットキーが含まれるキーストアを作成します。
クラスター内の各ノードのクラスパスにキーストアを配置します。
Data Grid Server の場合は、$RHDG_HOME ディレクトリーにキーストアを配置します。
次の例のように、Data Grid 設定の JGroups スタックに
SYM_ENCRYPT
プロトコルを追加します。<infinispan> <jgroups> <stack name="encrypt-tcp" extends="tcp"> 1 <SYM_ENCRYPT keystore_name="myKeystore.p12" 2 keystore_type="PKCS12" 3 store_password="changeit" 4 key_password="changeit" 5 alias="myKey" 6 stack.combine="INSERT_AFTER" stack.position="VERIFY_SUSPECT"/> 7 </stack> </jgroups> <cache-container name="default" statistics="true"> <transport cluster="${infinispan.cluster.name}" stack="encrypt-tcp" 8 node-name="${infinispan.node.name:}"/> </cache-container> </infinispan>
- 1
- Data Grid のデフォルト TCP スタックを拡張する "encrypt-tcp" という名前のセキュアな JGroups スタックを作成します。
- 2
- ノードが秘密鍵を取得するキーストアに名前を付けます。
- 3
- キーストアのタイプを指定します。JGroups はデフォルトで JCEKS を使用します。
- 4
- キーストアのパスワードを指定します。
- 5
- 秘密鍵のパスワードを指定します。
- 6
- 秘密鍵のエイリアスを指定します。
- 7
stack.combine
属性とstack.position
属性を使用して、デフォルトの TCP スタックのVERIFY_SUSPECT
プロトコルの後にSYM_ENCRYPT
を挿入します。- 8
- セキュアな JGroups スタックを使用するように Data Grid クラスターを設定します。
検証
Data Grid クラスターを起動した際、以下のログメッセージは、クラスターがセキュアな JGroups スタックを使用していることを示しています。
[org.infinispan.CLUSTER] ISPN000078: Starting JGroups channel cluster with stack <encrypted_stack_name>
Data Grid ノードは、SYM_ENCRYPT
を使用し、共有キーストアからシークレットキーを取得できる場合に限りクラスターに参加できます。それ以外の場合は、次のメッセージが Data Grid ログに書き込まれます。
[org.jgroups.protocols.SYM_ENCRYPT] <hostname>: received message without encrypt header from <hostname>; dropping it
参照資料
この手順の SYM_ENCRYPT
の設定例は、一般的に使用されるパラメーターを示しています。利用可能なパラメーターの完全なセットについては、JGroups のドキュメントを参照してください。