11.8. 加密集群传输
保护集群传输,以便节点与加密消息通信。您还可以配置 Data Grid 集群来执行证书验证,以便只有具有有效身份的节点可以加入。
11.8.1. 使用 TLS 身份保护集群传输
将 SSL/TLS 身份添加到 Data Grid 服务器安全域,并使用它们来保护集群传输。然后,Data Grid Server 集群中的节点交换 SSL/TLS 证书来加密 JGroups 消息,包括 RELAY 消息(如果配置了跨站点复制)。
先决条件
- 安装 Data Grid Server 集群。
流程
创建一个 TLS 密钥存储,其中包含用于识别数据网格服务器的单一证书。
如果它包含 PKCS#1 或 PKCS#8 格式的私钥,以及证书,以及一个空密码:
password=""
,您可以使用 PEM 文件。注意如果密钥存储中的证书不是由公共证书颁发机构(CA)签名,则还必须创建包含签名证书或公钥的信任存储。
-
将密钥存储添加到
$RHDG_HOME/server/conf
目录中。 将密钥存储添加到 Data Grid Server 配置中的新安全域。
重要您应该创建专用的密钥存储和安全域,以便 Data Grid Server 端点不像集群传输一样使用相同的安全域。
<server xmlns="urn:infinispan:server:13.0"> <security> <security-realms> <security-realm name="cluster-transport"> <server-identities> <ssl> <!-- Adds a keystore that contains a certificate that provides SSL/TLS identity to encrypt cluster transport. --> <keystore path="server.pfx" relative-to="infinispan.server.config.path" password="secret" alias="server"/> </ssl> </server-identities> </security-realm> </security-realms> </security> </server>
使用
server:security-realm
属性指定安全域,将集群传输配置为使用安全域。<infinispan> <cache-container> <transport server:security-realm="cluster-transport"/> </cache-container> </infinispan>
验证
当您启动 Data Grid Server 时,以下日志消息表示集群正在将安全域用于集群传输:
[org.infinispan.SERVER] ISPN080060: SSL Transport using realm <security_realm_name>
11.8.2. JGroups 加密协议
为保护集群流量,您可以配置 Data Grid 节点,以使用机密密钥加密 JGroups 消息有效负载。
Data Grid 节点可以从以下任一位置获取 secret 密钥:
- 协调器节点(基本指标加密)。
- 共享密钥存储(symmetric 加密)。
从协调器节点检索 secret 密钥
您可以通过在 Data Grid 配置中将 ASYM_ENCRYPT
协议添加到 JGroups 堆栈来配置非对称加密。这允许 Data Grid 集群生成并分发 secret 密钥。
在使用非对称加密时,您还应提供密钥存储,以便节点能够执行证书身份验证和安全地交换密钥。这会防止集群不受中间人(MitM)攻击。
非对称加密可以保护集群流量,如下所示:
- Data Grid 集群中的第一个节点(协调器节点)会生成 secret 密钥。
- 加入的节点使用协调器执行证书验证,以相互验证身份。
- 加入的节点从协调器节点请求 secret 密钥。该请求包括加入节点的公钥。
- 协调器节点使用公钥加密 secret 密钥,并将其返回到加入的节点。
- 加入的节点解密并安装 secret 密钥。
- 节点加入集群,使用 secret 密钥加密和解密信息。
从共享密钥存储检索 secret 密钥
您可以通过在 Data Grid 配置中将 SYM_ENCRYPT
协议添加到 JGroups 堆栈来配置对称加密。这允许 Data Grid 集群从您提供的密钥存储中获取 secret 密钥。
- 节点在启动时从 Data Grid classpath 上的密钥存储安装 secret 密钥。
- 节点加入集群,使用 secret 密钥加密和解密信息。
非对称和对称加密的比较
带有证书身份验证的 ASYM_ENCRYPT
提供了额外的加密层,与 SYM_ENCRYPT
进行比较。您提供对请求进行加密的密钥存储,以协调机密密钥的节点。Data Grid 会自动生成该 secret 密钥并处理集群流量,同时让您指定何时生成 secret 密钥。例如,您可以配置集群以在节点离开时生成新的 secret 密钥。这样可确保节点无法绕过证书身份验证,并使用旧密钥加入。
另一方面,SY M_ENCRYPT
比 ASYM_ENCRYPT
快,因为节点不需要与集群协调器交换密钥。SYM_ENCRYPT
的一个潜在的缺点是,当集群成员资格更改时,没有配置可自动生成新的 secret 密钥。用户负责生成和分发节点用于加密集群流量的 secret 密钥。
11.8.3. 使用非对称加密保护集群传输
配置 Data Grid 集群,以生成和分发加密 JGroups 消息的 secret 密钥。
流程
- 创建具有证书链的密钥存储,使 Data Grid 能够验证节点身份。
将密钥存储放在集群中的每个节点的类路径上。
对于 Data Grid Server,您可以将密钥存储放在 $RHDG_HOME 目录中。
将
SSL_KEY_EXCHANGE
和ASYM_ENCRYPT
协议添加到数据网格配置中的 JGroups 堆栈,如下例所示:<infinispan> <jgroups> <!-- Creates a secure JGroups stack named "encrypt-tcp" that extends the default TCP stack. --> <stack name="encrypt-tcp" extends="tcp"> <!-- Adds a keystore that nodes use to perform certificate authentication. --> <!-- Uses the stack.combine and stack.position attributes to insert SSL_KEY_EXCHANGE into the default TCP stack after VERIFY_SUSPECT. --> <SSL_KEY_EXCHANGE keystore_name="mykeystore.jks" keystore_password="changeit" stack.combine="INSERT_AFTER" stack.position="VERIFY_SUSPECT"/> <!-- Configures ASYM_ENCRYPT --> <!-- Uses the stack.combine and stack.position attributes to insert ASYM_ENCRYPT into the default TCP stack before pbcast.NAKACK2. --> <!-- The use_external_key_exchange = "true" attribute configures nodes to use the `SSL_KEY_EXCHANGE` protocol for certificate authentication. --> <ASYM_ENCRYPT asym_keylength="2048" asym_algorithm="RSA" change_key_on_coord_leave = "false" change_key_on_leave = "false" use_external_key_exchange = "true" stack.combine="INSERT_BEFORE" stack.position="pbcast.NAKACK2"/> </stack> </jgroups> <cache-container name="default" statistics="true"> <!-- Configures the cluster to use the JGroups stack. --> <transport cluster="${infinispan.cluster.name}" stack="encrypt-tcp" 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>
只有使用 ASYM_ENCRYPT
,并且可以从协调器节点获取 secret 密钥时,才可以加入集群。否则,以下消息被写入 Data Grid 日志:
[org.jgroups.protocols.ASYM_ENCRYPT] <hostname>: received message without encrypt header from <hostname>; dropping it
11.8.4. 使用对称加密保护集群传输
配置 Data Grid 集群,以使用您提供的密钥存储的机密密钥加密 JGroups 消息。
流程
- 创建包含机密密钥的密钥存储。
将密钥存储放在集群中的每个节点的类路径上。
对于 Data Grid Server,您可以将密钥存储放在 $RHDG_HOME 目录中。
-
将
SYM_ENCRYPT
协议添加到数据网格配置中的 JGroups 堆栈。
<infinispan> <jgroups> <!-- Creates a secure JGroups stack named "encrypt-tcp" that extends the default TCP stack. --> <stack name="encrypt-tcp" extends="tcp"> <!-- Adds a keystore from which nodes obtain secret keys. --> <!-- Uses the stack.combine and stack.position attributes to insert SYM_ENCRYPT into the default TCP stack after VERIFY_SUSPECT. --> <SYM_ENCRYPT keystore_name="myKeystore.p12" keystore_type="PKCS12" store_password="changeit" key_password="changeit" alias="myKey" stack.combine="INSERT_AFTER" stack.position="VERIFY_SUSPECT"/> </stack> </jgroups> <cache-container name="default" statistics="true"> <!-- Configures the cluster to use the JGroups stack. --> <transport cluster="${infinispan.cluster.name}" stack="encrypt-tcp" 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