Шифрование клиентского трафика с помощью TLS#

Для работы с кластером CedrusData клиент должен подключиться к узлу-координатору. По умолчанию аутентификация клиентов и шифрование трафика между клиентом и координатором отключены. Любой пользователь может подключиться к координатору по протоколу HTTP, используя JDBC драйвер, Trino CLI или Web UI. Это удобно для тестирования и разработки, но редко подходит для промышленных развертываний.

Данная статья описывает процесс настройки шифрования трафика между клиентскими приложениями и координатором CedrusData с помощью TLS. Шифрование является обязательным условием для включения аутентификации.

Поддерживаемые стандарты#

CedrusData поддерживает сертификаты TLS 1.2 и TLS 1.3. Сертификаты TLS 1.1, TLS 1.0 и SSL не поддерживаются.

По умолчанию CedrusData выбирает алгоритм шифрования из списка поддерживаемых алгоритмов текущей JVM, исключая те алгоритмы, который не поддерживают forward secrecy (FS).

Вы можете получить список поддерживаемых алгоритмов шифрования текущей JVM с помощью следующей команды:

echo "java.util.Arrays.asList(((javax.net.ssl.SSLServerSocketFactory) \
javax.net.ssl.SSLServerSocketFactory.getDefault()).getSupportedCipherSuites()).forEach(System.out::println)" | jshell -

Вы можете изменить список поддерживаемых алгоритмов шифрования с помощью параметра конфигурации http-server.https.included-cipher в файле config.properties. Значением данного параметра являются имена алгоритмов шифрования, разделенные запятой, в порядке уменьшения приоритета. Например:

http-server.https.included-cipher=TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA256

По умолчанию CedrusData не разрешает использование алгоритмов шифрования, которые не используют forward secrecy. Если вы хотите использовать такой алгоритм, необходимо дополнительно установить параметр конфигурации http-server.https.excluded-cipher в пустое значение:

http-server.https.included-cipher=TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA256
http-server.https.excluded-cipher=

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

Способы организации шифрования#

Существует два способа конфигурации шифрования клиентских подключений к CedrusData.

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

  • С использованием балансировщика нагрузки или прокси-сервера. В данном случае клиент CedrusData подключается к балансировщику нагрузки или прокси-северу с использованием TLS/HTTPS, после чего последний перенаправляет запрос к CedrusData по протоколу HTTP (TLS termination). Данный способ является предпочтительным и более простым в конфигурации.

Шифрование с помощью сертификатов#

Вы можете использовать сертификаты для шифрования трафика между клиентами и кластером CedrusData. Для этого вам необходимо получить TLS сертификат и установить его на координаторе CedrusData.

Получение сертификата#

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

  • Доверенный сертификат - сертификат, которому автоматически доверяют все клиентские приложения. Для получения доверенного сертификата необходимо обратиться к производителю доверенных сертификатов. Таким производителем могут быть:

    • Коммерческие компании (SSL Certificate providers), например DigiCert или Comodo.

    • Компании, которые предоставляют бесплатные доверенные сертификаты, например letsencrypt.org.

    • Регистраторы доменных имен, например GoDaddy.

    • Облачные провайдеры.

  • Корпоративный сертификат - сертификат, которому доверяют браузеры и клиентские приложения вашей организации. Обычно за выпуск таких сертификатов отвечает IT-отдел организации, который поддерживает собственное хранилище доверенных сертификатов и обеспечивает конфигурацию клиентских приложений таким образом, чтобы они доверяли сертификатам из хранилища.

  • Сгенерированный self-signed сертификат - сертификат, который самостоятельно сгенерирован с помощью приложений типа openssl, keytool или certtool. Такие сертификаты не являются доверенными по умолчанию для других приложений, что обусловливает необходимость дополнительной конфигурации клиентских приложений (например, JDBC драйвер, Trino CLI, Web UI браузер) для работы с такими сертификатами. Раздел Проверка работоспособности содержит описание дополнительных параметров для подключения к координатору CedrusData, который использует self-signed сертификат.

Поддерживаемые сертификаты#

CedrusData поддерживает сертификаты и приватные ключи PKCS #1 и PKCS #8 в формате PEM, PKCS #12, а также ключи в формате Java KeyStore (JKS). Сертификаты и приватные ключи в бинарном формате (например, DER) должны быть предварительно преобразованы в один из поддерживаемых форматов.

