启用 Cassandra 节点间加密

节点间(或节点到节点)加密使用 TLS 保护在集群中节点之间传输的数据。本页介绍了如何在 Edge for Private Cloud 上使用 TLS 启用 Cassandra 节点间加密。如需执行这些步骤,您必须熟悉 Cassandra 环的详细信息。

启用 Cassandra 节点间加密

请按照以下步骤启用 Cassandra 节点间加密:

  1. 按照附录中的步骤生成服务器证书,以创建自签名密钥和证书。

    如果您在支持 FIPS 的操作系统上使用适用于私有云的 Edge,请使用 BouncyCastle FIPS 密钥库 (BCFKS)。如需有关使用 BCFKS 类型密钥库的提示,请参阅下文中的附录

    以下步骤假定您已创建 keystore.node0truststore.node0,以及密钥库和信任库密码,如附录中所述。在每个节点上,应先创建密钥库和信任库,然后再执行后续步骤。

  2. 将以下属性添加到 /opt/apigee/customer/application/cassandra.properties 文件中。如果该文件不存在,请创建一个。
    conf_cassandra_server_encryption_internode_encryption=all
    conf_cassandra_server_encryption_keystore=/opt/apigee/data/apigee-cassandra/keystore.node0
    conf_cassandra_server_encryption_keystore_password=keypass
    conf_cassandra_server_encryption_truststore=/opt/apigee/data/apigee-cassandra/truststore.node0
    conf_cassandra_server_encryption_truststore_password=trustpass
        
    # Optionally set the following to enable 2-way TLS or mutual TLS
    conf_cassandra_server_encryption_require_client_auth=true
      
    # Set the following in FIPS enabled operating systems
    # With FIPS, older TLS protocols are disabled, so set to TLSv1.2
    conf_cassandra_server_encryption_protocol=TLSv1.2
    # With FIPS, use BCFKS keystores
    conf_cassandra_server_encryption_store_type=BCFKS
      
  3. 确保文件 cassandra.properties 归 apigee 用户所有:
    chown apigee:apigee \
    /opt/apigee/customer/application/cassandra.properties
    

在每个 Cassandra 节点上逐个执行以下步骤,以便更改生效,而不会给用户造成任何停机时间:

  1. 停止 Cassandra 服务:
    /opt/apigee/apigee-service/bin/apigee-service \
    apigee-cassandra stop
    
  2. 重启 Cassandra 服务:
    /opt/apigee/apigee-service/bin/apigee-service \
    apigee-cassandra start
    
  3. 如需确定 TLS 加密服务是否已启动,请检查系统日志中是否出现以下消息:
    Internode messaging enabled TLS protocols
    Internode messaging enabled cipher suites
    

执行证书轮替

如需轮替证书,请按以下步骤操作:

  1. 将为每个生成的唯一密钥对生成的证书(请参阅附录)添加到现有 Cassandra 节点的信任库,以便旧证书和新证书都存在于同一信任库中:
    keytool -import -v -trustcacerts -alias NEW_ALIAS \
    -file CERT -keystore EXISTING_TRUSTSTORE
    

    其中 NEW_ALIAS 是用于标识条目的唯一字符串,CERT 是要添加的证书文件的名称,EXISTING_TRUSTSTORE 是 Cassandra 节点上现有信任库的名称。

  2. 使用复制实用程序(例如 scp)将信任库分发到集群中的所有 Cassandra 节点,从而替换每个节点使用的现有信任库。
  3. 对集群执行滚动重启,以加载新的信任库,并在新的密钥就位之前建立对这些密钥的信任:
    /opt/apigee/apigee-service/bin/apigee-service \
    apigee-cassandra restart
    
  4. 在集群中的每个 Cassandra 节点上,将 cassandra.properties 文件中的以下属性更新为新的密钥库值:
    conf_cassandra_server_encryption_keystore=NEW_KEYSTORE_PATH
    conf_cassandra_server_encryption_keystore_password=NEW_KEYSTORE_PASSWORD
      

    其中,NEW_KEYSTORE_PATH 是密钥库文件所在目录的路径,NEW_KEYSTORE_PASSWORD 是创建证书时设置的密钥库密码,如附录中所述。

  5. 停止 Cassandra 服务:
    /opt/apigee/apigee-service/bin/apigee-service \
    apigee-cassandra stop
    
  6. 重启 Cassandra 服务:
    /opt/apigee/apigee-service/bin/apigee-service \
    apigee-cassandra start
    
  7. 当所有节点之间成功建立通信后,继续执行下一个 Cassandra 节点。注意:只有在所有节点之间成功建立通信后才能前进到下一个节点。

