Сквозное шифрование данных#
Сквозное шифрование данных — шифрование чувствительных данных на стороне Производителя и их расшифровка на потребителе.
Apache Kafka часто используется для обмена данными между несколькими системами внутри организации. Однако даже при работе во внутреннем контуре некоторые данные являются очень чувствительными к утечке. Например, персональные данные клиентов или сотрудников. Поэтому их следует защищать от несанкционированного доступа. Простым, но довольно эффективным способом защиты чувствительных данных является сквозное шифрование полезной нагрузки.
Сквозное шифрование может быть:
симметричным — для шифрования и расшифровки используется один ключ;
ассиметричным — используются два ключа: один для шифрования, второй для расшифровки.
Подробное описание конфигурирования поставщика и потребителя для сквозного шифрования приведено ниже.
Симметричное шифрование#
Используется механизм шифрования данных перед записью в топик и последующая расшифровка при чтении. Шифрование и расшифровка сообщения производится с помощью секретного ключа и генератора соли.
Данные шифруются и расшифровываются на стороне клиента, поэтому механизм не зависит от настройки соединения с брокерами.
Механизм шифрования может быть применен как к ключу, так и к значению сообщения. Для использования необходимо сконфигурировать поставщика и потребителя.
Конфигурация на стороне поставщика#
Поставщик конфигурируется следующими параметрами:
Наименование |
Определение |
Тип значения |
Значение |
|---|---|---|---|
|
Полное имя класса сериализатора ключа |
String |
ru.sbrf.kafka.serialization.EncryptedByteArraySerializer |
|
Полное имя класса сериализатора значения |
String |
ru.sbrf.kafka.serialization.EncryptedByteArraySerializer |
|
Ключ шифрования, секретная фраза |
String |
Задается пользователем |
|
Encoder. Основная логика по шифрованию описывается в этом классе. Данный класс должен реализовывать интерфейс ru.sbt.kafkase.security.Encoder |
String |
Задается пользователем. Для теста можно использовать реализацию из Corax: ru.sbrf.kafka.security.SimpleDataEncoder |
|
Соль провайдер. Класс для генерации соли, смешиваемой с данными и ключом шифрования для последующего шифрования данных. Данный класс должен реализовывать интерфейс ru.sbt.kafkase.security.SaltProvider |
String |
Задается пользователем. Для теста можно использовать реализацию из Corax: ru.sbrf.kafka.security.FileSaltProvider |
|
Путь к файлу с солью. Если используется реализация соль провайдера KafkaSberEdition: ru.sbrf.kafka.security.FileSaltProvider |
String |
Задается пользователем. Соль должна быть не менее 16 байт (16 символов) |
Конфигурация на стороне потребителя#
Потребитель конфигурируется следующими параметрами:
Наименование |
Определение |
Тип значения |
Значение |
|---|---|---|---|
|
Полное имя класса сериализатора ключа |
String |
ru.sbrf.kafka.serialization.EncryptedByteArrayDeserializer |
|
Полное имя класса сериализатора значения |
String |
ru.sbrf.kafka.serialization.EncryptedByteArrayDeserializer |
|
Ключ шифрования, секретная фраза |
String |
Задается пользователем |
|
Decoder. Основная логика по расшифровки описывается в этом классе. Данный класс должен реализовывать интерфейс ru.sbt.kafkase.security.Decoder |
String |
Задается пользователем. Для теста можно использовать реализацию из Corax: ru.sbrf.kafka.security.SimpleDataDecoder |
|
Соль провайдер. Класс для генерации соли, смешиваемой с данными и ключом шифрования для последующего шифрования данных. Данный класс должен реализовывать интерфейс ru.sbt.kafkase.security.SaltProvider |
String |
Задается пользователем. Для теста можно использовать реализацию из Corax: ru.sbrf.kafka.security.FileSaltProvider |
|
Путь к файлу с солью. Если используется реализация соль провайдера KafkaSberEdition: ru.sbrf.kafka.security.FileSaltProvider |
String |
Задается пользователем. Соль должна быть не менее 16 байт (16 символов) |
Внимание!
Для успешной расшифровки данных, полученных потребителем, необходимо, чтобы соль и секретный ключ потребителя совпадали с солью и секретным ключом поставщика.
Примеры конфигурации#
Пример producer.config
value.serializer=ru.sbrf.kafka.serialization.EncryptedByteArraySerializer
key.serializer=ru.sbrf.kafka.serialization.EncryptedByteArraySerializer
e2e.serializer.encryption.secret.key=secret
e2e.serializer.encryption.salt.provider.class=ru.sbrf.kafka.security.FileSaltProvider
e2e.serializer.encryption.class=ru.sbrf.kafka.security.SimpleDataEncoder
e2e.serializer.encryption.security.encoding.salt.location=config/salt.txt
Пример consumer.config
value.deserializer=ru.sbrf.kafka.serialization.EncryptedByteArrayDeserializer
key.deserializer=ru.sbrf.kafka.serialization.EncryptedByteArrayDeserializer
e2e.deserializer.encryption.secret.key=secret
e2e.deserializer.encryption.salt.provider.class=ru.sbrf.kafka.security.FileSaltProvider
e2e.deserializer.encryption.class=ru.sbrf.kafka.security.SimpleDataDecoder
e2e.deserializer.encryption.security.encoding.salt.location=config/salt.txt
Асимметричное шифрование#
Используется механизм шифрования данных перед записью в топик и последующая расшифровка при чтении. Для шифрования используется публичный ключ получателя, занесенный в хранилище доверенных сертификатов, для расшифровки используется приватный ключ получателя из хранилища ключей.
Данные шифруются и расшифровываются на стороне клиента, поэтому механизм не зависит от настройки соединения с брокерами.
Механизм шифрования может быть применен как к ключу, так и к значению сообщения. Для использования необходимо сконфигурировать поставщика и потребителя.
Конфигурирование поставщика и потребителя, работающих с шифрованием, возможно только путем редактирования кода. Properties - класс в java, с помощью которого происходит конфигурирование.
Для поставщика и потребителя используется один из алгоритмов шифрования/расшифровки RSA/ECB/PKCS1Padding.
Конфигурация на стороне поставщика#
Поставщик конфигурируется следующими параметрами:
Наименование |
Определение |
Обязательный параметр |
Тип значения |
Значение по умолчанию |
Значение для включения шифрования |
|---|---|---|---|---|---|
|
Полное имя класса сериализатора ключа |
Да |
String |
- |
ru.sbrf.kafka.serialization.EncryptedCertByteArraySerializer |
|
Полное имя класса сериализатора значения |
Да |
String |
- |
ru.sbrf.kafka.serialization.EncryptedCertByteArraySerializer |
|
Путь к хранилищу ключей |
Да |
String |
- |
Путь к файлу |
|
Тип хранилища ключей |
Нет |
String |
JKS |
JKS |
|
Пароль от хранилища ключей |
Да |
Экземпляр класса org.apache.kafka.common.config.types.Password |
- |
new Password (пароль) |
|
Пароль от ключа |
Да |
Экземпляр класса org.apache.kafka.common.config.types.Password |
- |
new Password (пароль) |
|
Псевдоним (alias) ключа |
Да |
String |
encryptionSend |
Alias ключа |
Внимание!
Пароли в
Propertiesдолжны быть представлены экземплярами классаorg.apache.kafka.common.config.types.Password. Это маскирует пароль в логах. Другие типы не поддерживаются.
Конфигурация на стороне потребителя#
Потребитель конфигурируется следующими параметрами:
Наименование |
Определение |
Обязательный параметр |
Тип значения |
Значение по умолчанию |
Значение для включения шифрования |
|---|---|---|---|---|---|
|
Полное имя класса десериализатора ключа |
Да |
String |
- |
ru.sbrf.kafka.serialization.EncryptedCertByteArrayDeserializer |
|
Полное имя класса десериализатора значения |
Да |
String |
- |
ru.sbrf.kafka.serialization.EncryptedCertByteArrayDeserializer |
|
Путь к хранилищу ключей |
Да |
String |
- |
Путь к файлу |
|
Тип хранилища ключей |
Нет |
String |
JKS |
JKS |
|
Пароль от хранилища ключей |
Да |
org.apache.kafka.common.config.types.Password |
- |
new Password (пароль) |
|
Пароль от ключа |
Да |
org.apache.kafka.common.config.types.Password |
- |
new Password (пароль) |
|
Псевдоним (alias) ключа |
Да |
String |
encryptionSend |
Alias ключа |
Внимание!
Пароли в
Propertiesдолжны быть представлены экземплярами классаorg.apache.kafka.common.config.types.Password. Это маскирует пароль в логах. Другие типы не поддерживаются.