Kafka-encryption-serde#

Представляет собой сериализатор/десериализатор, использующий симметричные ключи. Сериализатор/десериализатор имеет два режима работы: шифрование сообщений и создание к ним подписей.

Предусловия#

Не требуются.

Последовательность выполнения#

Поддерживаемые алгоритмы#

Алгоритмы для подписей#

Сериализатор/десериализатор поддерживает следующие алгоритмы для создания подписей:

  • AES128-GCM-NoPadding

  • AES256-GCM-NoPadding

  • ChaCha20-Poly1305-NoPadding

  • HmacSHA256

Алгоритмы для шифрования#

Для шифрования сообщений доступны следующие алгоритмы:

  • AES128-GCM-NoPadding

  • AES256-GCM-NoPadding

  • ChaCha20-Poly1305-NoPadding

Хранение и обновление ключей#

Все ключи хранятся локально в кеше. Обновление ключей происходит с заданным таймингом в параметре value.serializer.encryption.storage.update.time. Ключи могут быть получены из различных источников, таких как json-файл, хранилище Vault или transit.

Перед выгрузкой ключей из json-файла происходит сверка даты последнего изменения файла и, если эта дата различается, ключи будут загружены.

Ключи из хранилища Vault выгружаются без проверок.

При запросе ключа, которого нет в локальном хранилище, будет произведена загрузка ключей. Если ключ с таким же именем будет повторно запрошен и не найден в течение времени установленного с помощью параметра value.serializer.encryption.key.reload.time, загрузка не будет произведена.

Transit#

Сериализатор/десериализатор поддерживает взаимодействие с Vault engine transit. Transit позволяет генерировать ключ с заданным алгоритмом и в дальнейшем использовать его для шифрования и дешифрования. Сериализатор/десериализатор после создания ключа выполняют его загрузку в локальное хранилище (память) и с заданным временным промежутком обновляют локальное хранилище.

Преобразование пароля в ключ#

Сериализатор/десериализатор поддерживает режим преобразования пароля в ключ. Для этого в параметрах хранилища должен быть установлен соответствующий префикс. Это позволяет использовать пароли в качестве исходных данных для генерации симметричных ключей.

Пример json-файла:

{
  "aes256": "generate_key: password: password, algorithm: AES, iterations: 60000, length: 256",
  "aes128": "generate_key: password: password2, algorithm: AES, iterations: 60000, length: 128",
  "chacha20": "generate_key: password: password3, algorithm: ChaCha20, iterations: 60000, length: 256"
}

Таблица параметров#

Ключ

Дефолтное значение

Описание параметра

value.serializer.encryption.mode

failOnValue

Режим обработки ошибок

value.serializer.encryption.authentication.tag.length

128

Длина тега

value.serializer.encryption.algorithm

для подписи: HmacSHA256, для шифрования: AES_256/GCM/NoPadding

Алгоритм шифрования сообщения

value.serializer.encryption.key.alias

-

Имя ключа для подписания/шифрования сообщений

value.serializer.encryption.key.store.type

- (json, vault, transit)

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

value.serializer.encryption.json.storage.location

-

Путь до json файла с ключами

value.serializer.encryption.storage.update.time

60 (значение в секундах)

Частота обновление ключей в локальном хранилище

value.serializer.encryption.key.reload.time

5 (значение в секундах)

Время повторного обновления ключей при запросе ключа отсутствующего в хранилище

value.serializer.encryption.generate.key.password

true

Включает создание ключей на основе паролей.

value.serializer.encryption.mode.operation

- (encrypt, signature)

Режим работы интерсептора (encrypt/signature)

value.serializer.encryption.create.new.key

-

В режиме работы transit будет создан новый ключ. Если ключ с таким именем уже существует, будет создана новая версия

value.deserializer.encryption.mode

failOnValue

Режим обработки ошибок

value.deserializer.encryption.authentication.tag.length

128

Длина тега

value.deserializer.encryption.algorithm

для подписи: HmacSHA256, для шифрования: AES_256/GCM/NoPadding

Алгоритм шифрования сообщения

value.deserializer.encryption.key.alias

-

Имя ключа для подписания/шифрования сообщений

value.deserializer.encryption.key.store.type

- (json, vault, transit)

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

value.deserializer.encryption.json.storage.location

-

Путь до json файла с ключами

value.deserializer.encryption.storage.update.time

60 (значение в секундах)

Частота обновление ключей в локальном хранилище

value.deserializer.encryption.key.reload.time

5 (значение в секундах)

Время повторного обновления ключей при запросе ключа отсутствующего в хранилище

value.deserializer.encryption.generate.key.password

true

Включает создание ключей на основе паролей.

value.deserializer.encryption.mode.operation

- (encrypt, signature)

Режим работы интерсептора (encrypt/signature)

