Vault config provider#

Реализует интерфейс org.apache.kafka.common.config.provider.ConfigProvider и позволяет получать параметры SSL из vault на этапе обработки конфигурации kafka-клиента/брокера/воркера kafka-connect.

Входит в состав библиотеки Ssl-context-builder.

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

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

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

Провайдер работает только с использованием локального кеша сертификатов в виде JKS-хранилищ.

Поддерживает шифрование секретов для подключения к vault:

  • ssl.vault.tls.keystore.password

  • ssl.vault.tls.truststore.password

  • ssl.vault.auth.password

  • ssl.vault.auth.secret.id

  • ssl.vault.auth.token

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

# 1) Подключить config provider
config.providers = vault
config.providers.vault.class = ru.sbt.ss.kafka.VaultConfigProvider

# 2) ОПЦИОНАЛЬНО Настроить энкодер для дешифрации секретов
# Класс энкодера, реализующий интерфейс ru.sbt.ss.Encryptor, по умолчанию ru.sbt.ss.password.BaseEncryptor
# config.providers.vault.param.security.encoding.class = ru.sbt.ss.password.BaseEncryptor

# Ключ для дешифрации секретов (строка или путь до файла)
# config.providers.vault.param.security.encoding.key = secret/secret.pass

# 3) Настроить подключение к vault

# Адрес vault
config.providers.vault.param.ssl.vault.address = https://host:port

# ОПЦИОНАЛЬНО Namespace vault
# config.providers.vault.param.ssl.vault.namespace = namespace

# ОПЦИОНАЛЬНО Настройки повторной отправки запросов к vault
# Кол-во попыток переотправки запроса
# config.providers.vault.param.ssl.vault.retries = 5

# Тайм-аут отправки запроса, с
# config.providers.vault.param.ssl.vault.timeout = 3

# Интервал между повторными попытками переотправки запроса, мс
# config.providers.vault.param.ssl.vault.retry.interval = 500

# Настройки ssl для подключения к vault
config.providers.vault.param.ssl.vault.tls.enable = true
config.providers.vault.param.ssl.vault.tls.keystore.location = vault-keystore.jks
config.providers.vault.param.ssl.vault.tls.keystore.password = encrypted_password
config.providers.vault.param.ssl.vault.tls.key.password = password
config.providers.vault.param.ssl.vault.tls.truststore.location = vault-keystore.jks
config.providers.vault.param.ssl.vault.tls.truststore.password = encrypted_password
config.providers.vault.param.ssl.endpoint.identification.algorithm =

# Настройки авторизации vault
# Пример авторизации с помощью логина и пароля
# Тип авторизации (approle, certificate, password или token)
config.providers.vault.param.ssl.vault.auth.type = password
config.providers.vault.param.ssl.vault.auth.username = test
config.providers.vault.param.ssl.vault.auth.password = encrypted_password

# Пример авторизации в помощью approle
# config.providers.vault.param.ssl.vault.auth.type = approle
# config.providers.vault.param.ssl.vault.auth.role.id = role
# config.providers.vault.param.ssl.vault.auth.secret.id = encrypted_secret

# 4) Настроить генерацию сертификата с помощью vault
# ОПЦИОНАЛЬНО Путь до pki engine
# config.providers.vault.param.ssl.vault.pki.mount = pki

# Имя роли для выпуска сертификата
config.providers.vault.param.ssl.vault.pki.role.name = role

# Common name сертификата (CN)
config.providers.vault.param.ssl.vault.pki.common.name = INTERCEPTOR-TEST

# ОПЦИОНАЛЬНО Электронный адрес владельца сертификата, задается при использовании Secret Manager
# config.providers.vault.param.ssl.vault.pki.email = email@example.com

# ОПЦИОНАЛЬНО Alternative names сертификата
# config.providers.vault.param.ssl.vault.pki.alt.names = alt-name

# ОПЦИОНАЛЬНО Alternative ip сертификата
# config.providers.vault.param.ssl.vault.pki.alt.ip = 127.0.0.1

# ОПЦИОНАЛЬНО TTL (time-to-live) сертификата
# config.providers.vault.param.ssl.vault.pki.ttl =

# 5) Настроить хранилище сертификатов (локальный кэш)
# Пути до хранилищ сертификатов, сгенерированных vault
config.providers.vault.param.ssl.keystore.location = producer-vault-keystore.jks
config.providers.vault.param.ssl.truststore.location = producer-vault-truststore.jks

# alias клиентского сертификата в keystore
# config.providers.vault.param.ssl.vault.alias.key = key
# alias ca сертификата в truststore
# config.providers.vault.param.ssl.vault.alias.ca = ca

# 6) Настроить получение паролей для хранилища сертификатов из vault
# Путь до хранилища секретов в vault
# config.providers.vault.param.ssl.vault.secret.path = kv1/interceptor
# Версия secret engine
# config.providers.vault.param.ssl.vault.engine.version = 1

