26.3. JGroups の暗号化
JGroups には、クラスタートラフィックの暗号化を提供するための
SYM_ENCRYPT
および ASYM_ENCRYPT
プロトコルが含まれます。
重要
ENCRYPT
プロトコルが非推奨になったため、本番環境で使用することはできません。SYM_ENCRYPT
または ASYM_ENCRYPT
のいずれかを使用することをお勧めします。
デフォルトでは、これらのプロトコルはいずれもメッセージ本体のみを暗号化し、メッセージヘッダーは暗号化しません。宛先および送信元アドレスなどのすべてのヘッダーを含むメッセージ全体を暗号化するには、プロパティー
encrypt_entire_message
が true
でなければなりません。これらのプロトコルを定義する際、NAKACK2
の下に直接配置する必要があります。
どちらのプロトコルも、JGroups で通信を暗号化および暗号の解除を行うために使用でき、以下の方法で使用されます。
SYM_ENCRYPT
:JCEKS
ストアタイプを使用してキーストアのシークレットキーで設定されます。ASYM_ENCRYPT
: アルゴリズムおよびキーサイズで設定されます。このシナリオでは、シークレットキーはキーストアから取得されませんが、コーディネーターによって生成され、新規メンバーに配信されます。メンバーがクラスターに参加すると、それらがシークレットキーの要求をコーディネーターに送信し、コーディネーターはメンバーの公開鍵で暗号化された新規メンバーにシークレットキーと共に応答します。
各メッセージは、暗号化ヘッダーを示す特定の暗号化ヘッダーとメッセージの暗号化および暗号化を解除するために使用するキーのバージョンを示す MD5 ダイジェストで暗号化済みとして識別されます。
26.3.1. JGroups 暗号化プロトコルの設定
JGroups 暗号化プロトコルは JGroups 設定ファイルに置かれます。JBoss Data Grid が使用される方法に応じてこのファイルを組み込むメソッドとして 3 つの方法があります。
- 標準 Java プロパティーを設定で使用することもでき、起動時に JGroups 設定へのパスを
-D
オプションを使用して渡すことができます。 - デフォルトの事前に設定された JGroups ファイルは
infinispan-embedded.jar
にパッケージ化されます。または、独自の設定ファイルを作成できます。ライブラリーモードでカスタム JGroup 設定を使用するために JBoss Data Grid をセットアップする方法については、「JGroups の設定 (ライブラリーモード) 」 を参照してください。 - リモートクライアントサーバーモードでは、JGroups 設定はメインサーバーの設置ファイルの一部になります。
SYM_ENCRYPT
と ASYM_ENCRYPT
の両方のプロトコルを定義する際に、それらを設定ファイルの NAKACK2
の下に直接配置します。
26.3.2. SYM_ENCRYPT: キーストアの使用
SYM_ENCRYPT
はストアタイプ JCEKS を使用します。JCEKS と互換性のあるキーストアを生成するには、以下の keytool のコマンドラインオプションを使用します。
$ keytool -genseckey -alias myKey -keypass changeit -storepass changeit -keyalg Blowfish -keysize 56 -keystore defaultStore.keystore -storetype JCEKS
SYM_ENCRYPT
は、以下の情報をアプリケーションで使用される JGroups ファイルに追加して設定できます。
<SYM_ENCRYPT sym_algorithm="AES" encrypt_entire_message="true" keystore_name="defaultStore.keystore" store_password="changeit" alias="myKey"/>
注記
defaultStore.keystore
はクラスパスに置かれる必要があります。
26.3.3. ASYM_ENCRYPT: アルゴリズムとキーサイズによる設定
この暗号化モードでは、コーディネーターが secretKey を選択し、これをすべてのピアに配信します。キーストアはなく、キーは公開/秘密鍵の交換を使用して配信されます。暗号化は以下のように行われます。
- シークレットキーがコーディネーターにより生成され、配信される。
- ビューが変更されると、ピアは独自の公開鍵でキーの要求を送信し、シークレットキーを要求する。
- コーディネーターは公開鍵を使ってシークレットキーを暗号化し、これをピアに送信し戻す。
- ピアが独自のシークレットキーとしてキーの暗号を解除し、これをインストールする。
- 追加の通信はシークレットキーを使用して暗号化および暗号化が解除される。
例26.7 ASYM_ENCRYPT の例
... <VERIFY_SUSPECT/> <ASYM_ENCRYPT encrypt_entire_message="true" sym_keylength="128" sym_algorithm="AES/ECB/PKCS5Padding" asym_keylength="512" asym_algorithm="RSA"/> <pbcast.NAKACK2/> <UNICAST3/> <pbcast.STABLE/> <FRAG2/> <AUTH auth_class="org.jgroups.auth.MD5Token" auth_value="chris" token_hash="MD5"/> <pbcast.GMS join_timeout="2000" />
この例では、
ASYM_ENCRYPT
は NAKACK2
の直下に置かれ、encrypt_entire_message
が有効にされています。これはメッセージヘッダーがメッセージ本体と共に暗号化されることを示します。つまり、NAKACK2
および UNICAST3
プロトコルも暗号化されます。さらに、AUTH
は設定の一部として組み込まれるので、認証されたノードのみがコーディネーターからシークレットキーを要求できます。
新規コントローラーを特定するビューの変更により、新規のシークレットキーが生成され、すべてのピアに配信されます。これにより、ピアの大幅な変更と共にアプリケーションの大きなオーバーヘッドが生じます。オプションとして、新規のシークレットキーは、
change_key_on_leave
を true に設定することによりクラスターメンバーの退出時に生成することもできます。
メッセージ全体を暗号化する際に、メッセージは暗号化する前にバイトバッファーにマーシャルする必要があります。これによりパフォーマンスが低下します。
26.3.4. JGroups 暗号化設定パラメーター
以下の表は、
SYM_ENCRYPT
および ASYM_ENCRYPT
が共に拡張する ENCRYPT
JGroups プロトコルの設定パラメーターを示しています。
名前 | 説明 |
---|---|
asym_algorithm | 非対称アルゴリズムの暗号化エンジンの変換。デフォルトは RSA です。 |
asym_keylength | 初期の公開/秘密鍵の長さ。デフォルトは 512 です。 |
asym_provider | 暗号化サービスプロバイダー。デフォルトは Bouncy Castle Provider です。 |
encrypt_entire_message | デフォルトでは、メッセージ本体のみが暗号化されます。encrypt_entire_message を有効にすると、すべてのヘッダー、宛先および送信元アドレス、およびメッセージ本体が暗号化されます。 |
sym_algorithm | 対称アルゴリズムの暗号化エンジンの変換。デフォルトは AES です。 |
sym_keylength | 一致する対称アルゴリズムの初期のキーの長さ。デフォルトは 128 です。 |
sym_provider | 暗号化サービスプロバイダー。デフォルトは Bouncy Castle Provider です。 |
以下の表では、
SYM_ENCRYPT
プロトコルパラメーターの一覧を示しています。
名前 | 説明 |
---|---|
alias | キーの回復に使用されるエイリアス。デフォルトを変更します。 |
key_password | キーを回復するためのパスワード。デフォルトを変更します。 |
keystore_name | キーストアリポジトリーが含まれるクラスパス上のファイル。 |
store_password | 整合性のチェックまたはキーストアのロック解除に使用されるパスワード。デフォルトを変更します。 |
以下の表は、
ASYM_ENCRYPT
プロトコルパラメーターの一覧を示しています。
名前 | 説明 |
---|---|
change_key_on_leave | メンバーがビューから出る際にシークレットキーが変更されるため、古いメンバーによる傍受 (eavesdrop)を防ぐことができます。 |