Шифрование в нативном протоколе YTsaurus

YTsaurus поддерживает шифрование внутреннего трафика между компонентами кластера с использованием TLS. В документе описана архитектура шифрования и инструкции по настройке для различных сценариев развёртывания.

Обзор

Все компоненты кластера YTsaurus — мастера, узлы данных, прокси и планировщики — общаются между собой по внутреннему нативному RPC-протоколу. По умолчанию данные передаются в открытом виде, что подходит для доверённых сетей. Если вы работаете в публичной сети или требуется защита конфиденциальных данных, используйте шифрование трафика.

YTsaurus поддерживает два режима защиты соединений:

Механизм ротации сертификатов позволяет обновлять их без остановки сервисов. При развёртывании в Kubernetes можно использовать cert-manager для автоматического управления сертификатами.

Примечание

Возможность шифрования в нативном протоколе доступна начиная с версии YTsaurus 25.2.

Архитектура шифрования

Чтобы правильно настроить шифрование, важно понимать, как устроено взаимодействие компонентов в кластере YTsaurus. Ниже рассмотрена архитектура транспортного уровня и процесс установки защищённого соединения.

Что такое уровень bus

bus — это транспортный уровень YTsaurus, который обеспечивает передачу сообщений между компонентами: планировщиком, прокси, дата-нодами и т.д. bus работает с сообщениями, что позволяет чётко определять их размер, в отличие от обычного TCP, который работает с потоком байт.

Над уровнем bus работает RPC-слой, который собирает из переданных байт protobuf-сообщения, а под уровнем bus находится TCP для сетевой передачи данных. Bus-слой точно знает размер каждого сообщения и дожидается получения всех байт перед передачей наверх.

На схеме ниже показано взаимодействие компонентов кластера YTsaurus между собой и с внешними клиентами. Шифрование трафика настраивается и происходит исключительно внутри кластера — между его компонентами (например, HTTP Proxy, Master Server, Data Nodes). Тип внешнего клиента не влияет на шифрование: это может быть обычный HTTP-клиент, CHYT, SPYT или любой другой сервис. Полный список компонентов, поддерживающих шифрование, см. в разделе Компоненты для настройки.

HTTP запрос YTsaurus кластер Внешний клиент HTTP Proxy bus_client точка входа для HTTP API Master Server bus_client + bus_server хранит метаданные Data Nodes bus_client + bus_server хранят данные bus_client ↔ bus_server bus_client ↔ bus_server bus_client ↔ bus_server

Каждый компонент (мастер, планировщик, дата-нода и др.) выступает одновременно в двух ролях:

  • bus_client — инициирует исходящие соединения к другим компонентам.
  • bus_server — принимает входящие соединения от других компонентов.

Например, когда HTTP Proxy запрашивает данные у Master Server:

  • HTTP Proxy выступает как bus_client (инициатор соединения)
  • Master Server выступает как bus_server (принимающая сторона)

При этом тот же Master Server может одновременно выступать как bus_client при обращении к другим компонентам кластера.

Процесс установки защищённого соединения

Установка шифрованного соединения между компонентами происходит в несколько этапов:

  1. Установка TCP соединения — клиент и сервер устанавливают обычное TCP соединение;
  2. Обмен рукопожатиями (Handshake) — клиент отправляет свой Handshake серверу, затем сервер отправляет свой Handshake клиенту;
  3. Решение о шифровании — каждая сторона узнает из Handshake противоположной стороны, нужно ли устанавливать SSL соединение;
  4. Обмен SslAck — если шифрование требуется, клиент и сервер обмениваются пакетами SslAck фиксированного размера;
  5. Переключение в SSL режим — после обмена SslAck стороны переключаются на использование SSL библиотеки.

Handshake — это protobuf-сообщение, которым обмениваются компоненты сразу после установки TCP-соединения. Оно содержит:

  • encryption_mode — требования к шифрованию (disabled/optional/required)
  • verification_mode — требования к проверке сертификатов (none/ca/full)

Ключевые особенности Handshake:

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

Принятие решения о шифровании

Каждая компонента принимает решение о шифровании на основе:

  • своей конфигурации (encryption_mode, verification_mode);
  • конфигурации противоположной стороны (из Handshake).

Если хотя бы одна сторона настроена на required, а другая на disabled, соединение не будет установлено.

Как включить шифрование

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

Параметры конфигурации

Шифрование настраивается через параметры bus_client и bus_server в конфигурации каждого компонента:

Параметр

Описание

encryption_mode

Режим шифрования:

  • disabled — шифрование отключено. Если другая сторона требует шифрование (required), соединение не будет установлено;
  • optional — шифрование по запросу. Соединение будет с шифрованием, если у другой стороны режим required;
  • required — обязательное шифрование. Если у другой стороны режим disabled, соединение завершится ошибкой.

verification_mode

Режим проверки сертификатов:

  • none — аутентификация другой стороны не выполняется;
  • ca — другая сторона аутентифицируется по CA файлу (проверяется, что сертификат подписан доверённым CA);
  • full — другая сторона аутентифицируется по CA и по соответствию сертификата имени хоста (самый строгий режим).

