Как включить шифрование трафика между узлами Cassandra

Шифрование между узлами защищает данные, передаваемые между узлами в кластере, с помощью протокола TLS. На этой странице рассказывается, как включить шифрование трафика между узлами Cassandra с помощью TLS в Edge для частного облака. Чтобы выполнить эти действия, вам нужно знать подробности о кольце Cassandra.

Как включить шифрование трафика между узлами Cassandra

Чтобы включить шифрование трафика между узлами Cassandra, выполните следующие действия:

  1. Создайте сертификаты сервера, следуя инструкциям в Приложении, чтобы создать самоподписанный ключ и сертификат.

    Если вы используете Edge для частного облака в ОС с поддержкой FIPS, используйте хранилище ключей BouncyCastle FIPS (BCFKS). Советы по работе с хранилищем ключей типа BCFKS приведены в Приложении ниже.

    В приведенных ниже инструкциях предполагается, что вы создали файлы keystore.node0 и truststore.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 Определяет IP-адрес node0 как 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

Работа с хранилищами ключей BCFKS для операционных систем с поддержкой FIPS

При работе с операционными системами, в которых включен режим 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

Примечание. Пароль хранилища ключей и пароль ключа должны совпадать.

Примечание. Можно использовать JAR-файл bc-fips, поставляемый Apigee, или скачать его из репозиториев BouncyCastle. Информацию о том, как создать хранилище ключей 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