定义 Kafka ACL 限制主题创建

Define Kafka ACL to limit topic creation

我们目前 运行 AWS MSK 上的一个不安全的 Kafka 设置(所以我无法直接访问大多数配置文件,需要使用 kafka-cli)并且正在研究增加保护的方法.设置 TLS 和 SASL 很容易,尽管我们的 Kafka 集群位于 VPN 后面并且已经限制访问并不会增加更多安全性。

我们想从最重要的和我们认为速效的安全添加开始。保护主题不被所有用户删除(和创建)。 我们目前将 allow.everyone.if.no.acl.found 设置为 true

我在 Google 或 Stack Overflow 上找到的所有内容向我展示了如何限制用户从 reading/writing 访问他们无法访问的其他主题。虽然理想情况下,这不是我们想要作为第一步实施的目标。

我找到了有关 root 用户的信息(是管理员用户,尽管在我阅读的所有教程中都被称为 root)。尽管我找到的示例没有显示向此根用户添加 ACL 以使其成为唯一可访问的示例,但主题 deletion/creation.

你能解释一下如何创建一个用户并阻止所有其他用户吗?

顺便说一下,我们也不使用 zookeeper,即使 MSK 集群默认使用它。并希望我们可以在不主动将 zookeeper 添加到我们的堆栈中的情况下做到这一点。给出的答案 hardly relies on zookeeper. Also, this answer 仅指向主题 read/write 示例,即使问题与我的问题相同

首先我要声明一个免责声明,我个人对 AWS MSK 产品的细节并不熟悉,所以这个答案主要基于我对 Apache Kafka 开源发行版的理解。

First - 默认情况下,Kafka ACL 实际上存储在 Zookeeper 中,因此如果您不使用 Zookeeper,可能值得添加它。

参考 - Kafka Definitive Guide - 2nd edition - 第 11 章 - 保护 Kafka - 第 294 页

第二 - 如果您使用 SASL 通过任何受支持的机制(例如 GSSAPI (Kerberos))进行身份验证,那么您需要像往常一样创建主体通常创建一个并使用以下选项之一:

  1. 使用kafka-acls 命令添加主题creation/deletion 等所需的权限(Command Reference)

    bin/kafka-acls.sh --add --cluster --operation Create --authorizer-properties zookeeper.connect=localhost:2181 --allow-principal User:admin

    注意 - admin 是假定的主体名称

  2. 或者通过添加以下行将 admin 用户添加到 server.properties 文件中的超级用户列表,这样它就可以不受限制地访问所有资源

    super.users=User:Admin

    可以在由 ; 分隔的同一行中添加更多用户。

要增加严格性,您需要将 allow.everyone.if.no.acl.found 设置为 false,以便只有明确添加这些权限才能授予对任何资源的任何访问权限。

Third - 由于您特别询问了您的 root 用户,我假设您在这里指的是 linux root。您可以使用 kafka-acls.sh 脚本的 chmod 命令来限制 linux 级别的权限,但这是实现您需要的一种相当粗糙的方法。我也不完全确定这在 MSK 中是否可行。

郑重声明,我运行以下命令使其工作。

1 个可以管理集群的管理员(根)用户,尽管 allow.everyone.if.no.acl.found 设置为 true 所有没有 ACL 的用户只能 read/write 访问主题。

# Define ACL for test_admin user
/kafka/bin/kafka-acls.sh \
  --bootstrap-server $BROKERS \
  --command-config /app/accounts/test_admin.properties \
  --add \
  --allow-principal User:test_admin \
  --operation Alter \
  --operation Create \
  --operation Describe \
  --operation DescribeConfigs \
  --allow-host '*' \
  --cluster

# Define ACL for Broker (ANONYMOUS) user
/kafka/bin/kafka-acls.sh \
  --bootstrap-server $BROKERS \
  --command-config /app/accounts/test_admin.properties \
  --add \
  --allow-principal User:ANONYMOUS \
  --operation ALL \
  --cluster

# Define ACL for all users to only give them read/write
/kafka/bin/kafka-acls.sh \
  --bootstrap-server $BROKERS \
  --command-config /app/accounts/test_admin.properties \
  --add \
  --allow-principal User:* \
  --operation Read \
  --operation Write \
  --topic '*' \
  --allow-host '*'