Kafka-encryption-ott-interceptor#
Интерсептор для плавного перехода с
kafka-ott-signature-interceptorнаkafka-encryption-interceptor. Целевым решением для подписи сообщений является kafka-encryption-interceptor.
Описание модуля#
Представляет собой гибридный Kafka-интерсептор, разработанный для бесшовного перехода от старого механизма подписи сообщений (kafka-ott-signature-interceptor) к новому (kafka-encryption-interceptor) — шифрованию и подписи на основе симметричных ключей.
Так как у kafka-ott-signature-interceptor и kafka-encryption-interceptor разные форматы заголовков, при прямом переходе возможны ошибки совместимости между старыми и новыми клиентами.
kafka-encryption-ott-interceptor поддерживает оба формата заголовков:
Добавляет оба набора заголовков к исходящим сообщениям.
Умеет читать сообщения от любого из двух интерсепторов.
kafka-encryption-ott-interceptor позволяет перейти на новый интерсептор без остановки системы. Подходит для всех используемых вариантов решений.
Последовательность выполнения#
Этапы перехода#
Все производители и потребители асинхронно подключают
kafka-encryption-ott-interceptor. Конфигурация интерсептора включает параметры обоих механизмов (encryption и OTT).

К новым исходящим сообщениям прикрепляются два набора заголовков.
ВАЖНО!
kafka-encryption-ott-interceptorдолжен настраиваться только в режимеsignature. При режимеencryptionтело сообщения будет зашифровано иkafka-ott-signature-interceptorне сможет проверить подпись.Старые и новые клиенты читают и проверяют сообщения.
Количество сообщений, подписываемых
kafka-ott-signature-interceptor, сокращается.

Поэтапно отключается OTT-часть. Режим интерсептора меняется на
encryption.Осуществляется полный переход на интерсептор
kafka-encryption-interceptor.

