Обзор kTLS

Содержание

Обзор

Kernel TLS (kTLS) — реализация протокола TLS, основанная на переносе части операций, в том числе шифрования и дешифрования, на уровень ядра Linux, что уменьшает нагрузку на процессор и улучшает производительность.

В Kafka поддержка kTLS осуществляется начиная с версии ADS 3.9.0.1.b1.

Ниже описано, как осуществляется взаимодействие потребителя и брокера Kafka при использовании традиционного протокола TLS и при использовании протокола kTLS.

Основные понятия, используемые для описания:

  • Transport layer security (TLS) — криптографический протокол, обеспечивающий безопасную передачу данных по сети при обмене данными между двумя приложениями. Является усовершенствованной версией протокола secure sockets layer (SSL).

  • Пространство ядра (kernel space) — область памяти, зарезервированная для ядра операционной системы, его расширений и драйверов устройств.

  • Пользовательское пространство (user space) — адресное пространство виртуальной памяти операционной системы, предназначенное для пользовательских программ, отделенное от пространства ядра для обеспечения безопасности и стабильности системы.

  • TLS-рукопожатие (TLS handshake) — взаимодействие клиента и сервера при подключении. При рукопожатии происходит определение используемой версии TLS, используемых шифров, обмен ключами и проверка подписей центра сертификации SSL, генерация сеансовых ключей для использования симметричного шифрования.

  • Сетевая интерфейсная карта (Network Interface Controller, NIC) — аппаратное устройство для взаимодействия с сетью.

  • Буфер сетевой карты (NIC buffer) — область памяти, используемая сетевой картой для временного хранения данных при приеме и передаче.

  • Сокет (socket) — абстракция в Linux для обмена данными между процессами или устройствами. В ядре Linux сокеты реализованы как структуры данных, позволяющие системе обрабатывать сетевые операции, не обращаясь напрямую к аппаратным деталям.

  • Файловый дескриптор — натуральное число (идентификатор), закрепленное за определенным потоком ввода-вывода.

Kafka и TLS

Kafka и традиционный TLS
Kafka и традиционный TLS
Kafka и традиционный TLS
Kafka и традиционный TLS

При установке соединения клиента (потребителя) и брокера Kafka после осуществления TLS-рукопожатия приложение в пользовательском пространстве производит системный вызов read. При этом в ядро передается файловый дескриптор, указатель на буфер приложения и другие данные для чтения. Данные копируются через буфер ядра в буфер приложения, шифруются (в пользовательском пространстве) и, используя системный вызов write, записываются в буфер сетевой карты (в пространстве ядра), передавая дескриптор файла, указатель на буфер данных и количество байтов для записи, и отправляются потребителю.

Недостатки работы Kafka c традиционным TLS:

  • Каждый пакет данных копируется дважды между ядром и пользовательским пространством, что вызывает задержки из-за дополнительных операций и переключений между ядром и пользовательским пространством.

  • Высокая нагрузка на процессор из-за выполнения шифрования в программном режиме.

Kafka и kTLS

Kafka и kTLS
Kafka и kTLS
Kafka и kTLS
Kafka и kTLS

При установке соединения клиента (потребителя) и брокера Kafka после осуществления TLS-рукопожатия (рукопожатие по-прежнему выполняется в пользовательском пространстве) приложение производит системный вызов sendfile, который копирует данные между двумя файловыми дескрипторами, то есть данные копируются непосредственно из кеша ядра в сетевой буфер.

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

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

Преимущества:

  • Обеспечение принципа нулевого копирования (zero-copy) — системный вызов sendfile копирует данные между одним дескриптором файла и другим сразу внутри ядра вместо комбинации вызовов read и write, которые выполняют передачу данных в пользовательское пространство и чтение из него. Это снижает нагрузку на процессор и повышает производительность и эффективность, что имеет особенное значение при передаче большого объема данных.

  • Снижение нагрузки на процессор за счет переноса операций шифрования/дешифрования в ядро.

  • Улучшенная пропускная способность и уменьшенная задержка при передаче данных по защищенным каналам.

  • Прозрачная интеграция с существующими TLS-библиотеками (например, OpenSSL) через API ядра.

ВАЖНО

Для поддержки kTLS требуется ядро ​​операционной системы версии 5.9 и выше. По умолчанию режим kTLS включен. Но если версия ядра ниже требуемой, то произойдет откат в обычный режим.

Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней