Настройте собственный mTLS Cassandra

Введение

Различные компоненты Edge for Private Cloud, такие как обработчики сообщений, серверы управления и маршрутизаторы, по умолчанию подключаются к узлам Cassandra по текстовому каналу. По таким каналам данные передаются в Cassandra и обратно в открытом виде. Apigee mTLS — это функция на основе сервисной сетки Consul, которая обеспечивает безопасность обмена данными между компонентами кластера Edge for Private Cloud. Это предложение Apigee также обеспечивает безопасность TLS в канале связи между клиентскими компонентами и Cassandra.

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

Собственная функция mTLS

Включение mTLS между Cassandra и клиентскими компонентами, описанное в этой статье, основано на функциях TLS, изначально предоставляемых Apache Cassandra . При включении mTLS клиентские соединения с Cassandra (через собственный транспортный порт CQL 9042) выполняют двустороннее TLS-рукопожатие с клиентами, прежде чем разрешить установку соединения. В рамках этого двустороннего TLS-соединения Cassandra выступает в качестве сервера, а различные клиенты, подключающиеся к Cassandra (например, edge-message-processor, cqlsh tool и т. д.), — в качестве клиентов.

Для двустороннего TLS (или взаимного TLS или mTLS) и в Cassandra, и на клиентах необходимо настроить собственное хранилище ключей. Хранилище ключей каждого узла Cassandra должно содержать собственный ключ и сертификат. Хранилище ключей каждого клиентского приложения должно содержать ключ и сертификат этого клиента. Хранилище доверенных сертификатов, содержащее сертификаты и связанную цепочку сертификатов, должно быть добавлено как в Cassandra, так и на клиентах. Хранилище доверенных сертификатов каждого узла Cassandra должно содержать сертификаты клиентов, а хранилище доверенных сертификатов каждого клиента должно содержать сертификаты всех узлов Cassandra. Подробнее о том, как работает двустороннее рукопожатие TLS, см. в статье Apigee «Двустороннее TLS/SSL» .

Цепочка сертификатов

Как правило, в двустороннем TLS сертификаты сервера, клиентские сертификаты, цепочки сертификатов, хранилища ключей и хранилища доверенных сертификатов могут быть созданы различными способами. То же самое справедливо и для Cassandra, и для клиентского mTLS. Учитывая, как организации обычно используют кластеры Edge for Private Cloud и количество уникальных пар подключений клиент-Cassandra, которые можно установить, Apigee рекомендует использовать следующий общий подход к настройке ключей и сертификатов для этой функции. Существуют и другие приемлемые методы, но описанный ниже метод, вероятно, обеспечивает хороший баланс между безопасностью и затратами на обслуживание.

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

  2. Используйте общий промежуточный ключ/сертификат, указанный выше, для подписи всех ключей и сертификатов, специфичных для приложения (листовых).

Наличие общего промежуточного ключа/сертификата в одном кластере позволяет настроить общее хранилище доверенных сертификатов (содержащее одну и ту же цепочку корневых и промежуточных сертификатов) на каждом узле Cassandra и клиентском узле. Каждый узел Cassandra и клиентское приложение получают свой уникальный конечный ключ и сертификат, подписанный общим промежуточным ключом/сертификатом.

  1. Ротация листового сертификата узла Cassandra или клиентского приложения выполняется тривиально.
  2. Ротация промежуточного или корневого сертификата по-прежнему остается довольно сложной операцией, но частота таких ротаций будет намного ниже, чем у листовых сертификатов.

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

Оставшиеся шаги в этой статье содержат подробную информацию о вышеуказанной методологии разработки ключей и сертификатов.

Ограничения и предостережения

