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

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

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

Чтобы включить шифрование между узлами Cassandra, выполните описанную ниже процедуру на всех узлах кластера. Вам нужно распространить открытые сертификаты каждого узла на все узлы. После этого каждый узел будет содержать сертификаты node0.cer, node1.cer и т. д. в своем хранилище доверенных сертификатов. В хранилище ключей каждого узла будет только его собственный закрытый ключ. Например, в хранилище ключей node0 будет только node0.pem. Вам нужно включить шифрование на каждом узле по отдельности.

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

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

    В инструкциях ниже предполагается, что вы создали файлы keystore.node0 и truststore.node0, а также пароли для хранилища ключей и хранилища доверенных сертификатов, как описано в приложении. Прежде чем переходить к следующим шагам, необходимо создать хранилище ключей и хранилище доверенных сертификатов на каждом узле.

  2. Добавьте в файл /opt/apigee/customer/application/cassandra.properties следующие свойства: Если файла нет, создайте его.
    conf_cassandra_internode_encryption=all
    conf_cassandra_keystore=/opt/apigee/data/apigee-cassandra/keystore.node0
    conf_cassandra_keystore_password=keypass
    conf_cassandra_truststore=/opt/apigee/data/apigee-cassandra/truststore.node0
    conf_cassandra_truststore_password=trustpass
    # Optionally set the following to enable 2-way TLS or mutual TLS
    # conf_cassandra_require_client_auth=true
  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, проверьте системные журналы на наличие следующего сообщения:
    Starting Encrypted Messaging Service on TLS port

Выполните ротацию сертификатов

Чтобы выполнить ротацию сертификатов, выполните следующие действия:

  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_keystore=NEW_KEYSTORE_PATH
    conf_cassandra_keystore_password=NEW_KEYSTORE_PASSOWRD
    
      

    where NEW_KEYSTORE_PATH is the path to the directory where the keystore file is located and NEW_KEYSTORE_PASSWORD is the keystore password set when the certificates were created, as explained in the Appendix.

  5. Stop the Cassandra service:
    /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 Пароль 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