Расширенная конфигурация Kafka

Расширенная конфигурация Kafka

Ограничения

Для корректной работы mTLS в Golang необходимо, чтобы сертификат содержал Subject Alternative Name (SAN). Этот элемент в сертификате указывает допустимые доменные имена или IP-адреса, для которых сертификат действителен. Если SAN отсутствует, golang будет сообщать об ошибке проверки сертификата (hostname verification) и разрывать соединение. Практический пример проблемы описан в публичном issue проекта RKE2

Введение

Kafka широко используется в распределённых системах для обмена сообщениями между сервисами, и в современных production окружениях требуется настройка шифрования и аутентификации.

Основные значения и настройки Kafka

  1.  security.protocol — Описание протокола безопасности соединения:

    • PLAINTEXT: Соединение без шифрования и аутентификации.

    • SSL: Соединение с шифрованием через SSL/TLS, но без аутентификации.

    • SASL_PLAINTEXT: Соединение с аутентификацией через SASL без шифрования.

    • SASL_SSL: Соединение с аутентификацией через SASL и шифрованием через SSL.

  2. sasl.mechanism - механизм аутентификации, использующийся с SASL

    • PLAIN : Аутентификация через логин и пароль, передаваемые в открытом виде (без шифрования).

    • SCRAM-SHA-256: Аутентификация через SCRAM с использованием алгоритма SHA-256 для хэширования паролей.

    • SCRAM-SHA-512: Аутентификация через SCRAM с использованием алгоритма SHA-512 для хэширования паролей.

Таблица комбинаций security.protocol и sasl.mechanism

security.protocolsasl.mechanismОписаниеШифрованиеЛогин и парольmTLS*mTLS  игнорируется если включен (Не имеет никакого эффекта)
PLAINTEXT-Без шифрования и аутентификации❌❌❌✔️
SSL-Шифрование через SSL/TLS, без аутентификации✔️❌✔️❌
SASL_PLAINTEXTPLAINАутентификация через SASL без шифрования (логин и пароль передаются в открытом виде)❌✔️❌
SASL_PLAINTEXTSCRAM-SHA-256Аутентификация через SCRAM с использованием SHA-256 (пароль передается в хэшированном виде)❌✔️❌
SASL_PLAINTEXTSCRAM-SHA-512Аутентификация через SCRAM с использованием SHA-512 (пароль передается в хэшированном виде)❌✔️❌
SASL_SSLPLAINАутентификация через SASL с шифрованием через SSL (логин и пароль передаются в открытом виде)✔️✔️✔️⚠️(Поддерживается, но по факту mTLS игнорируется и используется SASL)Включение\выключение mTLS не играет роли, Kafka игнорирует mTLS
SASL_SSLSCRAM-SHA-256Аутентификация через SCRAM с использованием SHA-256 и шифрованием через SSL✔️✔️✔️⚠️(Поддерживается, но по факту mTLS игнорируется и используется SASL)Включение\выключение mTLS не играет роли, Kafka игнорирует mTLS
SASL_SSLSCRAM-SHA-512Аутентификация через SCRAM с использованием SHA-512 и шифрованием через SSL✔️✔️✔️⚠️(Поддерживается, но по факту mTLS игнорируется и используется SASL)Включение\выключение mTLS не играет роли, Kafka игнорирует mTLS

*mTLS - обнаружена особенность при включении SCRAM игнорируется mTLS.

//mTLS traditionally only works with SSL protocol, not SASL_SSL (before Kafka 2.8.0)
//After Kafka 2.8.0, mTLS can work with SASL_SSL, but SASL authentication takes precedence

Конфигурация в Закрома.Хранение

1kafka: # Настройка продюсера. 2 servers: # Список адресов серверов кластера Kafka. 3 - localhost:9092 4 auth: # Настройки аутентификации клиента в Kafka. 5 security_protocol: SASL_PLAINTEXT # Протокол безопасности Kafka. Определяет использование SSL/TLS и/или SASL. Например: PLAINTEXT, SSL, SASL_PLAINTEXT, SASL_SSL. 6 sasl_mechanism: PLAIN # Механизм аутентификации SASL. Используется при security_protocol =SASL_PLAINTEXT или SASL_SSL. Например: PLAIN, SCRAM-SHA-256, SCRAM-SHA-512. 7 path_ssl_trusted_certificate: "" # Путь к файлу доверенного сертификата SSL для подключения (Используется если security_protocol = SSL или SASL_SSL). 8 tls_insecure_skip_verify: false # Флаг, разрешающий пропуск проверки валидности SSL-сертификата (true/false) (Используется если security_protocol = SSL или SASL_SSL). 9 user: user # Логин пользователя Kafka. 10 password: password # Пароль пользователя. 11 mtls: # Настройки mTLS для клиента Kafka. 12 enabled: false # Флаг включения mTLS. 13 client_cert_path: "" # Путь к клиентскому сертификату (PEM). 14 client_key_path: "" # Путь к приватному ключу клиента (PEM). 15