Проверка сертификатов#

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

Установка сертификата#

Сертификат должен быть установлен на координаторе CedrusData. Убедитесь, что файл сертификата доступен для чтения координатором. Мы рекомендуем убедиться, что доступ к файлу ограничен минимально возможным количеством пользователей и групп, чтобы минимизировать риск похищения или подмены сертификата.

Конфигурация координатора#

Добавьте следующие параметры в файл конфигурации координатора config.properties, чтобы включить поддержку TLS:

http-server.https.enabled=true
http-server.https.port=8443
http-server.https.keystore.path=etc/clustercoord.pem

Параметр http-server.https.enabled включает поддержку HTTPS.

Параметр http-server.https.port задает HTTPS порт координатора; вы можете использовать любой доступный порт.

Параметр http-server.https.keystore.path задает путь к файлу с сертификатом. Данный путь может быть как абсолютным, так и относительным. В последнем случае путь будет разрешен относительно корневой директории распакованного архива CedrusData.

Если для сертификата установлен пароль (обязателен для JKS, не поддерживается для PEM), укажите его в параметре конфигурации http-server.https.keystore.key:

http-server.https.keystore.key=<keystore-password>

Если запись сертификата внутри JKS keystore имеет собственный пароль, укажите ее в параметре конфигурации http-server.https.keymanager.password:

http-server.https.keymanager.password=<key-password>

Включение HTTPS не отключает доступ по HTTP автоматически. Чтобы запретить клиентам подключаться к координатору по HTTP (включая Web UI), установите следующий параметр конфигурации:

http-server.authentication.allow-insecure-over-http=false

Проверка работоспособности#

  • Подключитесь к координатору с помощью Web UI, используя протокол HTTPS и порт, указанный в конфигурации. Например: https://trino.example.com:8443. Если аутентификация отключена, введите произвольное имя пользователя (ввод пароля будет недоступен). Если аутентификация включена, введите корректные имя пользователя и пароль. Если вы используете self-signed сертификат, который не может быть проверен браузером, вы получите сообщение об ошибке при открытии страницы. В большинстве браузеров страница об ошибке будет содержать ссылку или кнопку, которая позволит отобразить страницу после получения от вас подтверждения, что вы понимаете риски.

  • Подключитесь к координатору с помощью Trino CLI, используя протокол HTTPS. Например: https://trino.example.com:8443. Если вы используете self-signed сертификат, который не может быть проверен Java-процессом Trino CLI, добавьте опцию --insecure. Никогда не используйте данный флаг в промышленном окружении.

    bin/trino --server https://trino.example.com:8443
    bin/trino --server https://trino.example.com:8443 --insecure
    

    Запустите тестовый запрос:

    trino> SELECT COUNT(*) FROM tpch.tiny.nation;
    
    trino
    -------
    25
    (1 row)
    
  • Подключитесь к координатору с помощью JDBC драйвера Для этого укажите в строке подключения HTTPS порт, указанный в конфигурации выше. Кроме того, необходимо добавить параметр SSL=true. Если вы используете self-signed сертификат, который не может быть проверен текущим процессом Java, добавьте параметр SSLVerification=NONE. Никогда не используйте данный параметр со значением NONE в промышленном окружении.

    jdbc:trino://trino.example.com:8443?SSL=true
    jdbc:trino://trino.example.com:8443?SSL=true&SSLVerification=NONE
    

Использование TLS termination proxy#

Ваша организация может иметь балансировщик нагрузки или proxy-сервер, который уже обеспечивает шифрование трафика клиентских подключений. В таком случае вы можете попросить ваших администраторов настроить балансировщик или proxy-сервер таким образом, чтобы он подключался к координатору CedrusData по протоколу HTTP, добавляя специальный forwarded заголовок к HTTP-запросам к CedrusData, например X-Forwarded-Proto: https. Данный заголовок указывает координатору CedrusData, что клиент подключился к балансировщику или proxy-серверу по протоколу HTTPS, и должный уровень безопасности уже обеспечен.

В таком случае конфигурация TLS сертификатов на координаторе CedrusData не требуется. Вместо этого необходимо включить параметр конфигурации http-server.process-forwarded в файле config.properties, чтобы координатор учитывал forwarded заголовок от балансировщика или proxy-сервера:

http-server.process-forwarded=true

Других параметров конфигурации не требуется.