Kafka: Часть 9 — Описание ACL прав Kafka

В предыдущей статье мы узнали, как настраивать авторизацию ACL с аутентификацией. В этой статье мы расскажем о основных операциях (правах) в списках ACL Kafka.

Предыдущая статья. Следующая статья.

Полный список статей по теме тут.

Заходите в наш телеграмм канал — Enterprise Stack Helper! Делитесь опытом или задавайте вопросы, если что-то непонятно.

Репозитории с примерам из статей по способам аутентификаци и авторизации https://github.com/BlockWit/kafka-security-examples.

 

Операции в списках ACL Kafka

В предыдущей статье для проверки работы авторизации AC, мы давали все (ALL) права клиенту, чтобы не разбираться. Но, как Вы понимаете, это не безопасно. Зачем вводить систему авторизации, если мы все равно даем все права? Это было сделано для простоты рассмотрения примера. Сейчас настало время разобраться с операциями и настроить списки ACL правильно.

Мы рассмотрим пока только некоторые операции необходимые для управления топиками и группами. Названия у них говорят сами за себя, поэтому пояснять детально не будем.

  • All — все права
  • Read — право на чтение. Например, из топика или их группы
  • Write — право на запись. Например, в топик или группы
  • Create — создание. Например, право на запись в топик или группу
  • Delete — удаление
  • Alter — изменение

Список актуальных операций всегда можно посмотреть в репозитории в исходном коде Kafka (https://github.com/apache/kafka/blob/24f664aa1621dc70794fd6576ac99547e41d2113/clients/src/main/java/org/apache/kafka/common/acl/AclOperation.java)

Работу некоторых из этих операций мы рассмотрим на примере топиков и групп. Вспомним команды, которые мы рассмотрели в предыдущей статье для управления списками ACL:

  • Разрешить пользователю [USERNAME] выполнять операцию [OPERATION] над топиком [TOPICNAME]
  • Запретить пользователю [USERNAME] выполнять операцию [OPERATION] над топиком [TOPICNAME]
  • Просмотреть списки прав

Посмотрите внимательно на команду удаления и добавления прав. В них есть параметр
—topic [TOPICNAME]

Если Вы его замените на
—group [GROUPNAME]
то получите команду удаления или добавления прав выполнения операции над группой!

Отлично, теперь давайте рассмотрим настройку на конкретных примерах.

Примеры использования

Для выполнения примеров будем использовать настройки Kafka и клиент из предыдущей статьи. Приводить код тут не будем, поскольку он не изменится. За исключением, конечно, клиента. В нем нужно будет менять username и password для конкретного примера.

Прежде чем выполнять примеры, убедитесь что у пользователей нет никаких прав. И, если они есть, то удалите их.

Пример с топиком

Давайте дадим Алисе право на запись в топик topic.alice, а также право на создание топика topic.alice. Право на создание дается, потому что такого топика еще нет и при первой записи в него Алисе потребуется его создать. Обратите внимание, что мы даем право на две операции одной командой:

А теперь попытаемся писать в топик от имени Алисы с помощью нашего клиента (поменяйте в клиенте учетные данные и название топика). В результате получим:

Топик создался и сообщения благополучно в него пишутся.

А давайте попробуем писать в этот же топик, но от имени Робина. Поменяйте в клиенте учетные данные на логин и пароль Робина: robin, robin-secret и запустите клиент. В результате получим:

Как видите, наши настройки прав успешно работают в случае записи в топик.

Пример с группой

С группами не все так однозначно, как с топиками. Для того, чтобы клиент мог читать из группы, необходимо дать клиенту право на чтение из топика, из которого будем читать и право на чтение из группы, из которой будем читать. Если такой группы нет, то она создастся автоматически и право на создание группы не потребуется.

Давайте дадим Робину право на чтение из топика Алисы topic.alice и право на чтение из группы group.robin.from.alice.

Для чтения сообщение нам потребуется соответствующий клиент. В репозитории он называется SimpleConsumer. Давайте приведем код клиента:

И код, который будет его запускать:

И давайте запустим клиент. В итоге, мы получим информацию о том, что прочитано одно сообщение:

Что собой представляет операция чтения из группы? Это операция считывания сообщения и операция сохранения в группе номера следующего за считываемым сообщением, чтобы при следующем чтении из группы Kafka отдавала уже следующее сообщение. Номер следующего сообщения называется смещением, а операция установки смещения — коммит.

А теперь давайте попробуем считать Алисой сообщения из своего топика — alice.topic из группы group.robin.from.alice. Но для этого она должна иметь право на чтение из этого топика. Ранее мы давали только право на запись и создание. Давайте дадим право на чтение:

У Алисы нет прав на чтение из группы group.robin.from.alice . Как же поведет себя клиент? Измените учетные данные клиента на логин и пароль Алисы и запустите. В результате мы получим несколько странный вывод. Сообщение прочитается:

Но коммит  упадет с ошибкой:

Получается что запрет на чтение из группы — это вовсе не запрет просмотра сообщения из топика. Сообщения из топика мы можем просматривать, если у нас есть права на чтение из топика. А вот изменять параметр оффсета в группе мы не можем. Неоднозначно, но вполне логично.

Резюме

В этой статье мы ознакомились с основными правами ACL в Kafka и рассмотрели пару примеров работы с ними. В следующей статье мы добавим защиту к межброкерному взаимодействию.

Предыдущая статья. Следующая статья.

Полный список статей по теме тут.

Заходите в наш телеграмм канал — Enterprise Stack Helper! Делитесь опытом или задавайте вопросы, если что-то непонятно.

Репозитории с примерам из статей по способам аутентификаци и авторизации https://github.com/BlockWit/kafka-security-examples.

 

Добавить комментарий