当前位置: 首页 > article >正文

Kafka ACL(访问控制列表)介绍

文章目录

  • Kafka ACL(访问控制列表)介绍
  • 1. Kafka ACL 的基本概念
    • 1.1 Kafka ACL 的目标
    • 1.2 Kafka ACL 的组成部分
  • 2. Kafka 支持的资源类型
    • 2.1 Topic(主题)
    • 2.2 Consumer Group(消费者组)
    • 2.3 Cluster(集群)
    • 2.4 TransactionalId(事务 ID)
    • 2.5 Delegation Token(委托令牌)
    • 2.6 ACL 管理与资源类型的结合
  • 3. Kafka ACL 操作命令
    • 3.1 列出现有的 ACL 配置
    • 3.2 添加 ACL 权限
    • 3.3 删除 ACL 权限
    • 3.4 删除所有 ACL 权限
    • 3.5 查看特定资源的 ACL 配置
    • 3.6 仅允许或拒绝特定操作
    • 3.7 组合 ACL 配置
    • 3.8 使用 Wildcard(通配符)进行配置
  • 5. Kafka ACL 管理最佳实践
    • 5.1 最小权限原则(Principle of Least Privilege)
    • 5.2 使用通配符来减少 ACL 配置的复杂性
    • 5.3 强化集群安全性:控制管理权限
    • 5.4 定期审计和监控 ACL 配置
    • 5.5 使用拒绝(Deny)策略明确禁止操作
    • 5.6 结合 Kerberos 和 SASL 强化身份认证
    • 5.7 删除不再需要的 ACL 配置
  • 6. 总结

Kafka ACL(访问控制列表)介绍

Kafka 的 ACL(Access Control List) 是一种用于控制访问权限的机制,它允许 Kafka 集群管理员细粒度地管理用户和应用程序对 Kafka 资源(如主题、消费者组、集群等)的访问权限。通过设置 ACL,Kafka 集群的安全性得到了有效保障,防止未授权的用户执行敏感操作。

1. Kafka ACL 的基本概念

1.1 Kafka ACL 的目标

Kafka ACL 的主要目标是通过细粒度的访问控制来:

  • 限制对敏感资源的访问:确保只有授权的用户或客户端能够执行某些操作(如生产、消费、创建、删除主题等)。
  • 保障数据的安全性:通过控制哪些用户可以访问哪些数据,防止数据泄露或误操作。
  • 管理集群资源:通过对集群管理操作的权限控制,避免不当操作对集群稳定性造成影响。

1.2 Kafka ACL 的组成部分

Kafka ACL 主要由以下几个组成部分:

(1)Principal(主体)

Principal 指执行操作的用户或客户端标识,Kafka 支持两种类型的主体:

  • User:表示特定的用户,格式为 User:<username>
  • ClientId:表示客户端标识,格式为 ClientId:<client-id>

例如,User:alice 表示名为 Alice 的用户,而 ClientId:producer1 表示客户端标识为 producer1 的生产者。

(2)Operation(操作)

Operation 定义了可以执行的操作类型,常见的操作包括:

  • Read:读取操作,允许消费者从主题中读取消息。
  • Write:写入操作,允许生产者将消息发送到主题。
  • Create:创建资源,允许创建新主题或其他资源。
  • Delete:删除资源,允许删除主题等资源。
  • Alter:修改资源,允许修改主题的配置(如分区数等)。
  • Describe:查看资源元数据,允许查看主题、消费者组、集群等的描述信息。
  • ClusterAction:对集群的管理操作,如集群的状态查看、控制等。

(3)Resource(资源)

Resource 是指对哪些 Kafka 资源进行权限控制,Kafka 支持以下几种类型的资源:

  • Topic:主题,是 Kafka 中最常见的资源类型。ACL 主要用于控制对主题的生产和消费权限。
  • Group:消费者组,控制用户或客户端对消费者组的访问。
  • Cluster:集群资源,控制集群级别的操作权限,例如创建、删除主题。
  • TransactionalId:事务 ID,主要用于控制事务操作的权限。

(4)Permission(权限)

