【问题标题】:Define Kafka ACL to limit topic creation定义 Kafka ACL 以限制主题创建
【发布时间】:2022-01-21 08:13:17
【问题描述】:

我们目前正在 AWS MSK 上运行不安全的 Kafka 设置(因此我无法直接访问大多数配置文件,需要使用 kafka-cli)并且正在寻找增加保护的方法。设置 TLS 和 SASL 很容易,但由于我们的 Kafka 集群位于 VPN 之后并且已经限制访问并不会增加安全性。

我们希望从最重要且在我们看来能快速获胜的安全添加开始。保护主题不被所有用户删除(和创建)。 我们目前将allow.everyone.if.no.acl.found 设置为true。

我在 Google 或 Stack Overflow 上找到的所有内容都向我展示了如何限制用户阅读/写入他们无法访问的其他主题。虽然理想情况下,这不是我们想要实现的第一步。

我发现了有关 root 用户的信息(虽然是管理员用户,但在我阅读的所有教程中都称为 root)。虽然我发现的示例没有显示向该根用户添加 ACL 以使其成为唯一可访问的示例,即主题删除/创建。

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

顺便说一句,我们也不使用 zookeeper,尽管 MSK 集群默认广告。并希望我们可以在不主动将 zookeeper 添加到我们的堆栈中的情况下做到这一点。 here 给出的答案几乎不依赖于动物园管理员。此外,this answer 仅指向主题读/写示例,即使问题与我所问的相同

【问题讨论】:

  • 为什么不能使用 IAM 角色?您可以允许读取用户特定的集群和主题。
  • 这是一个有效的问题,我不能使用 IAM 角色,因为 Ruby 库依赖于 librdkafka,他们don't want to add support 是我们需要的 AWS_MSK_IAM 机制。 IAM 本来是我的首选方式,尽管没有这种额外的复杂性。

标签: apache-kafka acl aws-msk kafka-topic


【解决方案1】:

为了记录,我运行了以下命令以使其工作。

可以管理集群的 1 个管理员(root)用户,尽管 allow.everyone.if.no.acl.found 设置为 true,但所有没有 ACL 的用户只能读取/写入主题。

# 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 '*'

【讨论】:

    【解决方案2】:

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

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

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

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

    1. 使用kafka-acls 命令(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,因此只有通过显式添加这些权限才能授予对任何资源的任何访问权限。

    第三 - 正如您专门询问您的 root 用户,我假设您在这里指的是 linux 根目录。您可以使用kafka-acls.sh 脚本的chmod 命令来限制linux 级别的权限,但这是实现您所需要的相当粗略的方法。我也不完全确定这在 MSK 中是否可行。

    【讨论】:

    • 感谢您的回复。 root 用户是管理员用户。尽管在我阅读的所有文档中,它都被称为 root 用户,所以这就是我使用该名称的原因 :) 即使您的回答很好解释。它对我的问题没有帮助|:设置访问权限以删除/创建某个用户的主题,而不向所有其他用户添加访问权限。您能否添加一些可以回答我的问题或帮助我进行搜索的内容?
    • 您将通过上述步骤获得此信息。您已经拒绝了其他所有人的一切...在建议的步骤之后,您将拥有一个具有创建权限的特定管理员用户,而没有其他人...您需要在需要时为特定用户添加访问权限。
    • 还是我没收到问题?
    • 你的问题是正确的,我只是不明白。你在这里添加的评论让我明白了。谢谢!
    • 哦,好的。让我在答案中也添加这部分。答案应该足以让读者理解。 :)感谢您的反馈。 :)
    猜你喜欢
    • 1970-01-01
    • 2016-11-29
    • 1970-01-01
    • 2020-01-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2017-08-12
    • 2021-02-28
    相关资源
    最近更新 更多