附录

以下示例介绍了如何准备执行节点间加密步骤所需的服务器证书。示例中显示的命令使用以下参数:

参数 说明
node0 用于标识节点的任何唯一字符串。
keystore.node0 密钥库名称。这些命令假设此文件位于当前目录中。
keypass 密钥库和密钥的密钥密码必须相同。
dname node0 的 IP 地址标识为 10.128.0.39
-validity 利用此标志设置的值,可使生成的密钥对的有效期为 10 年。
  1. 转到以下目录:
    cd /opt/apigee/data/apigee-cassandra
  2. 运行以下命令,在当前目录中生成名为 keystore.node0 的文件:
    keytool -genkey -keyalg RSA -alias node0 -validity 3650 \
    -keystore keystore.node0 -storepass keypass \
    -keypass keypass -dname "CN=10.128.0.39, OU=None, \
    O=None, L=None, C=None"

    重要提示:请确保密钥密码与密钥库密码相同。

  3. 将证书导出到单独的文件:
    keytool -export -alias node0 -file node0.cer \
    -keystore keystore.node0
  4. 确保只有 apigee 用户可以读取该文件,其他任何用户都无法读取:
    $ chown apigee:apigee \
    /opt/apigee/data/apigee-cassandra/keystore.node0
    $ chmod 400 /opt/apigee/data/apigee-cassandra/keystore.node0
  5. 将生成的证书 node0.cer 导入到节点的信任库:
    keytool -import -v -trustcacerts -alias node0 \
    -file node0.cer -keystore truststore.node0

    上述命令会要求您设置密码。这是信任库密码,可以与您之前设置的密钥库密码不同。如果系统提示您信任该证书,请输入 yes

  6. 使用 openssl 生成不含密钥的证书 PEM 文件。请注意,cqlsh 不适用于生成的格式的证书。
    $ keytool -importkeystore -srckeystore keystore.node0 \
    -destkeystore node0.p12 -deststoretype PKCS12 -srcstorepass \
    keypass -deststorepass keypass
    $ openssl pkcs12 -in node0.p12 -nokeys -out node0.cer.pem \
    -passin pass:keypass
    $ openssl pkcs12 -in node0.p12 -nodes -nocerts -out node0.key.pem -passin pass:keypass
  7. 对于节点到节点加密,请将 node0.cer 文件复制到每个节点,并将其导入到每个节点的信任库。
    keytool -import -v -trustcacerts -alias node0 \
    -file node0.cer -keystore truststore.node1
  8. 使用 keytool -list 检查密钥库和信任库文件中的证书:
    $ keytool -list -keystore keystore.node0
    $ keytool -list -keystore truststore.node0

使用适用于启用 FIPS 的操作系统的 BCFKS 密钥库

使用启用了 FIPS 的操作系统时,请使用 BouncyCastle FIPS 密钥库 (BCFKS)。 以下部分介绍了如何使用 BCFKS 类型密钥库。与密钥库相关的其他步骤(例如文件所有权、文件位置等)与本附录中所述的步骤保持不变。

如需生成类型为 BCFKS 的密钥库,请使用以下命令:

keytool -genkeypair -keyalg RSA -alias node0 -validity 365 -keystore keystore.node0 \
-storepass keypass -keypass keypass -v \
-dname "EMAILADDRESS=youremail@domain.com, CN=yourcn, OU=yourou, O=youro, L=yourl, C=yourc" \
-storetype BCFKS -providerpath /opt/apigee/edge-gateway/lib/thirdparty/bc-fips-1.0.2.4.jar \
-providerclass org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider -providername BCFIPS

注意:密钥库密码和密钥密码应相同。

注意:您可以使用 Apigee 提供的 bc-fips jar 文件,也可以从 BouncyCastle 的代码库下载相同的 jar 文件。如需详细了解如何生成 BCFKS 密钥库,请参阅 BouncyCastle 文档。

将证书导出到单独的文件中:

keytool -export -v -alias node0 -file node0.cer -keystore keystore.node0 -storepass keypass \
-storetype BCFKS -providerpath /opt/apigee/edge-gateway/lib/thirdparty/bc-fips-1.0.2.4.jar \
-providerclass org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider -providername BCFIPS

将生成的证书 node0.cer 导入到节点的信任库:

keytool -import -v -alias node0 -file node0.cer -keystore truststore.node0 -storepass storepass \
-storetype BCFKS -providerpath /opt/apigee/edge-gateway/lib/thirdparty/bc-fips-1.0.2.4.jar \
-providerclass org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider -providername BCFIPS