Permission 表示是否允许或拒绝特定的操作,Kafka 的 ACL 中有两种权限:

  • Allow:允许执行指定的操作。
  • Deny:拒绝执行指定的操作。

管理员可以通过 AllowDeny 来控制特定用户或客户端对资源的操作权限。

2. Kafka 支持的资源类型

Kafka 支持多种 资源类型,每种资源类型可以应用访问控制列表(ACL)来管理对该资源的访问权限。这些资源类型包括 主题(Topic)消费者组(Consumer Group)集群(Cluster) 等。

2.1 Topic(主题)

Topic 是 Kafka 中最常见的资源类型。它用于存储和组织消息,生产者向主题发送消息,而消费者从主题读取消息。Kafka 的 ACL 可以精确地控制对主题的读写操作。

常见的操作权限

  • Read:允许从主题读取消息。
  • Write:允许向主题写入消息。
  • Create:允许创建新的主题。
  • Delete:允许删除主题。
  • Alter:允许修改主题的配置(如分区数量、保留策略等)。
  • Describe:允许查看主题的元数据(如分区数、日志保留策略等)。

示例

  • 允许用户 alice 写入 test-topic

    bin/kafka-acls.sh --bootstrap-server <broker> --add --allow-principal User:alice --operation Write --topic test-topic
    
  • 允许用户 bob 读取 test-topic

    bin/kafka-acls.sh --bootstrap-server <broker> --add --allow-principal User:bob --operation Read --topic test-topic
    

2.2 Consumer Group(消费者组)

Consumer Group 是 Kafka 中的一种资源类型,它表示一个消费者实例的集合,负责从主题中消费消息。多个消费者可以组成一个消费者组,每个消费者组内的多个消费者共同消费一个主题的消息。Kafka 的 ACL 允许对消费者组设置访问控制权限。

常见的操作权限

  • Read:允许消费者组读取消息。
  • Describe:允许查看消费者组的状态、偏移量等元数据。

示例

  • 允许用户 alicegroup1 消费消息:

    bin/kafka-acls.sh --bootstrap-server <broker> --add --allow-principal User:alice --operation Read --group group1
    
  • 允许用户 bob 查看 group1 的消费者组状态:

    bin/kafka-acls.sh --bootstrap-server <broker> --add --allow-principal User:bob --operation Describe --group group1
    

2.3 Cluster(集群)

Cluster 是 Kafka 集群的资源类型,表示 Kafka 系统本身。集群级别的 ACL 允许对整个集群进行管理操作,如创建、删除、修改主题等操作。

常见的操作权限

  • Create:允许创建主题。
  • Delete:允许删除主题。
  • Describe:允许查看集群状态、元数据等。
  • Alter:允许修改集群级别的配置。

示例

  • 允许用户 admin 创建和删除主题:

    bin/kafka-acls.sh --bootstrap-server <broker> --add --allow-principal User:admin --operation Create --topic *
    bin/kafka-acls.sh --bootstrap-server <broker> --add --allow-principal User:admin --operation Delete --topic *
    
  • 允许用户 admin 查看集群信息:

    bin/kafka-acls.sh --bootstrap-server <broker> --add --allow-principal User:admin --operation Describe --cluster
    

2.4 TransactionalId(事务 ID)

Kafka 中的 TransactionalId 是一种用于管理 Kafka 事务的资源类型,特别是对于支持 事务 的 Kafka 生产者。事务 ID 用于在 Kafka 中处理生产者的事务,确保消息的精确一次传递。

常见的操作权限

  • Read:允许读取事务消息。
  • Write:允许创建或写入事务消息。

示例

  • 允许用户 producer1 使用事务 ID txn-1 写入消息:

    bin/kafka-acls.sh --bootstrap-server <broker> --add --allow-principal User:producer1 --operation Write --transactional-id txn-1
    
  • 允许用户 consumer1 读取事务消息:

    bin/kafka-acls.sh --bootstrap-server <broker> --add --allow-principal User:consumer1 --operation Read --transactional-id txn-1
    

2.5 Delegation Token(委托令牌)

Delegation Token 是一种用于认证和授权的临时凭证,适用于分布式系统中的短期权限授予。在 Kafka 中,委托令牌通常用于支持跨集群访问或通过 OAuth 等第三方认证机制授权。

