Сквозное шифрование данных#

Сквозное шифрование данных — шифрование чувствительных данных на стороне Производителя и их расшифровка на потребителе.

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

Сквозное шифрование может быть:

  • симметричным — для шифрования и расшифровки используется один ключ;

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

Подробное описание конфигурирования поставщика и потребителя для сквозного шифрования приведено ниже.

Симметричное шифрование#

Используется механизм шифрования данных перед записью в топик и последующая расшифровка при чтении. Шифрование и расшифровка сообщения производится с помощью секретного ключа и генератора соли.

Данные шифруются и расшифровываются на стороне клиента, поэтому механизм не зависит от настройки соединения с брокерами.

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

Конфигурация на стороне поставщика#

Поставщик конфигурируется следующими параметрами:

Наименование

Определение

Тип значения

Значение

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 символов)

Конфигурация на стороне потребителя#

Потребитель конфигурируется следующими параметрами:

Наименование

Определение

Тип значения

Значение

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 символов)

Внимание!

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

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

Пример 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.

Конфигурация на стороне поставщика#

Поставщик конфигурируется следующими параметрами:

Наименование

Определение

Обязательный параметр

Тип значения

Значение по умолчанию

Значение для включения шифрования

key.serializer

Полное имя класса сериализатора ключа

Да

String

-

ru.sbrf.kafka.serialization.EncryptedCertByteArraySerializer

value.serializer

Полное имя класса сериализатора значения

Да

String

-

ru.sbrf.kafka.serialization.EncryptedCertByteArraySerializer

ssl.truststore.location

Путь к хранилищу ключей

Да

String

-

Путь к файлу

ssl.truststore.type

Тип хранилища ключей

Нет

String

JKS

JKS

ssl.truststore.password

Пароль от хранилища ключей

Да

Экземпляр класса 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. Это маскирует пароль в логах. Другие типы не поддерживаются.

Конфигурация на стороне потребителя#

Потребитель конфигурируется следующими параметрами:

Наименование

Определение

Обязательный параметр

Тип значения

Значение по умолчанию

Значение для включения шифрования

key.deserializer

Полное имя класса десериализатора ключа

Да

String

-

ru.sbrf.kafka.serialization.EncryptedCertByteArrayDeserializer

value.deserializer

Полное имя класса десериализатора значения

Да

String

-

ru.sbrf.kafka.serialization.EncryptedCertByteArrayDeserializer

ssl.truststore.location

Путь к хранилищу ключей

Да

String

-

Путь к файлу

ssl.truststore.type

Тип хранилища ключей

Нет

String

JKS

JKS

ssl.truststore.password

Пароль от хранилища ключей

Да

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. Это маскирует пароль в логах. Другие типы не поддерживаются.