В предыдущей статье мы настроили и проверили аутентификацию по протоколу SASL с механизмом PLAIN через SSL. Настало время познакомиться с авторизацией в Kafka!
Предыдущая статья. Следующая статья.
Полный список статей по теме тут.
Заходите в наш телеграмм канал — Enterprise Stack Helper! Делитесь опытом или задавайте вопросы, если что-то непонятно.
Репозитории с примерам из статей по способам аутентификаци и авторизации — https://github.com/BlockWit/kafka-security-examples.
ACL в Kafka
Давайте вспомним основную информацию из первой статьи:
- Авторизация — это процесс проверки — имеет ли право пользователь выполнять те или иные действия над ресурсом
- Авторизация настраивается независимо от аутентификации
- Авторизация, если она настроена, выполняется после аутентификации
- Kafka имеет встроенный авторизатор на базе ACL
А теперь подробнее о некоторых пунктах.
Авторизация настраивается независимо от аутентификации. Т.е. независимо от любой схемы аутентификации мы можем добавить конфигурацию авторизации на сервер и она будет работать.
Kafka имеет встроенный авторизатор на базе ACL. ACL — это просто списки, в которых описано кому над каким ресурсом можно совершать действия.
Авторизатор включается так:
Еще нужно добавить опцию:
Что она означает? Она делает вот что:
- Если топик, группа или другой объект не имеют ни одной записи в списке ACL, то доступ к этому топику, группе или другому объекту разрешен для всех!
- Если топик, группа или другой объект имеет хотя бы одну ACL запись, то доступ к этому топику, группе или объекту разрешен тем, у кого есть соответствующие права, и суперпользователям.
Если allow.everyone.if.no.acl.found=false, то:
- Если топик, группа или другой объект не имеют ни одной записи в списке ACL, то доступ к этому топику, группе или другому объекту разрешен только суперпользователям.
- Если топик, группа или другой объект имеет хотя бы одну ACL запись, то доступ к этому топику, группе или объекту разрешен тем, у кого есть соответствующие права, и суперпользователям.
Зачем же мы установили allow.everyone.if.no.acl.found в true? Логичным было бы запретить доступ ко всем топикам, если у пользователя нет прав. Это сделано сейчас для удобства, чтобы мы могли быстро настроить ACL.
Дело в том, что у нас есть межброкерное взаимодействие на 9092 порту. Для сервсных операций Kafka. (Подробнее в в этой статьей). И на 9092 порту нет аутентификации. Это значит, что сервер не сможет определить «личность» клиента. А значит и не сможет провести авторизацию по ACL! Ведь ACL авторизатор работает для всех соединений сразу. В итоге клиент на 9092 порту не получит вообще никаких прав. А это значит, что Kafka не сможет выполнять сервисные операции. И работать наш сервер корректно не будет. А в логах сможем увидеть такую ошибку:
Сервисные операции касаются конфигурации самой Kafka (конфигурации кластера, если быть точным). Поскольку мы им не указывали списки доступа ACL, то мы можем поставить опцию — allow.everyone.if.no.acl.found в true. Таким образом, неаутентифицированный сервисный клиент получит возможность выполнять ВСЕ операции над конфигурацией Kafka. Таким образом, межброкерное взаимодействие будет работать корректно.
Безусловно, такой подход — дыра в безопасности. И мы ее исправим в ближайших статьях, когда будем настраивать аутентификацию для межброкерного взаимодействия. А пока поработаем с этой опцией.
С конфигурационным файлом сервера все. Однако нам нужно теперь сконфигурировать сами списки ACL.
В этом нам помогут команды:
- Просмотр списков ACL для топика [TOPICNAME]
- Разрешить пользователю [USERNAME] выполнять операцию [OPERATION] над топиком [TOPICNAME]
- Запретить пользователю [USERNAME] выполнять операцию [OPERATION] над топиком [TOPICNAME]
Обратите внимание, что в командах указывается соединение с ZooKeeper. Дело в том, что Kafka хранит списки ACL в ZooKeeper.
Теперь давайте приступим к практике.
Авторизация ACL с SASL_SSL и PLAIN
Для начала запустим Kafka и добавим в списки ACL право Алисе (у нас она alice) выполнять любые действия (обозначается как ALL) над топиком stats.store.
После выполнения команды Kafka даст нам знать, что права изменены:
Отлично. Теперь скопируем конфигурацию SASL_SSL+PLAIN для сервера из предыдущей статьи. И добавим к ней конфигурацию авторизатора. Приведем полную конфигурацию:
Не забывайте менять localhost, ssl.keystore.location и ssl.keystore.password на свои!
Настройки клиента остаются такие же, как и в предыдущей статье.
Не забывайте менять localhost, ssl.truststore.location и ssl.truststore.password на свои!
Запустим Kafka, потом клиент и получим вывод успешной отправки сообщений:
Резюме
В этой статье мы узнали, как добавлять авторизацию ACL к любой схеме аутентификации в Kafka.
В следующей статье мы рассмотрим права ACL в Kafka более детально.
Предыдущая статья. Следующая статья.
Полный список статей по теме тут.
Заходите в наш телеграмм канал — Enterprise Stack Helper! Делитесь опытом или задавайте вопросы, если что-то непонятно.
Репозитории с примерам из статей по способам аутентификаци и авторизации — https://github.com/BlockWit/kafka-security-examples.