# Имя секрета, содержащего пароль для private key
# config.providers.vault.param.ssl.vault.secret.key = key
# Имя секрета, содержащего пароль для keystore
# config.providers.vault.param.ssl.vault.secret.keystore = keystore
# Имя секрета, содержащего пароль для truststore
# config.providers.vault.param.ssl.vault.secret.truststore = truststore

# 7) Настроить получение параметров ssl с помощью config provider
ssl.keystore.location=${vault:ssl.keystore.location}
ssl.keystore.password=${vault:ssl.keystore.password}
ssl.key.password=${vault:ssl.key.password}

ssl.truststore.location=${vault:ssl.truststore.location}
ssl.truststore.password=${vault:ssl.truststore.password}

Пример конфигурации с загрузкой параметров провайдера из файла#

Любые настройки провайдера можно загрузить из файла (в данном примере config/vault.properties):

# 1) Подключить config provider
config.providers = vault
config.providers.vault.class = ru.sbt.ss.kafka.VaultConfigProvider

# Путь до файла с параметрами провайдера
config.providers.vault.param.properties.file = config/vault.properties

# 2) ОПЦИОНАЛЬНО Переопределить любые настройки провайдера, загруженные из файла конфигурации
# Common name сертификата (CN)
config.providers.vault.param.ssl.vault.pki.common.name = OVERRIDE-TEST
# Пути до хранилищ сертификатов, сгенерированных vault
config.providers.vault.param.ssl.keystore.location = override-vault-keystore.jks
config.providers.vault.param.ssl.truststore.location = override-vault-truststore.jks

# 3) Настроить получение параметров ssl с помощью config provider
ssl.keystore.location=${vault:ssl.keystore.location}
ssl.keystore.password=${vault:ssl.keystore.password}
ssl.key.password=${vault:ssl.key.password}

ssl.truststore.location=${vault:ssl.truststore.location}
ssl.truststore.password=${vault:ssl.truststore.password}

Пример файла config/vault.properties (настройки указываются без префикса config.providers.*.param.):

# 1) ОПЦИОНАЛЬНО Настроить энкодер для дешифрации секретов
# Класс энкодера, реализующий интерфейс ru.sbt.ss.Encryptor, по умолчанию ru.sbt.ss.password.BaseEncryptor
# security.encoding.class = ru.sbt.ss.password.BaseEncryptor

# Ключ для дешифрации секретов (строка или путь до файла)
# security.encoding.key = secret/secret.pass

# 2) Настроить подключение к vault

# Адрес vault
ssl.vault.address = https://host:port

# ОПЦИОНАЛЬНО Namespace vault
# ssl.vault.namespace = namespace

# ОПЦИОНАЛЬНО Настройки повторной отправки запросов к vault
# Кол-во попыток переотправки запроса
# ssl.vault.retries = 5

# Тайм-аут отправки запроса, с
# ssl.vault.timeout = 3

# Интервал между повторными попытками переотправки запроса, мс
# ssl.vault.retry.interval = 500

# Настройки ssl для подключения к vault
ssl.vault.tls.enable = true
ssl.vault.tls.keystore.location = vault-keystore.jks
ssl.vault.tls.keystore.password = encrypted_password
ssl.vault.tls.key.password = password
ssl.vault.tls.truststore.location = vault-keystore.jks
ssl.vault.tls.truststore.password = encrypted_password
ssl.endpoint.identification.algorithm =

# Настройки авторизации vault
# Пример авторизации с помощью логина и пароля
# Тип авторизации (approle, certificate, password или token)
ssl.vault.auth.type = password
ssl.vault.auth.username = test
ssl.vault.auth.password = encrypted_password

# Пример авторизации в помощью approle
# ssl.vault.auth.type = approle
# ssl.vault.auth.role.id = role
# ssl.vault.auth.secret.id = encrypted_secret

# 3) Настроить генерацию сертификата с помощью vault
# ОПЦИОНАЛЬНО Путь до pki engine
# ssl.vault.pki.mount = pki

# Имя роли для выпуска сертификата
ssl.vault.pki.role.name = role

# Common name сертификата (CN)
ssl.vault.pki.common.name = TEST

# ОПЦИОНАЛЬНО Alternative names сертификата
# ssl.vault.pki.alt.names = alt-name

# ОПЦИОНАЛЬНО Alternative ip сертификата
# ssl.vault.pki.alt.ip = 127.0.0.1

# ОПЦИОНАЛЬНО TTL (time-to-live) сертификата
# ssl.vault.pki.ttl =

# 4) Настроить хранилище сертификатов (локальный кэш)
# Пути до хранилищ сертификатов, сгенерированных vault
ssl.keystore.location = vault-keystore.jks
ssl.truststore.location = vault-truststore.jks

# alias клиентского сертификата в keystore
# ssl.vault.alias.key = key
# alias ca сертификата в truststore
# ssl.vault.alias.ca = ca

# 5) Настроить получение паролей для хранилища сертификатов из vault
# Путь до хранилища секретов в vault
# ssl.vault.secret.path = kv1/interceptor
# Версия secret engine
# ssl.vault.engine.version = 1

Результат#

Выполнено поключение плагина Vault config provider.