Архитектура и логика работы#
Producer (отправка сообщений)#
Producer работает по следующей логике:
Запрашивает ОТТ-токен (как в
kafka-ott-signature-interceptor).Подписывает тело сообщения:
с помощью ОТТ-токена (добавляет заголовки
kafka-ott-signature-interceptor);с помощью симметричного ключа (добавляет заголовки
kafka-encryption-interceptor).
Отправляет сообщение с заголовками двух типов.
Consumer (чтение сообщений)#
Consumer работает по следующей логике:
Проверяет наличие заголовков:
Если имеются encryption-заголовки, то проверяется подпись через симметричный ключ.
Если encryption-заголовки отсутствуют или произошла ошибка при их проверке, то проверяется подпись через ОТТ.
Если одна из подписей валидна, сообщение считается корректным.
При ошибке чтения подписей поддерживается настраиваемое поведение.
Поддерживаемые режимы#
Название |
Описание |
|---|---|
encrypt |
Шифрование сообщения |
signature |
Подпись сообщения (encrypt и OTT) |
ВАЖНО! В текущей версии kafka-encryption-ott-interceptor работает только в режиме подписи (signature), режим encrypt не поддерживается.
Таблица параметров#
kafka-encryption-ott-interceptor поддерживает параметры обоих интерсепторов.
ВАЖНО! Интерсептор использует в качестве транзитивной зависимости библиотеку sbp.com.sbt.ott:ott-jsonrpc-hb-client для генерации и валидации токенов безопасности, которая не входит в состав компонента EVTD. Данная библиотека относится к серверной части ОТТ (ОТТ-сервис). Подробнее в документации продукта OTT (Platform V One-Time-Token) и его компонента OTTS.
kafka-encryption-ott-interceptor не изменяет параметры, переданные ему из конфигурации. Все параметры ОТТ-клиента c префиксом .ott., указанные в конфигурационных файлах, принимаются как есть, и интерсептор не имеет логики переопределения или обработки этих параметров.
Все параметры ОТТ-клиента c префиксом .ott., указанные в конфигурационных файлах интерсептора, относятся к ОТТ-клиенту sbp.com.sbt.ott:ott-jsonrpc-hb-client и принимаются как есть. Интерсептор не имеет логики переопределения или обработки каких-то параметров.
Следует дополнительно уточнить значение параметра interceptor.signature.ott.authz.realm для автоматизированной системы (АС).
Параметр |
Дефолтное значение |
Описание |
Источник |
|---|---|---|---|
|
|
Поведение при ошибке: |
Общий |
|
— |
ID модуля (alias сертификата) для ОТТ |
OTT |
|
— |
URL сервиса ОТТ |
OTT |
|
— |
Хосты ОТТ |
OTT |
|
— |
Realm авторизации |
OTT |
|
|
Алгоритм подписи (для режима |
Encryption |
|
— |
Имя ключа для подписи |
Encryption |
|
— |
Тип хранилища: |
Encryption |
|
— |
Путь к JSON с ключами |
Encryption |
|
|
Режим: |
Encryption |
|
|
Разрешить генерацию ключей из паролей |
Encryption |
|
- |
В режиме работы |
Encryption |
|
- |
Путь до json-файла с ключами |
Encryption |
|
|
Частота обновление ключей в локальном хранилище, если включен параметр |
Encryption |
|
|
Тип хранилища: |
OTT |
|
— |
Путь к keystore |
OTT |
|
— |
Путь к truststore |
OTT |
|
|
Версия TLS |
OTT |
|
|
Включить JMX-метрики |
Общий |
|
|
Включить логирование |
Общий |
Настройки подключения и авторизации плагина ssl-context-builder#
Полный список возможных параметров есть в документации плагина
ssl-context-builder
Параметр |
Значение по умолчанию |
Описание |
|---|---|---|
|
Адрес Vault |
|
|
approle |
Тип авторизации: approle, token, password, certificate, kubernetes |
|
true |
Включить TLS для подключения к Vault |
|
Путь к keystore для TLS |
|
|
Пароль от keystore |
|
|
Путь к truststore |
|
|
Пароль от truststore |
|
|
pki |
Режим выпуска сертификатов |
|
Пространство имен в Vault |
|
|
2 |
Версия Key-Value хранилища секретов |
Примеры конфигурации#
Пример конфигурации Kafka Producer (json-хранилище)#
# Подключение интерсептора
interceptor.classes=ru.sbt.ss.kafka.encryption.ott.interceptor.EncryptionOttProducerInterceptor
# === Настройки OTT ===
interceptor.signature.ott.service.url=https://service/ott-service/rest/token
interceptor.signature.ott.service.hosts=ott-service:443
interceptor.signature.ott.module.id=ott-test-moduleA
interceptor.signature.ott.authz.realm=mmt
interceptor.signature.ott.service.cert.alias=ott-service
interceptor.signature.ott.certstore.type=JKS
interceptor.signature.ott.certstore.path=config/jks/ott-test-moduleA.p12
interceptor.signature.ott.trust.store.path=config/jks/truststore.p12
interceptor.signature.ott.certstore.pwd={password}
interceptor.signature.ott.certstore.private.key.pwd={password}
interceptor.signature.ott.trust.store.pwd={password}
interceptor.signature.ott.client.tls=TLSv1.2
interceptor.signature.ott.request.add.subject=urn:sbrf:names:pprb:1.0:module:id#ott-test-moduleA
interceptor.signature.ott.request.add.action=urn:sbrf:names:pprb:1.0:action:id#publish
interceptor.signature.ott.request.add.resource=urn:sbrf:names:pprb:1.0:api:interface:fullname#TOPIC
interceptor.signature.ott.request.add.environment.realm=ott:realm#synapse
# === Настройки Encryption ===
interceptor.encryption.mode.operation=signature
interceptor.encryption.algorithm=HmacSHA256
interceptor.encryption.key.alias=hmac-key-256
interceptor.encryption.key.store.type=json
interceptor.encryption.json.storage.location=/keys/encryption-keys.json
interceptor.encryption.generate.key.password=true
# === Поведение при ошибках ===
interceptor.signature.mode=failOnValue
interceptor.encryption.mode=failOnValue
# === Дополнительно ===
interceptor.jmx.metrics.enabled=true
interceptor.trace.logger.enabled=true
Пример конфигурации Kafka Consumer (json-хранилище)#
# Подключение интерсептора
interceptor.classes=ru.sbt.ss.kafka.encryption.ott.interceptor.EncryptionOttConsumerInterceptor
# === Настройки OTT ===
interceptor.signature.ott.service.url=https://service/ott-service/rest/token
interceptor.signature.ott.service.hosts=ott-service:443
interceptor.signature.ott.module.id=ott-test-moduleA
interceptor.signature.ott.authz.realm=mmt
interceptor.signature.ott.service.cert.alias=ott-service
interceptor.signature.ott.certstore.type=JKS
interceptor.signature.ott.certstore.path=config/jks/ott-test-moduleA.p12
interceptor.signature.ott.trust.store.path=config/jks/truststore.p12
interceptor.signature.ott.certstore.pwd={password}
interceptor.signature.ott.certstore.private.key.pwd={password}
interceptor.signature.ott.trust.store.pwd={password}
interceptor.signature.ott.client.tls=TLSv1.2
interceptor.signature.ott.request.add.subject=urn:sbrf:names:pprb:1.0:module:id#ott-test-moduleA
interceptor.signature.ott.request.add.resource=urn:sbrf:names:pprb:1.0:api:interface:fullname#TOPIC
interceptor.signature.ott.request.add.environment.realm=ott:realm#synapse
# === Настройки Encryption ===
interceptor.encryption.mode.operation=signature
interceptor.encryption.key.alias=hmac-key-256
interceptor.encryption.key.store.type=json
interceptor.encryption.json.storage.location=/keys/encryption-keys.json
interceptor.encryption.generate.key.password=true
# === Поведение при ошибках ===
interceptor.encryption.ott.mode=failOnValue
# === Дополнительно ===
interceptor.jmx.metrics.enabled=true
interceptor.trace.logger.enabled=true
Пример конфигурации Kafka Producer (transit-хранилище)#
Настройки плагина ssl-context-builder#
# Настройка vault
ssl.vault.address = https://xx.xx.xx.x:xxxx
ssl.vault.auth.type = APPROLE
ssl.vault.auth.role.id = role
ssl.vault.auth.secret.id = secret
ssl.vault.tls.enable = true
ssl.vault.tls.keystore.location = config/vaultclient.jks
ssl.vault.tls.keystore.password = 123
ssl.vault.tls.key.password = 123
ssl.vault.tls.truststore.location = config/vaultclient.jks
ssl.vault.tls.truststore.password = 123
ssl.vault.transit.key.type=hmac-key
ssl.vault.transit.mount.path=transit
ssl.vault.transit.namespace=""
Подключение интерсептора#
interceptor.classes=ru.sbt.ss.kafka.encryption.ott.interceptor.EncryptionOttProducerInterceptor
# === Настройки OTT ===
interceptor.signature.ott.service.url=https://service/ott-service/rest/token
interceptor.signature.ott.service.hosts=ott-service:443
interceptor.signature.ott.module.id=ott-test-moduleA
interceptor.signature.ott.authz.realm=mmt
interceptor.signature.ott.service.cert.alias=ott-service
interceptor.signature.ott.certstore.type=JKS
interceptor.signature.ott.certstore.path=config/jks/ott-test-moduleA.p12
interceptor.signature.ott.trust.store.path=config/jks/truststore.p12
interceptor.signature.ott.certstore.pwd={password}
interceptor.signature.ott.certstore.private.key.pwd={password}
interceptor.signature.ott.trust.store.pwd={password}
interceptor.signature.ott.client.tls=TLSv1.2
interceptor.signature.ott.request.add.subject=urn:sbrf:names:pprb:1.0:module:id#ott-test-moduleA
interceptor.signature.ott.request.add.action=urn:sbrf:names:pprb:1.0:action:id#publish
interceptor.signature.ott.request.add.resource=urn:sbrf:names:pprb:1.0:api:interface:fullname#TOPIC
interceptor.signature.ott.request.add.environment.realm=ott:realm#synapse
# === Настройки Encryption ===
ssl.vault.transit.key.type=hmac-key
ssl.vault.transit.mount.path=transit
ssl.vault.transit.namespace=""
interceptor.encryption.algorithm=HmacSHA256
interceptor.encryption.key.alias=hmac-key-256
interceptor.encryption.create.new.key=true
interceptor.encryption.key.store.type=transit
interceptor.encryption.mode.operation=signature
interceptor.encryption.storage.update.time=60
# === Поведение при ошибках ===
interceptor.signature.mode=failOnValue
interceptor.encryption.mode=failOnValue
# === Дополнительно ===
interceptor.jmx.metrics.enabled=true
interceptor.trace.logger.enabled=true
Пример конфигурации Kafka Consumer (transit-хранилище)#
Настройки плагина ssl-context-builder#
# Настройка vault
ssl.vault.address = https://xx.xx.xx.x:xxxx
ssl.vault.auth.type = APPROLE
ssl.vault.auth.role.id = role
ssl.vault.auth.secret.id = secret
ssl.vault.tls.enable = true
ssl.vault.tls.keystore.location = config/vaultclient.jks
ssl.vault.tls.keystore.password = 123
ssl.vault.tls.key.password = 123
ssl.vault.tls.truststore.location = config/vaultclient.jks
ssl.vault.tls.truststore.password = 123
ssl.vault.transit.key.type=hmac-key
ssl.vault.transit.mount.path=transit
ssl.vault.transit.namespace=""
Подключение интерсептора#
interceptor.classes=ru.sbt.ss.kafka.encryption.ott.interceptor.EncryptionOttConsumerInterceptor
# === Настройки OTT ===
interceptor.signature.ott.service.url=https://service/ott-service/rest/token
interceptor.signature.ott.service.hosts=ott-service:443
interceptor.signature.ott.module.id=ott-test-moduleA
interceptor.signature.ott.authz.realm=mmt
interceptor.signature.ott.service.cert.alias=ott-service
interceptor.signature.ott.certstore.type=JKS
interceptor.signature.ott.certstore.path=config/jks/ott-test-moduleA.p12
interceptor.signature.ott.trust.store.path=config/jks/truststore.p12
interceptor.signature.ott.certstore.pwd={password}
interceptor.signature.ott.certstore.private.key.pwd={password}
interceptor.signature.ott.trust.store.pwd={password}
interceptor.signature.ott.client.tls=TLSv1.2
interceptor.signature.ott.request.add.subject=urn:sbrf:names:pprb:1.0:module:id#ott-test-moduleA
interceptor.signature.ott.request.add.resource=urn:sbrf:names:pprb:1.0:api:interface:fullname#TOPIC
interceptor.signature.ott.request.add.environment.realm=ott:realm#synapse
# === Настройки Encryption ===
interceptor.encryption.key.store.type=transit
interceptor.encryption.mode.operation=signature
interceptor.encryption.create.new.key=false
interceptor.encryption.storage.update.time=60
# === Поведение при ошибках ===
interceptor.encryption.ott.mode=failOnValue
# === Дополнительно ===
interceptor.jmx.metrics.enabled=true
interceptor.trace.logger.enabled=true
Пример конфигурации Kafka Producer (kv-хранилище)#
Настройки плагина ssl-context-builder#
# Настройка vault
ssl.vault.address = https://xx.xx.xx.x:xxxx
ssl.vault.auth.type = APPROLE
ssl.vault.auth.role.id = role
ssl.vault.auth.secret.id = secret
ssl.vault.tls.enable = true
ssl.vault.tls.keystore.location = config/vaultclient.jks
ssl.vault.tls.keystore.password = 123
ssl.vault.tls.key.password = 123
ssl.vault.tls.truststore.location = config/vaultclient.jks
ssl.vault.tls.truststore.password = 123
ssl.vault.secret.path = encryptions/keys
ssl.vault.kv.mount.path = kv2
Подключение интерсептора#
interceptor.classes=ru.sbt.ss.kafka.encryption.ott.interceptor.EncryptionOttProducerInterceptor
# === Настройки OTT ===
interceptor.signature.ott.service.url=https://service/ott-service/rest/token
interceptor.signature.ott.service.hosts=ott-service:443
interceptor.signature.ott.module.id=ott-test-moduleA
interceptor.signature.ott.authz.realm=mmt
interceptor.signature.ott.service.cert.alias=ott-service
interceptor.signature.ott.certstore.type=JKS
interceptor.signature.ott.certstore.path=config/jks/ott-test-moduleA.p12
interceptor.signature.ott.trust.store.path=config/jks/truststore.p12
interceptor.signature.ott.certstore.pwd={password}
interceptor.signature.ott.certstore.private.key.pwd={password}
interceptor.signature.ott.trust.store.pwd={password}
interceptor.signature.ott.client.tls=TLSv1.2
interceptor.signature.ott.request.add.subject=urn:sbrf:names:pprb:1.0:module:id#ott-test-moduleA
interceptor.signature.ott.request.add.action=urn:sbrf:names:pprb:1.0:action:id#publish
interceptor.signature.ott.request.add.resource=urn:sbrf:names:pprb:1.0:api:interface:fullname#TOPIC
interceptor.signature.ott.request.add.environment.realm=ott:realm#synapse
# === Настройки Encryption ===
interceptor.encryption.algorithm = AES_128/GCM/NoPadding
interceptor.encryption.key.alias = aes128
interceptor.encryption.key.store.type = vault
interceptor.encryption.mode.operation = signature
# === Поведение при ошибках ===
interceptor.signature.mode=failOnValue
interceptor.encryption.mode=failOnValue
# === Дополнительно ===
interceptor.jmx.metrics.enabled=true
interceptor.trace.logger.enabled=true
Пример конфигурации Kafka Consumer (kv-хранилище)#
Настройки плагина ssl-context-builder#
# Настройка vault
ssl.vault.address = https://xx.xx.xx.x:xxxx
ssl.vault.auth.type = APPROLE
ssl.vault.auth.role.id = role
ssl.vault.auth.secret.id = secret
ssl.vault.tls.enable = true
ssl.vault.tls.keystore.location = config/vaultclient.jks
ssl.vault.tls.keystore.password = 123
ssl.vault.tls.key.password = 123
ssl.vault.tls.truststore.location = config/vaultclient.jks
ssl.vault.tls.truststore.password = 123
ssl.vault.secret.path = encryptions/keys
ssl.vault.kv.mount.path = kv2
Подключение интерсептора#
interceptor.classes=ru.sbt.ss.kafka.encryption.ott.interceptor.EncryptionOttConsumerInterceptor
# === Настройки OTT ===
interceptor.signature.ott.service.url=https://service/ott-service/rest/token
interceptor.signature.ott.service.hosts=ott-service:443
interceptor.signature.ott.module.id=ott-test-moduleA
interceptor.signature.ott.authz.realm=mmt
interceptor.signature.ott.service.cert.alias=ott-service
interceptor.signature.ott.certstore.type=JKS
interceptor.signature.ott.certstore.path=config/jks/ott-test-moduleA.p12
interceptor.signature.ott.trust.store.path=config/jks/truststore.p12
interceptor.signature.ott.certstore.pwd={password}
interceptor.signature.ott.certstore.private.key.pwd={password}
interceptor.signature.ott.trust.store.pwd={password}
interceptor.signature.ott.client.tls=TLSv1.2
interceptor.signature.ott.request.add.subject=urn:sbrf:names:pprb:1.0:module:id#ott-test-moduleA
interceptor.signature.ott.request.add.resource=urn:sbrf:names:pprb:1.0:api:interface:fullname#TOPIC
interceptor.signature.ott.request.add.environment.realm=ott:realm#synapse
# === Настройки Encryption ===
interceptor.encryption.key.store.type = vault
interceptor.encryption.mode.operation = signature
# === Поведение при ошибках ===
interceptor.encryption.ott.mode=failOnValue
# === Дополнительно ===
interceptor.jmx.metrics.enabled=true
interceptor.trace.logger.enabled=true
Результат#
Выполнено подключение интерсептора Kafka-encryption-ott-interceptor.