К этой функции применяются следующие ограничения.

  • Это предложение нативного mTLS между клиентскими компонентами и Cassandra НЕ совместимо с apigee-mtls . Если вы используете эту функцию, вы не сможете использовать apigee-mtls и наоборот.
  • Включение mTLS между клиентскими компонентами и Cassandra окажет некоторое влияние на производительность соединений между клиентами и Cassandra. Такие операции, как загрузка клиентов или масштабирование соединений Cassandra, могут выполняться медленнее, поскольку Cassandra и клиенты должны сначала согласовать TLS перед началом обмена данными. Влияние должно быть незначительным и, как правило, незаметным.
  • В Cassandra mTLS может быть опционально включен для входящих клиентских подключений. Хотя принудительное включение можно включить, его необходимо отключить во время выполнения рабочих задач, таких как обновление программного обеспечения Apigee, включение/отключение функций TLS и определённые типы ротации сертификатов. Подробнее см. в разделе «Операции и конфигурации» .
  • Управление и поддержание сертификатов является обязанностью заказчика.
  • Ротация сертификатов имеет ряд нюансов. Подробнее см. в разделе «Ротация сертификатов».

Включить собственный mTLS

На высоком уровне включение собственного mTLS представляет собой трехэтапную процедуру, описанную ниже:

  1. Получите корневой сертификат и промежуточную пару ключ/сертификат.
  2. Создайте пару «листовой ключ/сертификат» для одного узла Cassandra, подпишите её, сохраните в хранилище ключей и настройте Cassandra для использования mTLS (необязательно) . Повторите шаги для каждого узла Cassandra по одному за раз.
  3. Создайте пару «листовой ключ/сертификат» для одного клиентского приложения, подпишите её, сохраните в хранилище ключей и настройте клиентское приложение для mTLS. Повторите шаги для каждого клиентского приложения по одному за раз. Клиентские приложения:
    1. сервер управления периферией
    2. процессор граничных сообщений
    3. кромочный маршрутизатор

Эти шаги подробно описаны ниже:

Получить корневые и промежуточные сертификаты

Получите корневой сертификат и пару промежуточных ключей и сертификатов, подписанных корневым сертификатом. Используйте корневой и промежуточный сертификаты, подписанные центром сертификации вашей организации, или создайте самоподписанные сертификаты. Сохраните цепочку корневого и промежуточного сертификатов в хранилище доверенных сертификатов. Полезные команды см. в Приложении 1. Последующие команды предполагают, что у вас есть доступ к следующим файлам:

  • intermediate.key - ключевой файл промежуточного сертификата для подписи листовых сертификатов
  • intermediate-cert.pem - промежуточный сертификат