常见的操作权限

  • Read:允许获取委托令牌。
  • Write:允许创建或删除委托令牌。

2.6 ACL 管理与资源类型的结合

Kafka 允许将 ACL 配置应用于上述资源类型中的任意组合,并且 ACL 操作权限可以根据不同的资源类型设置。这种细粒度的控制保证了 Kafka 系统的安全性,防止未授权的操作对集群资源造成影响。

举例:资源类型与权限结合

  • 允许用户 alicetopic1 进行写入操作:

    bin/kafka-acls.sh --bootstrap-server <broker> --add --allow-principal User:alice --operation Write --topic topic1
    
  • 允许用户 bobgroup1 中消费 topic1 的消息:

    bin/kafka-acls.sh --bootstrap-server <broker> --add --allow-principal User:bob --operation Read --group group1 --topic topic1
    
  • 允许用户 admin 对整个集群进行描述:

    bin/kafka-acls.sh --bootstrap-server <broker> --add --allow-principal User:admin --operation Describe --cluster
    

3. Kafka ACL 操作命令

Kafka 提供了 kafka-acls.sh 工具用于管理集群中的访问控制列表(ACL)。通过该命令,你可以配置、查看和删除访问控制规则,限制不同用户或客户端对 Kafka 资源(如主题、消费者组、集群等)的访问权限。

3.1 列出现有的 ACL 配置

使用 --list 选项可以列出当前 Kafka 集群的 ACL 配置。这将显示所有资源和相关的访问控制策略。

命令格式

bin/kafka-acls.sh --bootstrap-server <broker> --list

示例
列出 Kafka 集群上的所有 ACL 配置:

bin/kafka-acls.sh --bootstrap-server localhost:9092 --list

此命令会输出当前集群中所有资源的 ACL 配置。

3.2 添加 ACL 权限

使用 --add 选项可以向 Kafka 资源添加访问权限。你可以为特定的 用户客户端 授予对特定资源(如主题、消费者组)的操作权限。

命令格式

bin/kafka-acls.sh --bootstrap-server <broker> --add --allow-principal <principal> --operation <operation> --resource <resource-type> --topic <topic-name> --group <group-name>
  • --add: 添加 ACL 条目。
  • --allow-principal: 指定允许访问资源的主体(可以是用户或客户端)。
  • --operation: 指定允许的操作,如 Read, Write, Create, Delete 等。
  • --resource: 指定资源类型(如 Topic, Group, Cluster)。
  • --topic: 指定操作的主题名称。
  • --group: 指定消费者组名称。

示例 1:允许用户 alice 写入 test-topic 主题

bin/kafka-acls.sh --bootstrap-server localhost:9092 --add --allow-principal User:alice --operation Write --topic test-topic

示例 2:允许消费者组 group1 读取 test-topic 主题

bin/kafka-acls.sh --bootstrap-server localhost:9092 --add --allow-principal Group:group1 --operation Read --topic test-topic

示例 3:允许用户 admin 创建主题

bin/kafka-acls.sh --bootstrap-server localhost:9092 --add --allow-principal User:admin --operation Create --topic *

示例 4:允许用户 alice 删除 test-topic 主题

bin/kafka-acls.sh --bootstrap-server localhost:9092 --add --allow-principal User:alice --operation Delete --topic test-topic

3.3 删除 ACL 权限

使用 --remove 选项可以删除已存在的 ACL 条目,撤销某个用户或客户端对某个资源的访问权限。

命令格式

bin/kafka-acls.sh --bootstrap-server <broker> --remove --allow-principal <principal> --operation <operation> --resource <resource-type> --topic <topic-name> --group <group-name>

示例 1:删除用户 alicetest-topic 的写入权限

bin/kafka-acls.sh --bootstrap-server localhost:9092 --remove --allow-principal User:alice --operation Write --topic test-topic

示例 2:删除消费者组 group1test-topic 的读取权限

bin/kafka-acls.sh --bootstrap-server localhost:9092 --remove --allow-principal Group:group1 --operation Read --topic test-topic

3.4 删除所有 ACL 权限

