啟用 Cassandra 跨節點加密

節點間 (或節點對節點) 加密可使用 TLS 保護叢集中節點之間傳輸的資料。本頁說明如何在 Edge for Private Cloud 上使用 TLS 啟用 Cassandra 節點間加密功能。如要執行這些步驟,您必須熟悉 Cassandra 環的詳細資料。

啟用 Cassandra 節點間加密功能

如要啟用 Cassandra 節點間加密功能,請按照下列步驟操作:

  1. 按照附錄中的步驟建立自行簽署的金鑰和憑證,產生伺服器憑證。

    如果您在支援 FIPS 的作業系統上使用 Edge for Private Cloud,請使用 BouncyCastle FIPS 金鑰庫 (BCFKS)。如要瞭解如何使用 BCFKS 類型 KeyStore,請參閱下方的附錄

    下列步驟假設您已建立 keystore.node0truststore.node0,以及 KeyStore 和 TrustStore 密碼,如附錄所述。在繼續進行後續步驟之前,請先在每個節點上建立金鑰庫和信任存放區,做為初步步驟。

  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 檔案中的新 KeyStore 值:
    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 KeyStore 和金鑰的 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"

    重要事項:請確認金鑰密碼與 Keystore 密碼相同。

  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 檢查 KeyStore 和 TrustStore 檔案中的憑證:
    $ keytool -list -keystore keystore.node0
    $ keytool -list -keystore truststore.node0

使用 BCFKS 金鑰庫 (適用於支援 FIPS 的作業系統)

使用啟用 FIPS 的作業系統時,請使用 BouncyCastle FIPS 金鑰庫 (BCFKS)。以下章節說明如何使用 BCFKS 類型金鑰庫。使用金鑰庫的其他步驟 (例如檔案擁有權、檔案位置等) 與本附錄所述相同。

如要產生 BCFKS 類型的 KeyStore,請使用下列指令:

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

注意:KeyStore 密碼和金鑰密碼應相同。

注意:您可以使用 Apigee 提供的 bc-fips jar,也可以從 BouncyCastle 的存放區下載相同的 jar。如要進一步瞭解如何產生 BCFKS KeyStore,請參閱 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