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

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

Ограничения

Для корректной работы mTLS в Golang необходимо, чтобы сертификат содержал Subject Alternative Name (SAN). Этот элемент в сертификате указывает допустимые доменные имена или IP-адреса, для которых сертификат действителен. Если SAN отсутствует, golang будет соо https://github.com/rancher/rke2/issues/775

Введение

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). 15 16#### Требования 17 18- Корневой сертификат CA (Certificate Authority) 19- Клиентский сертификат (`client.crt`) 20- Приватный ключ (`client.key`) 21- Корректная настройка ACL на стороне Kafka 22- Поддержка TLS 1.2+ 23 24#### Валидация 25 26Реализована автоматическая валидация параметров подключения. При некорректной конфигурации сервис Zakroma не поднимается, а в логах отображается причина. 27 28#### Использование 29 30Рекомендуется включать `mTLS`, если: 31 32- Kafka расположена вне кластера Zakroma (managed Kafka, выделенный кластер, внешний брокер); 33- взаимодействие проходит через публичные или небезопасные сети; 34- требуется повышенная безопасность или обязательная идентификация клиента на стороне Kafka. 35 36#### Диагностика 37 38Проверить успешное подключение можно: 39 40- по логам `gateway / composer / worker`; 41- по отсутствию ошибок `TLS handshake`; 42- по успешному чтению/записи топиков.