要删除所有与某个资源相关的 ACL 权限,可以通过指定通配符(*)删除某个类型资源的所有 ACL 配置。

命令格式

bin/kafka-acls.sh --bootstrap-server <broker> --remove --all --topic <topic-name>

示例
删除 test-topic 主题上所有的 ACL 配置:

bin/kafka-acls.sh --bootstrap-server localhost:9092 --remove --all --topic test-topic

3.5 查看特定资源的 ACL 配置

使用 --list 选项可以查看指定资源的 ACL 配置。例如,可以查看某个主题或消费者组的 ACL。

命令格式

bin/kafka-acls.sh --bootstrap-server <broker> --list --topic <topic-name> --group <group-name>

示例 1:查看 test-topic 主题的所有 ACL 配置

bin/kafka-acls.sh --bootstrap-server localhost:9092 --list --topic test-topic

示例 2:查看消费者组 group1 的 ACL 配置

bin/kafka-acls.sh --bootstrap-server localhost:9092 --list --group group1

3.6 仅允许或拒绝特定操作

Kafka 允许对某些操作使用 Deny 权限来显式拒绝访问。

命令格式

bin/kafka-acls.sh --bootstrap-server <broker> --add --deny-principal <principal> --operation <operation> --resource <resource-type> --topic <topic-name> --group <group-name>

示例 1:显式拒绝用户 alicetest-topic 主题的写入权限

bin/kafka-acls.sh --bootstrap-server localhost:9092 --add --deny-principal User:alice --operation Write --topic test-topic

示例 2:显式拒绝消费者组 group1test-topic 主题的读取权限

bin/kafka-acls.sh --bootstrap-server localhost:9092 --add --deny-principal Group:group1 --operation Read --topic test-topic

3.7 组合 ACL 配置

可以在同一命令中为多个资源类型添加或删除 ACL。例如,可以为多个主题、消费者组同时设置权限。

命令格式

bin/kafka-acls.sh --bootstrap-server <broker> --add --allow-principal User:<username> --operation <operation> --topic <topic1>,<topic2> --group <group-name>

示例

  • 允许用户 alicetest-topicanother-topic 写入消息,并允许 group1 从这两个主题读取消息:
    bin/kafka-acls.sh --bootstrap-server localhost:9092 --add --allow-principal User:alice --operation Write --topic test-topic,another-topic
    bin/kafka-acls.sh --bootstrap-server localhost:9092 --add --allow-principal Group:group1 --operation Read --topic test-topic,another-topic
    

3.8 使用 Wildcard(通配符)进行配置

Kafka 支持使用通配符来配置多个主题或资源。例如,使用 * 表示所有主题,* 表示所有消费者组。

命令格式

bin/kafka-acls.sh --bootstrap-server <broker> --add --allow-principal User:<username> --operation <operation> --topic *

示例 1:允许用户 alice 对所有主题进行写入

bin/kafka-acls.sh --bootstrap-server localhost:9092 --add --allow-principal User:alice --operation Write --topic *

示例 2:允许消费者组 group1 读取所有主题

bin/kafka-acls.sh --bootstrap-server localhost:9092 --add --allow-principal Group:group1 --operation Read --topic *

5. Kafka ACL 管理最佳实践

在 Kafka 集群中,使用 ACL(访问控制列表) 来管理权限是确保数据安全和集群控制的关键。合理的 ACL 管理能够帮助组织在多租户环境中保护 Kafka 资源,同时确保不同的用户、应用程序或消费者组仅能执行必要的操作。

5.1 最小权限原则(Principle of Least Privilege)

最佳实践:为每个用户、客户端和消费者组配置最小权限,只允许他们执行必要的操作。这有助于减少潜在的安全风险,确保每个实体只能访问它们需要的资源。

示例 1:为生产者用户配置写入权限

场景:允许用户 producer-user 只能写入 test-topic 主题,不能读取或执行其他操作。

bin/kafka-acls.sh --bootstrap-server localhost:9092 --add --allow-principal User:producer-user --operation Write --topic test-topic

解释

  • --allow-principal User:producer-user: 允许 producer-user
  • --operation Write: 仅授予写入权限,禁止其他操作。

示例 2:为消费者组配置读取权限