Настройте узлы Cassandra

  1. Выберите один узел Cassandra
  2. Сгенерируйте пару «листовой ключ — сертификат» и подпишите её промежуточным сертификатом. Сохраните ключ и подписанный сертификат в хранилище ключей. Пример ниже:
    
    # Generate Leaf key and csr
    openssl req -newkey rsa:2048 -keyout cass-node1.key -out cass-node1-req.pem -sha256 -days 365 -nodes -subj "/C=yourc/ST=yourst/L=yourl/O=youro/OU=yourou/CN=yourip/emailAddress=cassnode1@yourorg.com"
    
    # leaf cert signed by intermediate
    openssl x509 -req -in cass-node1-req.pem -CAkey intermediate.key -CA intermediate-cert.pem -days 365 -CAcreateserial -out cass-node1-cert.pem
    
    # keystore packaging leaf key and cert
    openssl pkcs12 -export -clcerts -in cass-node1-cert.pem -inkey cass-node1.key -out cass-node1-keystore.pfx -name nativemtls -password pass:keystorepass

    Разместите файлы хранилища ключей и хранилища доверенных сертификатов в определенном месте на узле и обеспечьте к ним доступ пользователю Apigee.

    cp cass-node1-keystore.pfx /opt/apigee/customer/application/
    cp truststore.pfx /opt/apigee/customer/application/
    
    chown apigee:apigee /opt/apigee/customer/application/cass-node1-keystore.pfx
    chown apigee:apigee /opt/apigee/customer/application/truststore.pfx

  3. Создайте или отредактируйте файл /opt/apigee/customer/application/cassandra.properties . Добавьте в него следующее содержимое:
    ### Enable Cassandra TLS on CQL connections
    conf_cassandra_client_encryption_enabled=true
    
    ### Optional TLS - true or false
    conf_cassandra_client_encryption_optional=true
    
    ### Keystore details
    conf_cassandra_client_encryption_keystore=/opt/apigee/customer/application/cass-node1-keystore.pfx
    conf_cassandra_client_encryption_keystore_password=keystorepass
    conf_cassandra_server_encryption_store_type=PKCS12
    
    ### Whether to enable 2-way TLS (or mTLS) - true or false
    conf_cassandra_client_encryption_require_client_auth=true
    
    ### When 2-way TLS is enabled, client certificate details need to be provided via a truststore
    conf_cassandra_client_encryption_truststore=/opt/apigee/customer/application/truststore.pfx
    conf_cassandra_client_encryption_truststore_password=trustpass
    conf_cassandra_client_encryption_store_type=PKCS12
    

    Кроме того, для операционных систем с поддержкой FIPS добавьте следующее свойство в файл /opt/apigee/customer/application/cassandra.properties :

    conf_cassandra_client_encryption_protocol=TLSv1.2

    Убедитесь, что файл принадлежит пользователю apigee и доступен для чтения:

    chown apigee:apigee /opt/apigee/customer/application/cassandra.properties
  4. Настройте и перезапустите узел Cassandra.
    apigee-service apigee-cassandra configure
    apigee-service apigee-cassandra restart
    
  5. Повторите вышеуказанные шаги на каждом узле Cassandra по одному за раз.

Настройка клиентских приложений

Этот раздел применим к следующим клиентским компонентам, подключающимся к Cassandra:

  • сервер управления периферией
  • процессор граничных сообщений
  • кромочный маршрутизатор

  1. Выберите один клиентский компонент
  2. Сгенерируйте пару «листовой ключ — сертификат» и подпишите её промежуточным сертификатом. Сохраните ключ и подписанный сертификат в хранилище ключей. Пример ниже:
    
    # Generate Leaf key and csr
    openssl req -newkey rsa:2048 -keyout mgmt-node1.key -out mgmt-node1-req.pem -sha256 -days 365 -nodes -subj "/C=yourc/ST=yourst/L=yourl/O=youro/OU=yourou/CN=yourip/emailAddress=mgmtnode1@yourorg.com"
    
    # leaf cert signed by intermediate
    openssl x509 -req -in mgmt-node1-req.pem -CAkey intermediate.key -CA intermediate-cert.pem -days 365 -CAcreateserial -out mgmt-node1-cert.pem
    
    # keystore packaging leaf key and cert
    openssl pkcs12 -export -clcerts -in mgmt-node1-cert.pem -inkey mgmt-node1.key -out mgmt-node1-keystore.pfx -name nativemtls -password pass:keystorepass
    

    Разместите файлы хранилища ключей и хранилища доверенных сертификатов в определенном месте на узле и обеспечьте к ним доступ пользователю Apigee.

    cp mgmt-node1-keystore.pfx /opt/apigee/customer/application/
    cp truststore.pfx /opt/apigee/customer/application/
    
    chown apigee:apigee /opt/apigee/customer/application/mgmt-node1-keystore.pfx
    chown apigee:apigee /opt/apigee/customer/application/truststore.pfx

  3. Создайте и отредактируйте файл конфигурации на основе настраиваемого приложения.
    Приложение Файл конфигурации
    Сервер управления /opt/apigee/customer/application/management-server.properties
    Процессор управления /opt/apigee/customer/application/message-processor.properties
    Маршрутизатор /opt/apigee/customer/application/router.properties

    Добавьте в файл следующие конфигурации:

    ### Enable TLS on CQL connections
    conf_cassandra_sslconfig.enable.tls=true
    conf_cassandra_sslconfig.enable.mtls=true
    
    ### Keystore Details
    conf_cassandra_sslconfig.keystore.path=/opt/apigee/customer/application/mgmt-node1-keystore.pfx
    conf_cassandra_sslconfig.keystore.password=keystorepass
    conf_cassandra_sslconfig.keystore.type=PKCS12
    
    ### Truststore Details
    conf_cassandra_sslconfig.truststore.path=/opt/apigee/customer/application/truststore.pfx
    conf_cassandra_sslconfig.truststore.password=trustpass
    conf_cassandra_sslconfig.truststore.type=PKCS12
    

    Убедитесь, что файл конфигурации принадлежит пользователю Apigee и доступен для чтения.

    chown apigee:apigee configuration file
    
    ### Example:
    chown apigee:apigee /opt/apigee/customer/application/management-server.properties
    

  4. Перезапустите клиентское приложение.
    # Configure and restart service:
    apigee-service component configure
    apigee-service component restart
    # Example, to configure and restart message processor application
    apigee-service edge-message-processor configure
    apigee-service edge-message-processor restart
    
  5. Вы можете убедиться в том, что SSL был правильно настроен в клиентском приложении, просмотрев записи в системном журнале соответствующего приложения по следующим строкам:

    Добавлены параметры SSL для подключения Cassandra

  6. Повторите вышеуказанные шаги для каждого клиентского приложения по одному за раз.

