ACL в Kafka
В данной статье описаны основные действия для работы с авторизацей AСL в Kafka.
Access Control List (ACL) — список управления доступом, который определяет, кто может получать доступ к топикам или группам в Kafka и какие именно операции разрешено или запрещено выполнять пользователю или группе пользователей.
Kafka имеет AclAuthorizer — встроенный авторизатор на базе ACL.
Cписки авторизации ACL для Kafka хранятся в ZooKeeper.
Включение ACL в Kafka
|
ПРИМЕЧАНИЕ
Перед настройкой авторизации для кластера ADS должна быть включена и настроена аутентификация и созданы пользователи при помощи одного из протоколов: |
Чтобы включить и использовать AclAuthorizer, необходимо выполнить:
-
На хосте с брокером Kafka ввести команду:
$ sudo vim /usr/lib/kafka/config/server.properties -
Добавить в файл новые параметры :
authorizer.class.name=kafka.security.authorizer.AclAuthorizer allow.everyone.if.no.acl.found=trueгде:
-
authorizer.class.name— установка класса авторизатора. -
allow.everyone.if.no.acl.found— параметр, определяющий, включать ли авторизацию только для топиков, внесенных в список ACL.
-
-
После внесения данных рестартовать сервис Kafka на всех хостах с брокером Kafka и проверить статус сервера. Для этого поочередно ввести команды:
$ sudo systemctl restart kafka $ sudo systemctl status kafkaВ результате выводится информация о статусе сервиса Kafka:
kafka.service - Apache Kafka
Loaded: loaded (/usr/lib/systemd/system/kafka.service; enabled; vendor preset: disabled)
Drop-In: /etc/systemd/system/kafka.service.d
└─custom.conf
Active: active (running) since Wed 2022-10-12 12:48:49 UTC; 52s ago
Process: 8782 ExecStop=/usr/lib/kafka/bin/kafka stop (code=exited, status=0/SUCCESS)
Process: 8857 ExecStart=/usr/lib/kafka/bin/kafka start (code=exited, status=0/SUCCESS)
Process: 8854 ExecStartPre=/bin/chown kafka:kafka /run/kafka (code=exited, status=0/SUCCESS)
Process: 8852 ExecStartPre=/bin/mkdir -p /run/kafka (code=exited, status=0/SUCCESS)
Main PID: 8860 (java)
Tasks: 82
Memory: 298.6M
CGroup: /system.slice/kafka.service
└─8860 java -Xmx1G -Xms1G -server -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOcc...
Oct 12 12:48:49 sov-ads-test-1.ru-central1.internal systemd[1]: Starting Apache Kafka...
Oct 12 12:48:49 sov-ads-test-1.ru-central1.internal systemd[1]: Started Apache Kafka.
|
ВНИМАНИЕ
Перезапуск сервиса Kafka при помощи средств пользовательского интерфейса ADCM может привести к удалению установленного значения |
Подготовка среды аутентификации к созданию списков авторизации ACL
SASL PLAINTEXT
Для создания среды пользователя, указанного при аутентификации по протоколу SASL PLAINTEXT, необходимо:
-
На хосте с брокером Kafka ввести команду:
$ sudo vim /etc/kafka/conf/client.properties -
В открывшемся файле включить (раскомментировать) механизм аутентификации и заполнить данные для созданного пользователя:
security.protocol=SASL_PLAINTEXT sasl.mechanism=PLAIN # Uncomment and set necessary username/password #sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule requi$ # username="username" \ # password=password_for_username;
Дополнительные сведения о работе с пользователями в среде аутентификации SASL PLAINTEXT можно найти в статье Использование SASL PLAINTEXT в Kafka.
Kerberos SASL
Для создания среды пользователя, указанного при аутентификации по протоколу Kerberos SASL, необходимо:
-
Cоздать JAAS-файл (Java Authentication and Authorization Service) для принципала
user, управляющего списками AСL. Выполнить команду:$ sudo vim /tmp/client.jaas -
Внести данные в файл:
KafkaClient { com.sun.security.auth.module.Krb5LoginModule required useTicketCache=true; }; -
Создать тикет для пользователя
user:$ kinit -p user@ADS-KAFKA.LOCAL -
Проверить тикет:
$ klistTicket cache: FILE:/tmp/krb5cc_1000 Default principal: user@ADS-KAFKA.LOCAL Valid starting Expires Service principal 08/10/2022 20:44:12 08/11/2022 20:44:12 krbtgt/ADS-KAFKA.LOCAL@ADS-KAFKA.LOCAL
-
Экспортировать созданный файл client.jaas как параметр JVM для данного пользователя при помощи переменной среды
KAFKA_OPTS:
$ export KAFKA_OPTS="-Djava.security.auth.login.config=/tmp/client.jaas"
Дополнительные сведения о работе с пользователями в среде аутентификации Kerberos SASL можно найти в статье Использование MIT Kerberos в Kafka.
Конфигурация списков ACL
Работа с авторизацией на основе ACL происходит путем запуска скрипта kafka-acls.sh в командной строке с любого узла кластера, на котором установлен сервис Kafka.
|
ПРИМЕЧАНИЕ
Для просмотра всех опций для скрипта kafka-acls.sh необходимо выполнить команду:
|
Назначение прав и запретов на отдельные действия в Kafka для пользователей
Назначение прав или запретов на отдельные действия пользователю осуществляется при помощи скрипта kafka-acls.sh с указанием опции --operation и операции, на которую дается доступ.
Назначение прав или запретов осуществляется при помощи опции --add.
Опция --allow-principal — разрешает действие, а --deny-principal — запрещает действие.
Удаление пользователя из списка ACL выполняется при помощи опции --remove.
Основные операции, для которых можно установить права пользователя:
-
Describe— просмотр метаданных топика или группы. -
DescribeConfigs— просмотр конфигурации топика. -
Alter— изменение топика или группы. -
IdempotentWrite— запись в топик для идемпотентных и транзакционных API. -
Read— право на чтение из топика или из группы. -
Delete— удаление топика или группы. -
Create— создание топика или группы. -
All— все права. -
Write— право на запись в топик или группы. -
AlterConfigs— изменение конфигурации топика.
|
ПРИМЕЧАНИЕ
Для пользователей, прошедших аутентификацию по протоколу Kerberos SASL или LDAP, в составлении списков ACL используется имя пользователя без обозначения области аутентификации (realm). |
Для того, чтобы разрешить пользователю username выполнять операцию WRITE над топиком test-topic, необходимо на хосте с брокером Kafka ввести команду:
$ /usr/lib/kafka/bin/kafka-acls.sh --bootstrap-server localhost:9092 --command-config /etc/kafka/conf/client.properties --add --allow-principal User:username --operation WRITE --test-topic
Для того, чтобы запретить пользователю username1 выполнять операцию WRITE над топиком test-topic, необходимо на хосте с брокером Kafka ввести команду:
$ /usr/lib/kafka/bin/kafka-acls.sh --bootstrap-server localhost:9092 --command-config /etc/kafka/conf/client.properties --add --deny-principal User:username1 --operation WRITE --test-topic
В результате каждого добавления в список появляется сообщение об успешном добавлении прав или запрете, а также список ACL c текущими правами пользователей для топика:
Adding ACLs for resource `ResourcePattern(resourceType=TOPIC, name=test-topic, patternType=LITERAL)`: (principal=User:username, host=*, operation=WRITE, permissionType=ALLOW) Current ACLs for resource `ResourcePattern(resourceType=TOPIC, name=test-topic, patternType=LITERAL)`: (principal=User:username, host=*, operation=CREATE, permissionType=ALLOW) (principal=User:username1, host=*, operation=CREATE, permissionType=DENY)
Назначение прав producer и consumer пользователю
Существует возможность назначить пользователю сразу несколько прав производителя (producer) — создание (create), запись (write), просмотр метаданных (describe).
Чтобы добавить права producer для топика test-topic пользователю writer, необходимо на хосте с брокером Kafka ввести команду:
$ /usr/lib/kafka/bin/kafka-acls.sh --bootstrap-server localhost:9092 --command-config /etc/kafka/conf/client.properties --add --allow-principal User:writer --producer --topic test-topic
В результате появляется сообщение об успешном добавлении прав producer и список ACL c текущими правами пользователей для топика:
Adding ACLs for resource `ResourcePattern(resourceType=TOPIC, name=test-topic, patternType=LITERAL)`: (principal=User:writer, host=*, operation=CREATE, permissionType=ALLOW) (principal=User:writer, host=*, operation=WRITE, permissionType=ALLOW) (principal=User:writer, host=*, operation=DESCRIBE, permissionType=ALLOW) Current ACLs for resource `ResourcePattern(resourceType=TOPIC, name=test-topic, patternType=LITERAL)`: (principal=User:writer, host=*, operation=WRITE, permissionType=ALLOW) (principal=User:writer, host=*, operation=CREATE, permissionType=ALLOW) (principal=User:writer, host=*, operation=DESCRIBE, permissionType=ALLOW)
Также существует возможность назначить сразу несколько прав потребителя (consumer) — чтение (read), просмотр метаданных (describe).
Чтобы добавить права consumer для топика test-topic пользователю reader, необходимо на хосте с брокером Kafka ввести команду:
$ /usr/lib/kafka/bin/kafka-acls.sh --bootstrap-server localhost:9092 --command-config /etc/kafka/conf/client.properties --add --allow-principal User:reader --consumer --topic test-topic --group 1
|
ПРИМЕЧАНИЕ
При назначении прав потребителя (consumer) необходимо указать и название топика (topic), и название группы потребителей (group), даже если потребитель всего один.
|
В результате появляется сообщение об успешном добавлении прав consumer и список ACL c текущими правами пользователей для топика test-topic, включая созданные ранее для пользователя writer:
Adding ACLs for resource `ResourcePattern(resourceType=TOPIC, name=test-topic, patternType=LITERAL)`: (principal=User:reader, host=*, operation=DESCRIBE, permissionType=ALLOW) (principal=User:reader, host=*, operation=READ, permissionType=ALLOW) Current ACLs for resource `ResourcePattern(resourceType=TOPIC, name=test-topic, patternType=LITERAL)`: (principal=User:writer, host=*, operation=WRITE, permissionType=ALLOW) (principal=User:writer, host=*, operation=CREATE, permissionType=ALLOW) (principal=User:writer, host=*, operation=DESCRIBE, permissionType=ALLOW) (principal=User:reader, host=*, operation=DESCRIBE, permissionType=ALLOW) (principal=User:reader, host=*, operation=READ, permissionType=ALLOW)
Также выводятся данные о созданных правах для группы потребителей:
Current ACLs for resource `ResourcePattern(resourceType=GROUP, name=1, patternType=LITERAL)`: (principal=User:reader, host=*, operation=DESCRIBE, permissionType=ALLOW) (principal=User:reader, host=*, operation=READ, permissionType=ALLOW)
Просмотр списков ACL
Просмотр списков ACL осуществляется при помощи опции --list.
Для того, чтобы просмотреть список прав для топика test-topic, необходимо выполнить команду:
$ /usr/lib/kafka/bin/kafka-acls.sh --bootstrap-server localhost:9092 --command-config /etc/kafka/conf/client.properties --list --topic test-topic
В результате выводится список всех назначенных прав для топика test-topic:
Current ACLs for resource `ResourcePattern(resourceType=TOPIC, name=test-topic, patternType=LITERAL)`: (principal=User:writer, host=*, operation=WRITE, permissionType=ALLOW) (principal=User:writer, host=*, operation=CREATE, permissionType=ALLOW) (principal=User:writer, host=*, operation=DESCRIBE, permissionType=ALLOW) (principal=User:reader, host=*, operation=DESCRIBE, permissionType=ALLOW) (principal=User:reader, host=*, operation=READ, permissionType=ALLOW)
Для просмотра список прав для всех топиков используется такая же команда без указания имени топика.
Работа авторизованного пользователя в Kafka
После настройки списков ACL для пользователей работа в Kafka происходит в соответствии с шагами, описанными в статьях:
-
Использование MIT Kerberos в Kafka — для пользователя, имеющего принципал в среде, защищенной по протоколу Kerberos SASL.
-
Защита канала по протоколу SSL в Kafka — для пользователя, имеющего принципал в среде, использующей протокол Kerberos SASL с защитой канала по протоколу SSL.
-
Использование Kerberos с MS Active Directory в Kafka — для пользователя, имеющего учетную запись в Active Directory и соответствующий сертификат SSL LDAP-сервера.
Любое действие неавторизованного пользователя вызовет ошибку. Например, попытка записать сообщения в топик test-topic для пользователя, не имеющего разрешения WRITE в списке ACL для данного топика, вызовет ошибки следующего содержания:
[2022-10-12 13:38:57,301] WARN [Producer clientId=console-producer] Error while fetching metadata with correlation id 9 : {test-topic=TOPIC_AUTHORIZATION_FAILED} (org.apache.kafka.clients.NetworkClient)
[2022-10-12 13:38:57,302] ERROR [Producer clientId=console-producer] Topic authorization failed for topics [test-topic] (org.apache.kafka.clients.Metadata)
[2022-10-12 13:38:57,302] ERROR Error when sending message to topic test-topic with key: null, value: 1 bytes with error: (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback)
org.apache.kafka.common.errors.TopicAuthorizationException: Not authorized to access topics: [test-topic]