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