Расширенная конфигурация Kafka
Расширенная конфигурация Kafka
Ограничения
Для корректной работы mTLS в Golang необходимо, чтобы сертификат содержал Subject Alternative Name (SAN). Этот элемент в сертификате указывает допустимые доменные имена или IP-адреса, для которых сертификат действителен. Если SAN отсутствует, golang будет соо https://github.com/rancher/rke2/issues/775
Введение
Kafka широко используется в распределённых системах для обмена сообщениями между сервисами, и в современных production окружениях требуется настройка шифрования и аутентификации.
Основные значения и настройки Kafka
-
security.protocol — Описание протокола безопасности соединения:
-
PLAINTEXT: Соединение без шифрования и аутентификации.
-
SSL: Соединение с шифрованием через SSL/TLS, но без аутентификации.
-
SASL_PLAINTEXT: Соединение с аутентификацией через SASL без шифрования.
-
SASL_SSL: Соединение с аутентификацией через SASL и шифрованием через SSL.
-
-
sasl.mechanism - механизм аутентификации, использующийся с SASL
-
PLAIN : Аутентификация через логин и пароль, передаваемые в открытом виде (без шифрования).
-
SCRAM-SHA-256: Аутентификация через SCRAM с использованием алгоритма SHA-256 для хэширования паролей.
-
SCRAM-SHA-512: Аутентификация через SCRAM с использованием алгоритма SHA-512 для хэширования паролей.
-
Таблица комбинаций security.protocol и sasl.mechanism
| security.protocol | sasl.mechanism | Описание | Шифрование | Логин и пароль | mTLS* | mTLS игнорируется если включен (Не имеет никакого эффекта) |
|---|---|---|---|---|---|---|
| PLAINTEXT | - | Без шифрования и аутентификации | ❌ | ❌ | ❌ | ✔️ |
| SSL | - | Шифрование через SSL/TLS, без аутентификации | ✔️ | ❌ | ✔️ | ❌ |
| SASL_PLAINTEXT | PLAIN | Аутентификация через SASL без шифрования (логин и пароль передаются в открытом виде) | ❌ | ✔️ | ❌ | |
| SASL_PLAINTEXT | SCRAM-SHA-256 | Аутентификация через SCRAM с использованием SHA-256 (пароль передается в хэшированном виде) | ❌ | ✔️ | ❌ | |
| SASL_PLAINTEXT | SCRAM-SHA-512 | Аутентификация через SCRAM с использованием SHA-512 (пароль передается в хэшированном виде | ❌ | ✔️ | ❌ | |
| SASL_SSL | PLAIN | Аутентификация через SASL с шифрованием через SSL (логин и пароль передаются в открытом виде) | ✔️ | ✔️ | ✔️⚠️(Поддерживается, но по факту mTLS игнорируется и используется SASL) | Включение\выключение mTLS не играет роли, Kafka игнорирует mTLS |
| SASL_SSL | SCRAM-SHA-256 | Аутентификация через SCRAM с использованием SHA-256 и шифрованием через SSL | ✔️ | ✔️ | ✔️⚠️(Поддерживается, но по факту mTLS игнорируется и используется SASL) | Включение\выключение mTLS не играет роли, Kafka игнорирует mTLS |
| SASL_SSL | SCRAM-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
Получаем сертификат от сервера и проверяем что он выпущен доверенным центром сертификации. (Проверка сертификата только на стороне клиента)

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