Сквозное шифрование на уровне полей для Apache Kafka Connect с библиотекой Kryptonite

Kryptonite for kafka, Kafka Connect шифрование, Apache Kafka безопасность, Kafka для разработчиков и дата-инженеров, шифрование Kafka шифрование сообщений в Kafka, обучение Apache Kafka, Apache Kafka для дата-инженеров и разработчиков, курсы по Apache Kafka, Apache Kafka разработчик примеры курсы обучение, Школа Больших Данных Учебный центр Коммерсант

О важности шифрования чувствительных данных, публикуемых в Apache Kafka, мы недавно писали здесь и здесь. В продолжение этой темы сегодня познакомимся с Kryptonite – open-source библиотекой для сквозного шифрования на уровне полей для Apache Kafka Connect.

Шифрование данных вне брокеров Apache Kafka: зачем это нужно

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

Устранить этот риск поможет библиотека Kryptonite, которая закрывает лазейку в памяти и позволяет шифровать определенные поля полезной нагрузки. Эта клиентская библиотека шифрования для Apache Kafka поддерживает простые преобразования сообщений (SMT, Simple Message Transformation) в Kafka Connect, пользовательские функции ksqlDB и автономную службу HTTP API. Важно отметить, что Kryptonite не является официальным компонентом платформы потоковой передачи событий, а представляет собой проект сообщества с открытым исходным кодом.

Пока библиотека Kryptonite предполагает три основных сценария использования:

  • интеграция данных с помощью Kafka Connect посредством готового SMT-преобразования для шифрования и дешифрования выбранных полей записей с поддержкой схемы данных или без нее;
  • потоковая обработка сообщений с ksqlDB путем предоставления пользовательских UDF-функций для шифрования/дешифрования выбранных столбцов данных в STREAM и TABLE;
  • кросс-языковые сценарии выполнения с сервисом Quarkus Funqy, предоставляющим облегченный переносимый Java веб-API для шифрования/дешифрования полезных данных или их полей из любого клиентского приложения, использующего HTTP-протокол. Это позволяет писать бессерверные функции и разворачивать их в FAAS-средах, таких как AWS Lambda , Azure Functions, Google Cloud Functions и Kubernetes Knative, а также использовать их как отдельный сервис.

Сперва рассмотрим сценарий интеграции данных с Kafka Connect. Предположим, надо зашифровать определенное подмножество конфиденциальных полей, обнаруженных в полезной нагрузке ConnectRecord, полученной из любого источника данных.

Как мы уже разбирали здесь, расшифровать данные надо на стороне потребителя, т.е. выполнить операцию дешифровки ранее зашифрованных полей в полезной нагрузке ConnectRecord, направляемой в приемник данных. Чтобы гарантировать, что сами брокеры Kafka не увидят исходный открытый текст конфиденциальных полей данных, шифрование и дешифрование должны происходить вне брокеров.

Шифрование и дешифрование
Шифрование и дешифрование чувствительных данных

Как работает библиотека Kryptonite

Шифрование может происходить непосредственно в исходном клиенте или в каком-то промежуточном процессе, таком как вспомогательный сервер или прокси-сервер, но это все равно накладывает дополнительную нагрузку на брокер. Чтобы избежать этого, библиотека Kryptonite выполняет шифрование и дешифрование во время интеграции Kafka Connect. Рабочие узлы кластера Kafka Connect шифруют поля, обозначенные как конфиденциальные внутри экземпляров ConnectRecord.

Для этого библиотека предоставляет готовое SMT-преобразование, позволяющее применять шифрование и дешифрование на уровне полей к записям Kafka Connect не зависимо от типа сериализации сообщений. Проект использует аутентифицированное шифрование со связанными данными (AEAD) и применяет алгоритм AES в режиме GCM или SIV.

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

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

Таким образом, настраиваемый CipherFieldSMT можно подключить к произвольным конвейерам Kafka Connect, защищая конфиденциальные данные от любой формы неконтролируемого или незаконного доступа на пути к данным через брокеры Kafka и обратно.

Шифрование и дешифрование данных в Kafka Connect с Kryptonite
Шифрование и дешифрование данных в Kafka Connect с Kryptonite

Библиотека Kryptonite использует шифрование с проверкой подлинности со связанными данными (AEAD), по умолчанию применяя алгоритм AES на основе реализации Tink в режиме GCM для вероятностного шифрования или в режиме SIV для детерминистического шифрования (DAEAD). Это означает, что помимо зашифрованного текста зашифрованное поле дополнительно содержит незашифрованные, но проверенные метаданные. Чтобы сохранить накладные расходы на хранение зашифрованного поля относительно низкими, реализация в настоящее время включает только идентификатор версии самого Kryptonite вместе с коротким идентификатором, представляющим алгоритм, а также идентификатор набора ключей, который использовался для шифрования рассматриваемого поля.

Каждое применение AEAD в вероятностном режиме к определенному полю записи приводит к получению разных зашифрованных текстов для одного и того же открытого текста. Это усложняет атаки, но может усложнить создание клиентов Kafka, в частности, sink-коннекторов. Применение Kryptonite с использованием AEAD в вероятностном режиме к ключу исходной записи приведет к перепутыванию разделов, поскольку записи с одним и тем же исходным открытым текстовым ключом окажутся в разных разделах топика. Поэтому при использовании Kryptonite для ключей исходной записи, надо настроить его на применение детерминированного шифрования DAEAD, т.е. AES в режиме SIV. Это безопасно поддерживает шифрование ключей записи и сохраняет нетронутым разделение топика и порядок записей.

Благодаря подходу, реализованному в библиотеке Kryptonite, конфиденциальные поля автоматически и всегда защищаются не только при передаче, но и в состоянии покоя, когда они находятся за пределами среды Kafka Connect. Защита гарантирована для всех целевых систем и для всех последующих потребителей, которые в конечном итоге получат доступ к данным. При наличии доступа к брокерам утечка чувствительных данных возможна только, если злоумышленник украл секретные ключи из удаленных клиентских сред или взломал криптографическую систему.

Можно даже защитить сквозные конвейеры сбора данных об изменениях между разнородными базами данных путем явной защиты конфиденциальных полей полезной нагрузки CDC (Change Data Capture). Правильная настройка пользовательского SMT достаточна для обеспечения шифрования и дешифрования на уровне полей на стороне клиента записей Kafka Connect при их входе и выходе из топиков Kafka. 

Таким образом, Kryptonite for Kafka предлагает дополнительный уровень безопасности данных независимо от того, кто владеет или управляет кластером Kafka, защищая данные от внутренних злоумышленников. Шифрование также защищает данные от внешних злоумышленников, которые могут получить мошеннический доступ к данным топика Kafka в будущем. Кроме того, эта библиотека позволяет дата-инженеру точно определить, какие последующие потребители могут читать поля конфиденциальных данных. В конвейере интеграции данных только коннекторы-приемники Kafka Connect, которым явно предоставлен доступ к секретным ключам, могут успешно расшифровать защищенные части данных.

Освойте администрирование и эксплуатацию Apache Kafka для потоковой аналитики больших данных на специализированных курсах в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:

Я даю свое согласие на обработку персональных данных и соглашаюсь с политикой конфиденциальности.

Источники

  1. https://developers.redhat.com/articles/2022/09/27/end-end-field-level-encryption-apache-kafka-connect
  2. https://github.com/hpgrahsl/kryptonite-for-kafka
Поиск по сайту