5. Безопасность
Kafka в production нужно защищать по трём слоям:
- аутентификация (кто ты?) —
SASL(PLAIN, SCRAM, OAUTH) - шифрование (как передаётся?) —
TLS - авторизация (что ты можешь?) —
ACL
Ниже — практический production-подход: минимально необходимые настройки + как правильно обращаться с сертификатами и секретами.
Термины и сущности
| Термин | Определение |
|---|---|
| Principal | Идентичность (пользователь/сервис) в Kafka security модели. |
| SASL | Механизм аутентификации (pluggable), например SCRAM или OAuth. |
| SCRAM | SASL-механизм на базе challenge-response с паролем (Salted/hashed). |
| PLAIN | Простой SASL-механизм (используйте только вместе с TLS, иначе это небезопасно). |
| OAUTH | Аутентификация на основе токенов (OIDC/JWT) вместо статического пароля. |
| TLS | Шифрование трафика + валидация сертификатов (серверные и клиентские цепочки). |
| ACL | Правила доступа: кто (principal) на что (ресурс) и чем (операции) имеет право. |
Аутентификация: SASL (PLAIN, SCRAM, OAUTH)
SASL PLAIN
Когда использовать:
- только в связке с
TLS, - когда SCRAM/UAuth пока не готовы.
Production best practices:
- не используйте PLAIN без TLS,
- ограничьте доступ по сеть/Ingress + TLS,
- храните пароли/секреты в Vault/secret store, а не в конфигурации.
SASL SCRAM
Плюсы:
- стабильный и широко поддерживаемый production-механизм,
- проще расследовать доступ, чем с “токенами в вакууме”.
Min-setup:
- настроить SCRAM users (в Kafka — via соответствующей утилиты),
- включить
listeners/security.protocolи SASL механизм.
SASL OAUTH (через OIDC/JWT)
Плюсы:
- единая модель identity через IAM,
- ротация токенов без “ручного перезапуска” паролей.
Production best practices:
- используйте короткоживущие токены и корректные claims,
- проверяйте clock skew (время) на всех компонентах,
- заранее определяйте policy маппинга claim’ов -> principal.
Шифрование: TLS (включая TLS между broker’ами)
Что обязательно определить в настройке
1) Как брокер слушает соединения (какой listener):
- internal/inter-broker listener (для broker↔broker),
- client listener (для producer/consumer).
2) Где лежат сертификаты и ключи:
- keystore,
- truststore,
- CA цепочка,
- и требование к клиентской аутентификации (mTLS).
Пример: фрагмент server.properties (idea)
# Для inter-broker связи важно задавать отдельный listener
inter.broker.listener.name=INTERNAL
listener.security.protocol.map=INTERNAL:SASL_SSL,CLIENT:SASL_SSL
listeners=INTERNAL://0.0.0.0:9093,CLIENT://0.0.0.0:9092
# TLS settings (пример)
ssl.keystore.location=/etc/kafka/tls/keystore.p12
ssl.keystore.password=${KEYSTORE_PASSWORD}
ssl.key.password=${KEY_PASSWORD}
ssl.truststore.location=/etc/kafka/tls/truststore.p12
ssl.truststore.password=${TRUSTSTORE_PASSWORD}
# production: часто включают mTLS для внутреннего транспорта
ssl.client.auth=required
Комментарий:
- точные пути/форматы сертификатов зависят от того, как вы получаете и монтируете certs,
- пароли ключей должны приходить из секретов, а не из plain-text.
Авторизация: ACL (кто что может)
ACL — это правила вида:
- principal (кто),
- ресурс (что),
- операции (что именно: чтение/запись/обслуживание),
- при необходимости — условие по consumer group’ам/кластерам.
Production best practices для ACL
- принцип наименьших привилегий (least privilege),
- разделяйте роли сервисов (producer’ы отдельно от consumer’ов),
- ограничивайте операции строго по нужным сценариям,
- не “давайте everything” на время отладки: вместо этого делайте temporary policy и удаляйте.
Мини-пример: выдача прав через kafka-acls
Утилита и формат команды зависят от вашей версии Kafka. Ниже — шаблон логики:
# Важно: используйте principal’ы, которые реально соответствуют вашему SASL механизму
kafka-acls.sh \
--bootstrap-server kafka-0.kafka:9092 \
--add \
--principal "User=orders-api" \
--operation Describe \
--resource-type <RESOURCE_KIND> \
--resource-name <RESOURCE_NAME_PATTERN> \
--group <OPTIONAL_GROUP_FOR_CONSUMERS>
Комментарий:
- вместо
<RESOURCE_KIND>/<RESOURCE_NAME_PATTERN>подставьте ваши реальные значения, - для consumer’ов обычно нужны дополнительные права на group/offset-подобные операции.
DevOps-фокус: secrets management (Vault / IAM / ротация)
Принципы
- сертификаты и пароли не должны жить в Git,
- ротация не должна требовать ручного вмешательства на каждый broker,
- одинаковые секреты должны быть доступны и internal (mTLS), и client listeners.
Пример: initContainer для загрузки TLS-артефактов
Идея: на старте pod скачивает сертификаты/ключи из Vault и пишет их в emptyDir.
volumes:
- name: tls
emptyDir: {}
initContainers:
- name: fetch-certs
image: hashicorp/vault:1.18
command: ["sh", "-c"]
args:
- >
vault kv get -field=keystore.p12 secret/kafka/tls
> /tls/keystore.p12 &&
vault kv get -field=truststore.p12 secret/kafka/tls
> /tls/truststore.p12
volumeMounts:
- name: tls
mountPath: /tls
containers:
- name: kafka
volumeMounts:
- name: tls
mountPath: /etc/kafka/tls
Комментарий:
- в реальном проекте вам понадобится auth к Vault (Kubernetes auth/JWT/OIDC),
- для production лучше управлять доступом через отдельные service account’ы и минимальные политики Vault.
Production checklist
| Что сделать | Зачем |
|---|---|
| Включить TLS для всех listener’ов | защита данных в transit |
| Защитить internal broker↔broker mTLS (где возможно) | уменьшение поверхности атаки |
| Использовать SCRAM или OAuth вместо PLAIN | сильнее security-профиль |
| Ввести least privilege ACL по сервисам | снижение blast radius |
| Секреты и certs держать в Vault/IAM и ротировать | исключить “вечные” ключи |