场景:允许消费者组 consumer-group 读取 test-topic 主题的数据,但不能进行写入。

bin/kafka-acls.sh --bootstrap-server localhost:9092 --add --allow-principal Group:consumer-group --operation Read --topic test-topic

解释

  • --allow-principal Group:consumer-group: 允许 consumer-group
  • --operation Read: 仅授予读取权限,禁止写入。

5.2 使用通配符来减少 ACL 配置的复杂性

最佳实践:使用通配符(*)来简化 ACL 配置,尤其在资源众多时。通配符允许你一次性授予对多个资源的访问权限。

示例 3:允许某个用户读取所有主题

场景:允许用户 alice 读取集群中所有的主题,而不授予写入权限。

bin/kafka-acls.sh --bootstrap-server localhost:9092 --add --allow-principal User:alice --operation Read --topic *

解释

  • --topic *: 允许访问所有主题。
  • --operation Read: 仅授予读取权限。

示例 4:允许消费者组写入所有主题

场景:允许消费者组 group1 向集群中所有的主题写入消息。

bin/kafka-acls.sh --bootstrap-server localhost:9092 --add --allow-principal Group:group1 --operation Write --topic *

解释

  • --topic *: 允许访问所有主题。
  • --operation Write: 仅授予写入权限。

5.3 强化集群安全性:控制管理权限

最佳实践:应限制对集群级别操作的访问权限,例如集群配置修改、创建和删除主题等。这些操作通常由管理员执行。

示例 5:限制用户只能查看集群元数据

场景:允许 read-only 用户仅查看集群元数据(如主题、分区等),而不能进行任何修改操作。

bin/kafka-acls.sh --bootstrap-server localhost:9092 --add --allow-principal User:read-only --operation Describe --cluster

解释

  • --operation Describe: 允许查看集群元数据。
  • --cluster: 针对集群资源进行权限配置。

示例 6:仅允许管理员创建和删除主题

场景:只允许用户 admin 创建和删除主题,而不允许普通用户进行这些操作。

bin/kafka-acls.sh --bootstrap-server localhost:9092 --add --allow-principal User:admin --operation Create --operation Delete --topic *

解释

  • --operation Create --operation Delete: 授予创建和删除主题的权限。
  • --topic *: 对所有主题资源进行配置。

5.4 定期审计和监控 ACL 配置

最佳实践:定期审计 Kafka 集群中的 ACL 配置,确保权限正确且没有过度权限。在大型集群中,手动管理 ACL 可能导致错误,使用自动化工具和监控机制非常重要。

示例 7:列出所有 ACL 配置

场景:审计当前集群中的所有 ACL 配置,检查每个用户和消费者组的访问权限。

bin/kafka-acls.sh --bootstrap-server localhost:9092 --list --topic *

解释

  • --list: 列出当前所有的 ACL 配置。
  • --topic *: 针对所有主题列出 ACL 配置。

示例 8:定期检查某个用户的权限

场景:定期检查用户 alicetest-topic 的权限。

bin/kafka-acls.sh --bootstrap-server localhost:9092 --list --principal User:alice --topic test-topic

解释

  • --list: 列出用户的所有 ACL 配置。
  • --principal User:alice: 指定要查看的用户。
  • --topic test-topic: 仅查看该用户在 test-topic 上的权限。

5.5 使用拒绝(Deny)策略明确禁止操作

最佳实践:通过明确的拒绝(Deny)策略来防止特定操作,即使在一些 ACL 中未显式列出。这有助于更好地控制资源访问,特别是在多租户环境中。

示例 9:拒绝某个用户读取敏感主题

场景:拒绝用户 bobsensitive-topic 主题的读取权限。

bin/kafka-acls.sh --bootstrap-server localhost:9092 --add --deny-principal User:bob --operation Read --topic sensitive-topic

解释

  • --deny-principal User:bob: 明确拒绝用户 bobsensitive-topic 主题的读取权限。
  • --operation Read: 仅拒绝读取权限。

示例 10:拒绝所有用户对特定主题进行写入

场景:拒绝所有用户对 restricted-topic 进行写入操作。

