Расширенная конфигурация 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