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天。