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

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

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