value.deserializer.encryption.create.new.key

-

В режиме работы transit будет создан новый ключ. Если ключ с таким именем уже существует, будет создана новая версия

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

JSON#

Пример конфигурации Десериализатора#
bootstrap.servers = localhost:9092 
security.protocol = PLAINTEXT
group.id = test-group

key.serializer=org.apache.kafka.common.serialization.StringSerializer
value.serializer=ru.sbt.ss.kafka.encryption.serde.EncryptionSerializer

value.serializer.delegate = org.apache.kafka.common.serialization.StringSerializer

value.serializer.encryption.algorithm = AES_128/GCM/NoPadding # Алгоритм шифрования сообщения
value.serializer.encryption.key.alias = aes128 # Имя ключа для шифрования
value.serializer.encryption.json.storage.location = /valid-password-and-keystore.json # Путь до json файла где лежат ключи
value.serializer.encryption.key.store.type = json # Тип хранилища (json/vault) 
value.serializer.encryption.mode.operation = encrypt # Режим interceptor (encrypt/signature)
value.serializer.encryption.generate.key.password = true # Включает преобразование паролей в ключи
Пример конфигурации Сериализатора#
bootstrap.servers = localhost:9092
security.protocol = PLAINTEXT
group.id = test-group

key.deserializer=org.apache.kafka.common.serialization.StringDeserializer
value.deserializer=ru.sbt.ss.kafka.encryption.serde.EncryptionDeserializer

value.deserializer.delegate = org.apache.kafka.common.serialization.StringDeserializer

value.deserializer.encryption.json.storage.location = /valid-password-and-keystore.json # Путь до json файла где лежат ключи
value.deserializer.encryption.key.store.type = json # Тип хранилища (json/vault)
value.deserializer.encryption.mode.operation = signature # Режим interceptor (encrypt/signature)
value.deserializer.encryption.generate.key.password = true # Включает преобразование паролей в ключи

Vault#

Пример конфигурации Десериализатора#
ssl.vault.address = https://localhost:8200 # Адрес подключения к Vault
ssl.vault.auth.type = APPROLE # Тип алгоритма аутентификации в Vault
ssl.vault.auth.role.id = role-id # Идентификатор роли приложения при ssl.vault.auth.type=approle 
ssl.vault.auth.secret.id = secret-id # Секрет роли приложения при ssl.vault.auth.type=approle

ssl.vault.tls.enable = true # Включение протокола TLS при подключении к Vault  
ssl.vault.tls.keystore.location = /vault.jks # Путь до keystore 
ssl.vault.tls.keystore.password = password # Пароль от сертификата
ssl.vault.tls.key.password = password  # Пароль от ключа
ssl.vault.tls.truststore.location = /vault.jks # Путь до truststore 
ssl.vault.tls.truststore.password = password # Пароль от truststore

ssl.vault.pki.mode = kv # Режим выпуска сертификатов
ssl.vault.secret.path = /keys # Путь до ключей в vault хранилище
ssl.vault.disable.pem.certificate.generation = true # Отключает генерацию pem сертификата

bootstrap.servers = localhost:9092
security.protocol = PLAINTEXT
group.id = test-group

key.serializer=org.apache.kafka.common.serialization.StringSerializer
value.serializer=ru.sbt.ss.kafka.encryption.serde.EncryptionSerializer

value.serializer.delegate = org.apache.kafka.common.serialization.StringSerializer

value.serializer.encryption.algorithm = AES_128/GCM/NoPadding # Алгоритм шифрования сообщения
value.serializer.encryption.key.alias = aes128 # Имя ключа для шифрования
value.serializer.encryption.key.store.type = vault # Тип хранилища (json/vault/transit) 
value.serializer.encryption.mode.operation = signature # Режим interceptor (encrypt/signature)
value.serializer.encryption.generate.key.password = true # Включает преобразование паролей в ключи
Пример конфигурации Сериализатора#
ssl.vault.address = https://localhost:8200 # Адрес подключения к Vault
ssl.vault.auth.type = APPROLE # Тип алгоритма аутентификации в Vault
ssl.vault.auth.role.id = role-id # Идентификатор роли приложения при ssl.vault.auth.type=approle 
ssl.vault.auth.secret.id = secret-id # Секрет роли приложения при ssl.vault.auth.type=approle

ssl.vault.tls.enable = true # Включение протокола TLS при подключении к Vault  
ssl.vault.tls.keystore.location = /vault.jks # Путь до keystore 
ssl.vault.tls.keystore.password = password # Пароль от сертификата
ssl.vault.tls.key.password = password  # Пароль от ключа
ssl.vault.tls.truststore.location = /vault.jks # Путь до truststore 
ssl.vault.tls.truststore.password = password # Пароль от truststore