Пример

1kafka: 2 servers: 3 - "localhost:9094" 4 auth: 5 security_protocol: PLAINTEXT 6 sasl_mechanism: 7 user: sa 8 password: 333333 9 #path_ssl_trusted_certificate: "C:\\Users\\aleks\\GolandProjects\\zakroma\\zakroma-storage\\.config\\rootCAFAKE.crt" 10 path_ssl_trusted_certificate: "C:\\Users\\aleks\\GolandProjects\\zakroma\\zakroma-storage\\.config\\ca-root.pem" 11 mtls: # Настройки mTLS для клиента Kafka. 12 enabled: false # Флаг включения mTLS. 13 client_cert_path: "C:\\Users\\aleks\\GolandProjects\\zakroma\\zakroma-storage\\.config\\mtls.cert" # Путь к клиентскому сертификату (PEM). 14 client_key_path: "C:\\Users\\aleks\\GolandProjects\\zakroma\\zakroma-storage\\.config\\mtls.key" # Путь к приватному ключу клиента (PEM). 15

Отличие TLS vs mTLS

TLS

Получаем сертификат от сервера и проверяем что он выпущен доверенным центром сертификации. (Проверка сертификата только на стороне клиента)

image

mTLS

Получаем сертификат от сервера и проверяем что он выпущен доверенным центром сертификации и тоже самое делает сервер, мы даем серверу наш сертификат и он тоже проверят доверенность. (Проверка сертификатов на каждой из сторон)

image

Поддержка подключения к Kafka по mTLS

В ЗАКРОМА.Хранение имеется поддержка защищённого подключения к Kafka по mTLS.

Параметры конфигурации mTLS

1kafka: # Настройка продюсера. 2 servers: # Список адресов серверов кластера Kafka. 3 - localhost:9092 4 auth: # Настройки аутентификации клиента в Kafka. 5 security_protocol: SASL_PLAINTEXT # Протокол безопасности Kafka. Определяет использование SSL/TLS и/или SASL. Например: PLAINTEXT, SSL, SASL_PLAINTEXT, SASL_SSL. 6 sasl_mechanism: PLAIN # Механизм аутентификации SASL. Используется при security_protocol =SASL_PLAINTEXT или SASL_SSL. Например: PLAIN, SCRAM-SHA-256, SCRAM-SHA-512. 7 path_ssl_trusted_certificate: "" # Путь к файлу доверенного сертификата SSL для подключения (используется если security_protocol = SSL или SASL_SSL). 8 tls_insecure_skip_verify: false # Флаг, разрешающий пропуск проверки валидности SSL-сертификата (true/false) (используется если security_protocol = SSL или SASL_SSL). 9 user: user # Логин пользователя Kafka. 10 password: password # Пароль пользователя. 11 mtls: # Настройки mTLS для клиента Kafka. 12 enabled: false # Флаг включения mTLS. 13 client_cert_path: "" # Путь к клиентскому сертификату (PEM). 14 client_key_path: "" # Путь к приватному ключу клиента (PEM).

Требования

  • Корневой сертификат CA (Certificate Authority)
  • Клиентский сертификат (client.crt)
  • Приватный ключ (client.key)
  • Корректная настройка ACL на стороне Kafka
  • Поддержка TLS 1.2+

Валидация

Реализована автоматическая валидация параметров подключения. При некорректной конфигурации сервис Закрома.Хранение не поднимается, а в логах отображается причина.

Использование

Рекомендуется включать mTLS, если:

  • Kafka расположена вне кластера Закрома.Хранение (managed Kafka, выделенный кластер, внешний брокер);
  • взаимодействие проходит через публичные или небезопасные сети;
  • требуется повышенная безопасность или обязательная идентификация клиента на стороне Kafka.

Диагностика

Проверить успешное подключение можно:

  • по логам gateway / composer / worker;
  • по отсутствию ошибок TLS handshake;
  • по успешному чтению/записи топиков.
Смотрите также
Настройка Kafka