11.8. 加密集群传输

保护集群传输,以便节点与加密消息通信。您还可以配置 Data Grid 集群来执行证书验证,以便只有具有有效身份的节点可以加入。

11.8.1. 使用 TLS 身份保护集群传输

将 SSL/TLS 身份添加到 Data Grid 服务器安全域,并使用它们来保护集群传输。然后,Data Grid Server 集群中的节点交换 SSL/TLS 证书来加密 JGroups 消息,包括 RELAY 消息(如果配置了跨站点复制)。

先决条件

  • 安装 Data Grid Server 集群。

流程

  1. 创建一个 TLS 密钥存储,其中包含用于识别数据网格服务器的单一证书。

    如果它包含 PKCS#1 或 PKCS#8 格式的私钥,以及证书,以及一个空密码: password="",您可以使用 PEM 文件。

    注意

    如果密钥存储中的证书不是由公共证书颁发机构(CA)签名,则还必须创建包含签名证书或公钥的信任存储。

  2. 将密钥存储添加到 $RHDG_HOME/server/conf 目录中。
  3. 将密钥存储添加到 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>
  4. 使用 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)攻击。

非对称加密可以保护集群流量,如下所示:

  1. Data Grid 集群中的第一个节点(协调器节点)会生成 secret 密钥。
  2. 加入的节点使用协调器执行证书验证,以相互验证身份。
  3. 加入的节点从协调器节点请求 secret 密钥。该请求包括加入节点的公钥。
  4. 协调器节点使用公钥加密 secret 密钥,并将其返回到加入的节点。
  5. 加入的节点解密并安装 secret 密钥。
  6. 节点加入集群,使用 secret 密钥加密和解密信息。

从共享密钥存储检索 secret 密钥

您可以通过在 Data Grid 配置中将 SYM_ENCRYPT 协议添加到 JGroups 堆栈来配置对称加密。这允许 Data Grid 集群从您提供的密钥存储中获取 secret 密钥。

  1. 节点在启动时从 Data Grid classpath 上的密钥存储安装 secret 密钥。
  2. 节点加入集群,使用 secret 密钥加密和解密信息。

非对称和对称加密的比较

带有证书身份验证的 ASYM_ENCRYPT 提供了额外的加密层,与 SYM_ENCRYPT 进行比较。您提供对请求进行加密的密钥存储,以协调机密密钥的节点。Data Grid 会自动生成该 secret 密钥并处理集群流量,同时让您指定何时生成 secret 密钥。例如,您可以配置集群以在节点离开时生成新的 secret 密钥。这样可确保节点无法绕过证书身份验证,并使用旧密钥加入。

另一方面,SY M_ENCRYPTASYM_ENCRYPT 快,因为节点不需要与集群协调器交换密钥。SYM_ENCRYPT 的一个潜在的缺点是,当集群成员资格更改时,没有配置可自动生成新的 secret 密钥。用户负责生成和分发节点用于加密集群流量的 secret 密钥。

11.8.3. 使用非对称加密保护集群传输

配置 Data Grid 集群,以生成和分发加密 JGroups 消息的 secret 密钥。

流程

  1. 创建具有证书链的密钥存储,使 Data Grid 能够验证节点身份。
  2. 将密钥存储放在集群中的每个节点的类路径上。

    对于 Data Grid Server,您可以将密钥存储放在 $RHDG_HOME 目录中。

  3. SSL_KEY_EXCHANGEASYM_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 消息。

流程

  1. 创建包含机密密钥的密钥存储。
  2. 将密钥存储放在集群中的每个节点的类路径上。

    对于 Data Grid Server,您可以将密钥存储放在 $RHDG_HOME 目录中。

  3. 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