Операции и конфигурации

Обеспечить соблюдение mTLS

Если в Cassandra не используется принудительное использование mTLS, Cassandra принимает как незашифрованные соединения от клиентов, так и клиенты, с которыми она может успешно выполнить двустороннее TLS-рукопожатие. Для работы принудительного использования mTLS необходимо сначала настроить mTLS в Cassandra . Вы можете включить принудительное использование mTLS в Cassandra, выполнив следующие действия:

  1. Выберите один узел Cassandra
  2. Создайте или отредактируйте файл /opt/apigee/customer/application/cassandra.properties . Добавьте или отредактируйте следующее свойство в этом файле:
    ### Optional TLS - true or false
    conf_cassandra_client_encryption_optional=false
    

    Убедитесь, что файл принадлежит пользователю Apigee и доступен для чтения.

    chown apigee:apigee /opt/apigee/customer/application/cassandra.properties
    
  3. Настройте и перезапустите узел Cassandra.
    apigee-service apigee-cassandra configure
    apigee-service apigee-cassandra restart
    
  4. Повторите вышеуказанные шаги на каждом узле Cassandra по одному за раз.

После включения mTLS в Cassandra стандартный инструмент запросов Cassandra cqlsh не сможет напрямую подключаться к Cassandra. Чтобы настроить cqlsh для SSL, сгенерируйте новый ключ и сертификат (аналогично ключу и сертификату для клиентских приложений ) и выполните следующие действия:

  1. Создать или отредактировать файл $HOME/.cassandra/cqlshrc
  2. Добавьте в файл следующее содержимое:
    [ssl]
    certfile = /home/admin-user/certs/inter-root.pem
    validate = false
    userkey = /home/admin-user/certs/cqlsh1.key
    usercert = /home/admin-user/certs/cqlsh1-cert.pem
    
    • certfile — файл сертификата, содержащий корневую и промежуточную цепочку сертификатов
    • userkey — клиентский ключ, используемый cqlsh. Это должна быть пара «листовой ключ/сертификат», которую можно сгенерировать и подписать промежуточным сертификатом.
    • usercert — клиентский сертификат, используемый cqlsh. Это должен быть листовой ключ/сертификат, который можно сгенерировать и подписать промежуточным сертификатом.
  3. Выполните команду cqlsh как обычно, указав аргумент --ssl . Например:
    $  /opt/apigee/apigee-cassandra/bin/cqlsh --ssl X.X.X.X
    Connected to Apigee at X.X.X.X:9042
    [cqlsh 6.0.0 | Cassandra 4.0.13 | CQL spec 3.4.5 | Native protocol v5]
    Use HELP for help.
    cqlsh>
    