ssl.vault.pki.mode = kv # Режим выпуска сертификатов
ssl.vault.secret.path = /keys # Путь до ключей в vault хранилище
ssl.vault.disable.pem.certificate.generation = true # Отключает генерацию pem сертификата

bootstrap.servers = localhost:9092
security.protocol = PLAINTEXT
group.id = test-group

key.deserializer=org.apache.kafka.common.serialization.StringDeserializer
value.deserializer=ru.sbt.ss.kafka.encryption.serde.EncryptionDeserializer

value.deserializer.delegate = org.apache.kafka.common.serialization.StringDeserializer

value.deserializer.encryption.key.store.type = vault # Тип хранилища (json/vault/transit) 
value.deserializer.encryption.mode.operation = signature # Режим interceptor (encrypt/signature)
value.deserializer.encryption.generate.key.password = true # Включает преобразование паролей в ключи

Transit#

Пример конфигурации Десериализатора#
ssl.vault.address = https://localhost:8200 # Адрес подключения к Vault
ssl.vault.auth.type = APPROLE # Тип алгоритма аутентификации в Vault
ssl.vault.auth.role.id = role-id # Идентификатор роли приложения при ssl.vault.auth.type=approle 
ssl.vault.auth.secret.id = secret-id # Секрет роли приложения при ssl.vault.auth.type=approle

ssl.vault.tls.enable = true # Включение протокола TLS при подключении к Vault  
ssl.vault.tls.keystore.location = /vault.jks # Путь до keystore 
ssl.vault.tls.keystore.password = password # Пароль от сертификата
ssl.vault.tls.key.password = password  # Пароль от ключа
ssl.vault.tls.truststore.location = /vault.jks # Путь до truststore 
ssl.vault.tls.truststore.password = password # Пароль от truststore

# Transit
ssl.vault.transit.key.type = encryption-key # Тип ключа
ssl.vault.transit.mount.path = transit # Основной путь к transit engine

bootstrap.servers = localhost:9092
security.protocol = PLAINTEXT
group.id = test-group

key.serializer=org.apache.kafka.common.serialization.StringSerializer
value.serializer=ru.sbt.ss.kafka.encryption.serde.EncryptionSerializer

value.serializer.delegate = org.apache.kafka.common.serialization.StringSerializer

value.serializer.encryption.algorithm = AES_128/GCM/NoPadding # Алгоритм шифрования сообщения
value.serializer.encryption.key.alias = aes128 # Имя ключа для шифрования
value.serializer.encryption.key.store.type = transit # Тип хранилища (json/vault/transit) 
value.serializer.encryption.mode.operation = signature # Режим interceptor (encrypt/signature)
value.serializer.encryption.generate.key.password = false # Выключает преобразование паролей в ключи
value.serializer.encryption.create.new.key = true # Включает создание нового ключа
Пример конфигурации Сериализатора#
ssl.vault.address = https://localhost:8200 # Адрес подключения к Vault
ssl.vault.auth.type = APPROLE # Тип алгоритма аутентификации в Vault
ssl.vault.auth.role.id = role-id # Идентификатор роли приложения при ssl.vault.auth.type=approle 
ssl.vault.auth.secret.id = secret-id # Секрет роли приложения при ssl.vault.auth.type=approle

ssl.vault.tls.enable = true # Включение протокола TLS при подключении к Vault  
ssl.vault.tls.keystore.location = /vault.jks # Путь до keystore 
ssl.vault.tls.keystore.password = password # Пароль от сертификата
ssl.vault.tls.key.password = password  # Пароль от ключа
ssl.vault.tls.truststore.location = /vault.jks # Путь до truststore 
ssl.vault.tls.truststore.password = password # Пароль от truststore

# Transit
ssl.vault.transit.key.type = encryption-key # Тип ключа
ssl.vault.transit.mount.path = transit # Основной путь к transit engine

bootstrap.servers = localhost:9092
security.protocol = PLAINTEXT
group.id = test-group

key.deserializer=org.apache.kafka.common.serialization.StringDeserializer
value.deserializer=ru.sbt.ss.kafka.encryption.serde.EncryptionDeserializer

value.deserializer.delegate = org.apache.kafka.common.serialization.StringDeserializer

value.deserializer.encryption.algorithm = AES_128/GCM/NoPadding # Алгоритм шифрования сообщения
value.deserializer.encryption.key.alias = aes128 # Имя ключа для шифрования
value.deserializer.encryption.key.store.type = transit # Тип хранилища (json/vault/transit) 
value.deserializer.encryption.mode.operation = signature # Режим interceptor (encrypt/signature)
value.deserializer.encryption.generate.key.password = false # Выключает преобразование паролей в ключи
value.deserializer.encryption.create.new.key = false # Включает создание нового ключа

Результат#

Выполнено подключение сериализатора/десериализатора Kafka-encryption-serde.