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"
}
Таблица параметров#
Ключ |
Дефолтное значение |
Описание параметра |
|---|---|---|
|
|
Режим обработки ошибок |
|
|
Длина тега |
|
для подписи: |
Алгоритм шифрования сообщения |
|
- |
Имя ключа для подписания/шифрования сообщений |
|
- ( |
Тип хранилища ключей |
|
- |
Путь до json файла с ключами |
|
|
Частота обновление ключей в локальном хранилище |
|
|
Время повторного обновления ключей при запросе ключа отсутствующего в хранилище |
|
|
Включает создание ключей на основе паролей. |
|
- ( |
Режим работы интерсептора (encrypt/signature) |
|
- |
В режиме работы |
|
|
Режим обработки ошибок |
|
|
Длина тега |
|
для подписи: |
Алгоритм шифрования сообщения |
|
- |
Имя ключа для подписания/шифрования сообщений |
|
- ( |
Тип хранилища ключей |
|
- |
Путь до json файла с ключами |
|
|
Частота обновление ключей в локальном хранилище |
|
|
Время повторного обновления ключей при запросе ключа отсутствующего в хранилище |
|
|
Включает создание ключей на основе паролей. |
|
- ( |
Режим работы интерсептора (encrypt/signature) |
|
- |
В режиме работы |
Пример конфигурации#
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.