5.7. 加密集群传输
保护集群传输,以便节点与加密消息通信。您还可以配置 Data Grid 集群来执行证书身份验证,以便只有具有有效身份的节点才能加入。
5.7.1. Data Grid 集群安全性
为了保护集群流量,您需要配置 Data Grid 节点,以使用 secret 密钥加密 JGroups 消息有效负载。
Data Grid 节点可以从以下方法获取 secret 密钥:
- 协调器节点(symmetric 加密)。
- 共享密钥存储(symmetric encryption)。
从协调器节点检索 secret 密钥
您可以通过在 Data Grid 配置中的 JGroups 堆栈中添加 ASYM_ENCRYPT
协议来配置非对称加密。这允许 Data Grid 集群生成和分发 secret 密钥。
在使用非对称加密时,您还应提供密钥存储,以便节点能够执行证书身份验证并安全地交换机密密钥。这可保护集群不受中间人(MitM)攻击的影响。
非对称加密保护集群流量,如下所示:
- Data Grid 集群中的第一个节点(coordinator 节点)会生成一个 secret 密钥。
- 加入节点使用协调器执行证书身份验证,以互相验证身份。
- 加入的节点从 coordinator 节点请求 secret 密钥。该请求包含加入节点的公钥。
- 协调器节点使用公钥加密 secret 密钥,并将其返回到加入节点。
- 加入节点解密并安装 secret 密钥。
- 节点加入集群,使用 secret 密钥加密并解密信息。
从共享密钥存储检索 secret 密钥
您可以通过在 Data Grid 配置中的 JGroups 堆栈中添加 SYM_ENCRYPT
协议来配置对称加密。这允许 Data Grid 集群从您提供的密钥存储获取 secret 密钥。
- 节点在启动时从 Data Grid 类路径上的密钥存储安装 secret 密钥。
- 节点加入集群,使用 secret 密钥加密和解密消息。
非对称和对称加密的比较
带有证书身份验证的 ASYM_ENCRYPT
提供了额外的加密层,与 SYM_ENCRYPT
相比。您提供密钥存储来为 secret 密钥加密对协调节点的请求。Data Grid 会自动生成该 secret 密钥并处理集群流量,同时允许您指定何时生成 secret 密钥。例如,您可以配置集群以在节点离开时生成新的 secret 密钥。这样可确保节点无法绕过证书身份验证,并使用旧密钥加入。
另一方面,SYM_ENCRYPT
比 ASYM_ENCRYPT
快,因为节点不需要与集群协调器交换密钥。SYM_ENCRYPT
是没有配置在集群成员资格更改时自动生成新 secret 密钥的潜在缺陷。用户负责生成和分发节点用于加密集群流量的 secret 密钥。
5.7.2. 使用 Asymmetric Encryption 配置集群传输
配置 Data Grid 集群,以生成和分发加密 JGroups 消息的 secret 密钥。
流程
- 使用证书链创建密钥存储,使 Data Grid 能够验证节点身份。
将密钥存储放在集群中每个节点的 classpath 上。
对于 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
- 创建名为"encrypt-tcp"的安全 JGroups 堆栈,用于扩展 Data Grid 的默认 TCP 堆栈。
- 2
- 将节点用来执行证书身份验证的密钥存储命名。
- 3
- 指定密钥存储密码。
- 4
- 使用
stack.combine
和stack.position
属性在VERIFY_SUSPECT
协议后将SSL_KEY_EXCHANGE
插入到默认的 TCP 堆栈中。 - 5
- 指定协调器节点生成的 secret 密钥长度。默认值为
2048
。 - 6
- 指定 coordinator 节点用来生成 secret 密钥的密码引擎。默认值为
RSA
。 - 7
- 配置 Data Grid,以在协调器节点更改时生成并分发新的 secret 密钥。
- 8
- 配置 Data Grid,以在节点离开时生成和分发新的 secret 密钥。
- 9
- 配置 Data Grid 节点,以使用
SSL_KEY_EXCHANGE
协议进行证书身份验证。 - 10
- 使用
stack.combine
和stack.position
属性在SSL_KEY_EXCHANGE
协议后将ASYM_ENCRYPT
插入默认的 TCP 堆栈。 - 11
- 配置 Data Grid 集群,以使用 secure JGroups 堆栈。
验证
当您启动 Data Grid 集群时,以下日志消息表示集群使用 secure JGroups 堆栈:
[org.infinispan.CLUSTER] ISPN000078: Starting JGroups channel cluster with stack <encrypted_stack_name>
只有在它们使用 ASYM_ENCRYPT
且可以从协调器节点获取 secret 密钥时,数据网格节点才能加入集群。否则,以下信息会写入 Data Grid 日志:
[org.jgroups.protocols.ASYM_ENCRYPT] <hostname>: received message without encrypt header from <hostname>; dropping it
参考
此流程中的 ASYM_ENCRYPT
配置示例显示了常用的参数。如需完整的可用参数集合,请参阅 JGroups 文档。
5.7.3. 使用 Symmetric 加密配置集群传输
配置 Data Grid 集群,以使用您提供的密钥存储中的 secret 密钥加密 JGroups 消息。
流程
- 创建包含 secret 密钥的密钥存储。
将密钥存储放在集群中每个节点的 classpath 上。
对于 Data Grid Server,您要将密钥存储放在 $RHDG_HOME 目录中。
将
SYM_ENCRYPT
协议添加到 Data Grid 配置中的 JGroups 堆栈中,如下例所示:<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>
验证
当您启动 Data Grid 集群时,以下日志消息表示集群使用 secure JGroups 堆栈:
[org.infinispan.CLUSTER] ISPN000078: Starting JGroups channel cluster with stack <encrypted_stack_name>
只有在使用 SYM_ENCRYPT
且可以从共享密钥存储获取 secret 密钥时,数据网格节点才能加入集群。否则,以下信息会写入 Data Grid 日志:
[org.jgroups.protocols.SYM_ENCRYPT] <hostname>: received message without encrypt header from <hostname>; dropping it
参考
此流程中的 SYM_ENCRYPT
配置示例显示了常用的参数。如需完整的可用参数集合,请参阅 JGroups 文档。