我正在使用AWS MSK,并且想启用ACL,但是在打开ACL时无法创建主题。我正在使用命令行工具执行所有操作。这是我在做什么的摘要:
因此,问题在于正在Zookeeper上创建主题,但是代理无法访问它。大概是由于我缺少一些ACL规则。
我运行的命令的原始输出:
ubuntu@ip-172-31-27-70:~/kafka_2.12-2.2.1/bin$ ./kafka-topics.sh --bootstrap-server $B --command-config ~/client1.properties \
--create --topic test3 --partitions 1 --replication-factor 1
Error while executing topic command : org.apache.kafka.common.errors.TimeoutException: Aborted due to timeout.
[2019-09-30 17:16:19,389] ERROR java.util.concurrent.ExecutionException: org.apache.kafka.common.errors.TimeoutException: Aborted du
e to timeout.
at org.apache.kafka.common.internals.KafkaFutureImpl.wrapAndThrow(KafkaFutureImpl.java:45)
at org.apache.kafka.common.internals.KafkaFutureImpl.access$000(KafkaFutureImpl.java:32)
at org.apache.kafka.common.internals.KafkaFutureImpl$SingleWaiter.await(KafkaFutureImpl.java:89)
at org.apache.kafka.common.internals.KafkaFutureImpl.get(KafkaFutureImpl.java:260)
at kafka.admin.TopicCommand$AdminClientTopicService.createTopic(TopicCommand.scala:175)
at kafka.admin.TopicCommand$TopicService.createTopic(TopicCommand.scala:134)
at kafka.admin.TopicCommand$TopicService.createTopic$(TopicCommand.scala:129)
at kafka.admin.TopicCommand$AdminClientTopicService.createTopic(TopicCommand.scala:157)
at kafka.admin.TopicCommand$.main(TopicCommand.scala:60)
at kafka.admin.TopicCommand.main(TopicCommand.scala)
Caused by: org.apache.kafka.common.errors.TimeoutException: Aborted due to timeout.
(kafka.admin.TopicCommand$)
再次运行同一命令:
ubuntu@ip-172-31-27-70:~/kafka_2.12-2.2.1/bin$ ./kafka-topics.sh --bootstrap-server $B --command-config ~/client1.properties \
--create --topic test3 --partitions 1 --replication-factor 1
Error while executing topic command : org.apache.kafka.common.errors.TopicExistsException: Topic 'test3' already exists.
[2019-09-30 17:25:38,266] ERROR java.util.concurrent.ExecutionException: org.apache.kafka.common.errors.TopicExistsException: Topic
'test3' already exists.
at org.apache.kafka.common.internals.KafkaFutureImpl.wrapAndThrow(KafkaFutureImpl.java:45)
at org.apache.kafka.common.internals.KafkaFutureImpl.access$000(KafkaFutureImpl.java:32)
at org.apache.kafka.common.internals.KafkaFutureImpl$SingleWaiter.await(KafkaFutureImpl.java:89)
at org.apache.kafka.common.internals.KafkaFutureImpl.get(KafkaFutureImpl.java:260)
at kafka.admin.TopicCommand$AdminClientTopicService.createTopic(TopicCommand.scala:175)
at kafka.admin.TopicCommand$TopicService.createTopic(TopicCommand.scala:134)
at kafka.admin.TopicCommand$TopicService.createTopic$(TopicCommand.scala:129)
at kafka.admin.TopicCommand$AdminClientTopicService.createTopic(TopicCommand.scala:157)
at kafka.admin.TopicCommand$.main(TopicCommand.scala:60)
at kafka.admin.TopicCommand.main(TopicCommand.scala)
Caused by: org.apache.kafka.common.errors.TopicExistsException: Topic 'test3' already exists.
(kafka.admin.TopicCommand$)
通过AdminClient主题列表:
ubuntu@ip-172-31-27-70:~/kafka_2.12-2.2.1/bin$ ./kafka-topics.sh --bootstrap-server $B --command-config ~/client1.properties --list
通过Zookeeper connect的主题列表:
ubuntu@ip-172-31-27-70:~/kafka_2.12-2.2.1/bin$ ./kafka-topics.sh --zookeeper $ZK --command-config ~/client1.properties --list
test
test2
test3
test4
test5
这是我的ACL规则:
Current ACLs for resource `ResourcePattern(resourceType=CLUSTER, name=kafka-cluster, patternType=LITERAL)`:
(principal=User:CN=client1.com, host=*, operation=ALL, permissionType=ALLOW)
Current ACLs for resource `ResourcePattern(resourceType=TOPIC, name=--operation=All, patternType=LITERAL)`:
(principal=User:CN=client1.com, host=*, operation=ALL, permissionType=ALLOW)
我想念什么?
答案 0 :(得分:1)
我认为这与AWS MSK没有任何关系,而这与您的Kafka安全群集配置有关。客户端(订户/生产者)和经纪人之间的操作都需要在安全群集中进行授权。在非托管Kafka群集中,您也会遇到相同的问题。
建议在服务器上设置一个“超级用户”用户(我称它们为服务帐户),然后为这些“超级用户”用户ACL提供允许群集进行经纪人之间交互的ACL。您需要的确切ACL会根据您的用例和安全性偏好而有所不同。
在server.properties
中,您将添加一个类似super.users=User:BrokerService
的条目,并记录在
https://docs.confluent.io/current/kafka/authorization.html#kafka-auth-superuser。该文档建议使用Alice和Bob作为超级用户名,这似乎让我感到困惑。选择适合您的任何用户名。
然后,您需要设置一个类似的ACL,该用户名与在上面创建的“超级用户”用户一起使用用户名主体。 principal=User:BrokerService
。 ACL将授予代理所需的任何权限。您的直接用例是允许阅读所有听起来像是的主题。您可能还需要其他ACL进行经纪人之间的通信,但是如果没有更多关于您想做什么的信息,我无法确切地告诉您您需要什么。
例如,该命令设置ACL。
kafka-acls --authorizer-properties zookeeper.connect=localhost:2181 --add \
--allow-principal User:BrokerService --operation All --topic '*' --cluster
https://docs.confluent.io/current/kafka/authorization.html#acl-format
记录了更多用于设置ACL的选项和对您的确切问题的描述。如果您正在寻找要使用的确切配置,请再次进行更多研究或编辑您的问题,因为所使用的ACL涉及安全性和用例。