bin/kafka-acls.sh --bootstrap-server localhost:9092 --add --deny-principal User:* --operation Write --topic restricted-topic

解释

  • --deny-principal User:*: 拒绝所有用户。
  • --operation Write: 明确拒绝写入操作。

5.6 结合 Kerberos 和 SASL 强化身份认证

最佳实践:对于更高的安全需求,应结合 Kerberos 或 SASL 认证机制来进行身份验证,并与 ACL 配置结合使用。这样能够确保仅经过身份验证的用户和客户端能够执行权限操作。

示例 11:配置 Kafka 与 SASL/Kerberos 集成后使用 ACL

场景:配置 Kafka 使用 SASL/Kerberos 进行身份验证,确保只有通过身份验证的用户才能访问特定资源。

  1. 配置 Kafka 集群启用 SASL/Kerberos 认证。
  2. 配置用户 ACL。
bin/kafka-acls.sh --bootstrap-server localhost:9092 --add --allow-principal User:alice --operation Read --topic test-topic

解释

  • User:alice:指定一个已通过 Kerberos 或 SASL 认证的用户。
  • --operation Read:授予 alice 用户对 test-topic 主题的读取权限。

5.7 删除不再需要的 ACL 配置

最佳实践:定期清理不再使用的 ACL 配置,避免过度权限配置并保持集群的整洁。

示例 12:删除某个用户的 ACL 配置

场景:删除 user1test-topic 主题的所有权限。

bin/kafka-acls.sh --bootstrap-server localhost:9092 --remove --principal User:user1 --topic test-topic

解释

  • --remove: 删除指定用户的 ACL 配置。
  • --principal User:user1: 指定要删除权限的用户。
  • --topic test-topic: 删除用户在 test-topic 上的所有权限。

6. 总结

Kafka 的 ACL 是集群访问控制的核心机制,允许管理员根据用户、客户端、消费者组等标识,精细化地控制对 Kafka 资源的访问。通过合适的 ACL 配置,管理员可以确保只有授权的用户能够执行操作,从而有效提高 Kafka 集群的安全性。

常见的操作包括:

  • 控制用户对主题的读写权限。
  • 设置消费者组的访问权限。
  • 管理集群级别的操作权限,如创建、删除主题等。

http://www.kler.cn/a/529702.html

相关文章:

  • 扣子平台音频功能:让声音也能“智能”起来。扣子免费系列教程(14)
  • 自动化测试框架搭建-封装requests-优化
  • 电脑要使用cuda需要进行什么配置
  • MINIRAG: TOWARDS EXTREMELY SIMPLE RETRIEVAL-AUGMENTED GENERATION论文翻译
  • Office / WPS 公式、Mathtype 公式输入花体字、空心字
  • three.js+WebGL踩坑经验合集(6.1):负缩放,负定矩阵和行列式的关系(2D版本)
  • c/c++高级编程
  • 聚簇索引、哈希索引、覆盖索引、索引分类、最左前缀原则、判断索引使用情况、索引失效条件、优化查询性能
  • Python 网络爬虫实战:从基础到高级爬取技术
  • K个不同子数组的数目--滑动窗口--字节--亚马逊
  • 算法随笔_37: 交替合并字符串
  • 玩转Docker | 使用Docker部署MySQL数据库
  • 解密 Argon2:Java 密码加密的高安全实践与趣味探索
  • 100.2 AI量化面试题:在构建多因子选股模型时,如何有效处理因子之间的共线性问题?请给出具体的解决方案
  • DeepSeek-R1大模型本地化部署
  • 【前端学习路线】前端生态 详细知识点学习路径(附学习资源)
  • leetcode 2187. 完成旅途的最少时间
  • 如何用微信小程序写春联
  • 十一、实战案例
  • Java Web的发展史与SpringMVC入门学习(SpringMVC框架入门案例)
  • 深度学习深度解析:从基础到前沿
  • 基于FPGA的BT1120编解码
  • 女生年薪12万,算不算属于高收入人群
  • 每日一个小题
  • Vue.js `v-memo` 性能优化技巧
  • helm-dashboard为Helm设计的缺失用户界面 - 可视化您的发布,它提供了一种基于UI的方式来查看已安装的Helm图表