Отключить принудительное использование mTLS на Cassandra

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

  1. Выберите один узел Cassandra
  2. Создайте или отредактируйте файл /opt/apigee/customer/application/cassandra.properties . Добавьте или отредактируйте следующее свойство в этом файле:
    ### Optional TLS - true or false
    conf_cassandra_client_encryption_optional=true
    

    Убедитесь, что файл принадлежит пользователю Apigee и доступен для чтения.

    chown apigee:apigee /opt/apigee/customer/application/cassandra.properties
    
  3. Настройте и перезапустите узел Cassandra.
    apigee-service apigee-cassandra configure
    apigee-service apigee-cassandra restart
    
  4. Повторите вышеуказанные шаги на каждом узле Cassandra по одному за раз.

Отключить собственный mTLS

Отключение нативного mTLS — это многоэтапный процесс, аналогичный включению нативного mTLS . Основные этапы:

  1. Отключить принудительное использование mTLS в Cassandra (если применяется)
  2. Поочередно отключите mTLS во всех узлах следующих клиентских приложений:
    • сервер управления периферией
    • процессор граничных сообщений
    • кромочный маршрутизатор
    1. Создайте и отредактируйте файл конфигурации на основе настраиваемого приложения:
      Приложение Файл конфигурации
      Сервер управления /opt/apigee/customer/application/management-server.properties
      Процессор управления /opt/apigee/customer/application/message-processor.properties
      Маршрутизатор /opt/apigee/customer/application/router.properties
    2. Добавьте или отредактируйте следующие свойства в файле конфигурации:
      ### TLS on CQL connections
      conf_cassandra_sslconfig.enable.tls=false
      conf_cassandra_sslconfig.enable.mtls=false
      
    3. Убедитесь, что файл конфигурации принадлежит пользователю apigee и доступен для чтения:
      chown apigee:apigee configuration file
      
      ### Example:
      chown apigee:apigee /opt/apigee/customer/application/management-server.properties
    4. Перезапустите клиентское приложение:
      
      # Configure and restart service:
      apigee-service component configure
      apigee-service component restart
      
      # Example, to configure and restart message processor application
      apigee-service edge-message-processor configure
      apigee-service edge-message-processor restart
      
    5. Повторите шаги с #a по #d для каждого клиентского приложения, по одному за раз.
  3. Отключите mTLS на всех узлах Cassandra по очереди:
    1. Выберите один узел Cassandra.
    2. Создайте или отредактируйте файл /opt/apigee/customer/application/cassandra.properties . Добавьте или отредактируйте следующее свойство в этом файле:
      ### Cassandra TLS on CQL connections
      conf_cassandra_client_encryption_enabled=false
      

      Убедитесь, что файл принадлежит пользователю Apigee и доступен для чтения.

      chown apigee:apigee /opt/apigee/customer/application/cassandra.properties
      
    3. Настройте и перезапустите узел Cassandra
    4. apigee-service apigee-cassandra configure
      apigee-service apigee-cassandra restart
      
    5. Повторите шаги с #a по #c на каждом узле Cassandra, по одному за раз.

Ротация сертификатов

Ротация только для сертификатов Leaf (с сохранением тех же промежуточных и корневых сертификатов)

Можно выполнить шаги, аналогичные настройке клиентских приложений :

  1. Генерация нового листового ключа/сертификата для приложения, использующего тот же промежуточный ключ/сертификат
  2. Настройте путь к новому ключу/сертификату в приложении вместе с паролем и типом хранилища ключей.
  3. Перезапустите приложение.
Ротация корневых или промежуточных сертификатов

