10.8.2 ACL权限模型与授权管理

ACL权限模型与授权管理#

ACL模型概述#

ACL(Access Control List)用于控制客户端对Kafka资源的操作权限,核心要素包括:
- 资源类型:Topic、Group、Cluster、TransactionalId、DelegationToken
- 操作类型:Read、Write、Create、Delete、Describe、Alter、IdempotentWrite
- 主体:用户(User:alice)、服务账号(User:app-xxx)、主机(IP/网段)
- 许可效果:Allow 或 Deny

原理结构草图(授权决策链):

文章图片

资源与操作映射#

  • Topic
  • 生产者:Write、Create(新主题)
  • 消费者:Read、Describe
  • 管理:Alter、Delete
  • Group
  • 消费者:Read
  • 管理:Describe、Delete
  • Cluster
  • 管理:Alter、Describe、IdempotentWrite
  • TransactionalId
  • 事务生产:Write、Describe

安装与启用ACL(示例)#

以下示例以KRaft模式为例(Kafka 3.x),在控制器/服务器上启用ACL授权。

1)编辑配置 /etc/kafka/server.properties

# 开启ACL授权
authorizer.class.name=org.apache.kafka.metadata.authorizer.StandardAuthorizer
# 允许super用户绕过ACL(运维账户)
super.users=User:admin
# 未命中ACL时拒绝
allow.everyone.if.no.acl.found=false

# SASL示例(可按实际环境)
listener.name.sasl_plaintext.scram-sha-256.sasl.enabled.mechanisms=SCRAM-SHA-256

2)重启Kafka服务(以systemd为例):

sudo systemctl restart kafka
sudo systemctl status kafka --no-pager

预期效果:服务正常启动,且未授权用户访问资源会被拒绝。

ACL配置与管理(完整示例)#

假设存在用户 User:app-pay,授权其访问 pay- 前缀Topic与消费组 pay-cg

1)添加授权(主题读写 + 消费组读):

# 变量集中,便于重复使用
export BOOTSTRAP=10.0.0.11:9092
export PRINCIPAL="User:app-pay"

# Topic读写与Describe
kafka-acls.sh \
  --bootstrap-server $BOOTSTRAP \
  --add --allow-principal "$PRINCIPAL" \
  --operation Read --operation Write --operation Describe \
  --topic "pay-orders"

# 允许创建新主题(可按需开启)
kafka-acls.sh \
  --bootstrap-server $BOOTSTRAP \
  --add --allow-principal "$PRINCIPAL" \
  --operation Create \
  --topic "pay-orders"

# 消费组Read
kafka-acls.sh \
  --bootstrap-server $BOOTSTRAP \
  --add --allow-principal "$PRINCIPAL" \
  --operation Read \
  --group "pay-cg"

2)查询授权(按用户过滤):

kafka-acls.sh \
  --bootstrap-server $BOOTSTRAP \
  --list --principal "$PRINCIPAL"

3)移除授权(清理过期权限):

kafka-acls.sh \
  --bootstrap-server $BOOTSTRAP \
  --remove --allow-principal "$PRINCIPAL" \
  --operation Write \
  --topic "pay-orders"

命令解释:
- --add/--remove/--list:添加/删除/查询ACL
- --allow-principal:授权主体
- --operation:读写/创建/描述等操作
- --topic/--group:资源维度(主题/消费组)

授权策略设计(含示例)#

  • 最小权限原则:仅开放必要资源与操作
  • 按应用隔离:不同应用使用不同Principal与Topic前缀
  • 环境隔离:dev/test/prod采用独立集群或命名空间
  • 显式拒绝优先:Deny优先级高于Allow

示例命名规划:

User:app-pay
Topic: pay-orders, pay-refund
Group: pay-cg

多租户授权实践(示例)#

命名空间控制:Topic/Group前缀与用户绑定。
白名单主机:限制访问来源IP。
配额联动:ACL授权结合配额限制吞吐。

限制主机IP示例:

kafka-acls.sh \
  --bootstrap-server $BOOTSTRAP \
  --add --allow-principal "User:app-pay" \
  --operation Read --operation Write \
  --topic "pay-orders" \
  --allow-host "10.0.0.20"

风险点与规避#

  • 滥用通配符:避免对 * 资源授权
  • 遗留权限累积:定期审计与清理
  • 权限漂移:变更需审批与记录

排错指南(常见现象与命令)#

1)报错:Topic authorization failed
排查步骤:

# 确认ACL是否存在
kafka-acls.sh --bootstrap-server $BOOTSTRAP --list --topic pay-orders

# 检查客户端认证主体是否与ACL一致(SASL身份)
# 例如客户端配置中sasl.jaas.config的username

2)报错:Group authorization failed
排查步骤:

# 检查消费组权限
kafka-acls.sh --bootstrap-server $BOOTSTRAP --list --group pay-cg

3)ACL添加无效或未生效
排查步骤:

# 验证server.properties中authorizer已开启
grep -E "authorizer|super.users|allow.everyone" /etc/kafka/server.properties

# 查看服务日志中的授权模块加载
journalctl -u kafka -n 200 --no-pager | grep -i authorizer

运维建议#

  • 权限变更走工单审批流程
  • 定期导出ACL快照
  • 统一规范用户与资源命名
  • 结合监控审计异常访问行为

ACL快照导出示例:

kafka-acls.sh --bootstrap-server $BOOTSTRAP --list > /var/backups/kafka_acls_$(date +%F).txt

练习#

1)为用户 User:app-report 授权读取 report-logs,禁止写入。
2)将 User:app-pay 的写权限移除并验证错误信息。
3)仅允许 10.0.0.30 主机访问 pay-orders 并测试拒绝其他主机。
4)编写脚本每日导出ACL快照并保留7天。