Как настроить встроенный mTLS Cassandra

Введение

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

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

Встроенная функция mTLS

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

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

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

Как правило, при двустороннем TLS сертификаты сервера и клиента, цепочки сертификатов, хранилища ключей и доверенных сертификатов можно создавать разными способами. То же самое относится к Cassandra и встроенному mTLS клиента. Учитывая, как организации обычно управляют кластерами Edge для 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. edge-management-server
    2. edge-message-processor
    3. edge-router

Ниже приведены подробные инструкции.

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

Получите корневой сертификат и пару промежуточных ключей/сертификатов, подписанных корневым сертификатом. Используйте корневой и промежуточный сертификаты, подписанные центром сертификации вашей организации, или создайте самозаверяющие сертификаты. Сохраните цепочку корневых и промежуточных сертификатов в хранилище доверенных сертификатов. Полезные команды приведены в Приложении 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
    

    Убедитесь, что файл принадлежит пользователю 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:

  • edge-management-server
  • edge-message-processor
  • edge-router

  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 настроен правильно, найдите в системном журнале клиентского приложения строки, похожие на следующие:

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

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

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

Как настроить принудительное использование mTLS

Если mTLS не применяется в Cassandra, 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 во всех узлах следующих клиентских приложений по очереди:
    • edge-management-server
    • edge-message-processor
    • edge-router
    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 по очереди.

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

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

Выполните действия, аналогичные описанным в разделе Как настроить клиентские приложения:

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

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

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

Общие операции 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. Как и в предыдущем случае, вы можете использовать несколько наборов корневых и промежуточных сертификатов для разных регионов, но все клиенты и серверы во всех регионах должны быть осведомлены обо всех корневых и промежуточных цепочках. Для этого добавьте их в настроенное хранилище доверенных сертификатов.