Если вы планируете провести ротацию промежуточного или корневого сертификата, рекомендуется сделать это в несколько этапов:

  1. Отключите собственный mTLS Cassandra во всем кластере.
  2. Используйте новые корневые и промежуточные сертификаты для генерации новых листовых сертификатов или сертификатов приложений.
  3. Следуйте инструкциям по включению собственного mTLS Cassandra с использованием нового набора ключей и сертификатов.

Общие операции Apigee

Для выполнения общих операций Apigee, таких как обновление программного обеспечения Apigee, добавление или удаление узлов Cassandra, добавление или удаление центров обработки данных, включение или отключение аутентификации Cassandra и т. д., убедитесь, что в Cassandra отключено принудительное использование mTLS. Если у вас включено принудительное использование mTLS, отключите его перед выполнением этих операций.

Приложение 1

Действия, описанные в этом приложении, можно выполнить для создания самоподписанной пары корневого и промежуточного ключа/сертификата и добавления этой цепочки сертификатов в хранилище доверенных сертификатов.

Генерация самоподписанных корневых и промежуточных сертификатов

# Create self-signed root key and cert
openssl req -x509 -newkey rsa:2048 -keyout root.key -out root-cert.pem -sha256 -days 3650 -nodes -subj "/C=yourc/ST=yourst/L=yourl/O=youro/OU=yourou/CN=root.yourorg.com/emailAddress=apigeeroot@yourorg.com"

# Create intermediate key and cert (signed by root)
openssl req -newkey rsa:2048 -keyout intermediate.key -out intermediate-req.pem -sha256 -days 3650 -nodes -subj "/C=yourc/ST=yourst/L=yourl/O=youro/OU=yourou/CN=inter.yourorg.com/emailAddress=apigeeinter@yourorg.com"

openssl x509 -req -in intermediate-req.pem -CAkey root.key -CA root-cert.pem -days 3650 -CAcreateserial -out intermediate-cert.pem

Создать хранилище доверенных сертификатов

# Merge root and intermediate cert into 1 file
cat intermediate-cert.pem > inter-root.pem
cat root-cert.pem >> inter-root.pem

# Create truststore to be used everywhere
keytool -keystore truststore.pfx -storetype PKCS12 -importcert -file inter-root.pem -keypass trustpass -storepass trustpass -alias nativemtls -noprompt

Приложение 2: Альтернативные настройки цепочки сертификатов

Хотя в этой статье рекомендуется определённая схема цепочки сертификатов , обеспечивающая баланс между безопасностью и простотой использования, существуют альтернативные варианты, описанные ниже. Большинство общих принципов применимы и к другим методологиям, например:

  1. Наличие прямых листовых ключей и сертификатов для каждого узла Cassandra или клиентского приложения (без подписи корневых или промежуточных сертификатов). Это, вероятно, усложнит ротацию сертификатов.
  2. Наличие нескольких корневых и промежуточных наборов сертификатов для различных вариантов использования . Например, узлы Cassandra имеют один набор корневых/промежуточных сертификатов, с помощью которого подписываются все конечные сертификаты Cassandra. Аналогично, все клиентские приложения могут иметь один отдельный корневой/промежуточный набор для подписи конечных сертификатов приложений. Такие конфигурации жизнеспособны, но требуют добавления цепочки корневых/промежуточных сертификатов в соответствующее хранилище доверенных сертификатов. В этом примере хранилища доверенных сертификатов Cassandra должны содержать корневые/промежуточные сертификаты клиента, а клиентские приложения должны иметь корневую/промежуточную цепочку узлов Cassandra в своих хранилищах доверенных сертификатов.
  3. Аналогично вышеизложенному, вы можете иметь несколько наборов корневых и промежуточных сертификатов для разных регионов , но все клиенты во всех регионах и все серверы во всех регионах должны быть осведомлены обо всех корневых и промежуточных цепочках, добавив их все в настроенное хранилище доверенных сертификатов.