cipher_list

Набор шифров через двоеточие. Пример: "AES128-GCM-SHA256:PSK-AES128-GCM-SHA256"

ca

CA сертификат или путь к файлу. Пример: { "file_name" = "/etc/yt/certs/ca.pem" }

cert_chain

Сертификат или путь к файлу. Пример: { "file_name" = "/etc/yt/certs/cert.pem" }

private_key

Приватный ключ или путь к файлу. Пример: { "file_name" = "/etc/yt/certs/key.pem" }

load_certs_from_bus_certs_directory

Загружать сертификаты из директории с bus сертификатами. При значении true параметры ca, cert_chain, private_key интерпретируются как имена файлов, а не пути. Удобно для внешних кластеров.

Совместимость режимов шифрования

При установке соединения результат зависит от комбинации режимов в настройках параметра encryption_mode для bus_client и bus_server:

Клиент

Сервер

Результат

disabled

disabled

Соединение без шифрования

disabled

optional

Соединение без шифрования

disabled

required

Ошибка соединения

optional

disabled

Соединение без шифрования

optional

optional

Соединение без шифрования

optional

required

Соединение с шифрованием

required

disabled

Ошибка соединения

required

optional

Соединение с шифрованием

required

required

Соединение с шифрованием

Компоненты для настройки

Шифрование можно настроить для следующих компонентов кластера:

  • controller_agent
  • data_node
  • discovery
  • exec_node
  • master
  • master_cache
  • proxy
  • rpc_proxy
  • scheduler
  • tablet_node
  • timestamp_provider
  • clock_provider
  • qt
  • yql_agent

Так же шифрование можно настроить и с внешними компонентами кластера, такими как SPYT и CHYT.

Примечание

Для работы с TLS в CHYT требуется:

  • CHYT версии не ниже 2.17

  • Strawberry версии не ниже 0.0.14

Интеграция с CHYT

В отличие от других компонентов, CHYT запускается внутри vanilla-операции YTsaurus, поэтому сертификаты передаются особым образом:

  • Strawberry читает сертификаты из файлов, указанных в её конфигурации.
  • Конфигурация cluster-connection с параметрами bus_client/bus_server берётся из Кипариса для определения режима шифрования и параметров подключения к компонентам кластера.
  • Все настройки безопасности, включая сертификаты и параметры шифрования, передаются в операцию через механизм secure_vault.
  • При изменении сертификатов Strawberry вычисляет хеш новых данных и, обнаружив изменения, автоматически перезапускает операцию для применения обновлённых настроек.

Механизм secure_vault позволяет безопасно передать в операции сертификаты и ключи, но при этом он не отображает их в открытом виде. Конфигурация cluster-connection содержит все необходимые настройки для установки защищённых соединений между CHYT и другими компонентами кластера, включая режимы шифрования (encryption_mode) и проверки сертификатов (verification_mode).

Примеры конфигураций

Ниже показаны примеры — как настроить TLS с разным уровнем безопасности. Эти конфигурации используются в файлах настроек компонентов YTsaurus — подробнее о том, как их применять, читайте в разделе параметры конфигурации.

Взаимная проверка сертификатов (mTLS)

Конфигурация для максимального уровня безопасности с проверкой сертификатов обеих сторон:

Пример конфигурации mTLS
# Клиентская часть
bus_client:
  encryption_mode: required
  verification_mode: full
  ca:
    file_name: /etc/yt/certs/ca.pem
  cert_chain:
    file_name: /etc/yt/certs/client.pem
  private_key:
    file_name: /etc/yt/certs/client.key

# Серверная часть
bus_server:
  encryption_mode: required
  verification_mode: full
  ca:
    file_name: /etc/yt/certs/ca.pem
  cert_chain:
    file_name: /etc/yt/certs/server.pem
  private_key:
    file_name: /etc/yt/certs/server.key

Одностороннее шифрование

Конфигурация, где только клиент проверяет сертификат сервера:

Пример односторонней проверки
# Клиентская часть
bus_client:
  encryption_mode: required
  verification_mode: ca
  ca:
    file_name: /etc/yt/certs/ca.pem

# Серверная часть
bus_server:
  encryption_mode: required
  verification_mode: none
  cert_chain:
    file_name: /etc/yt/certs/server.pem
  private_key:
    file_name: /etc/yt/certs/server.key

Сценарии настройки

Способ настройки шифрования зависит от того, как развёрнут ваш кластер YTsaurus. Ниже приведены инструкции для основных сценариев развёртывания.

K8s с оператором
  • K8s с оператором
  • Ручное развёртывание
  • Внешние кластеры

Производительность

Шифрование увеличивает нагрузку на CPU и может незначительно снизить производительность. По результатам тестирования:

  • нагрузка на CPU увеличивается на 5-15% в зависимости от типа операций;
  • пропускная способность снижается на 3-10%;
  • задержка увеличивается на 1-5 мс.

Защищённое хранилище секретов операции.