如何配置Kafka权限,限制消费者仅从SASL_PLAIN端口(9093)消费指定Topic?
要实现仅允许消费者从9093(SASL_PLAIN)端口消费指定Topic,同时禁止从9092(Plaintext)端口消费,核心是利用Kafka ACL结合不同Listener的认证特性区分客户端来源,具体配置步骤如下:
1. 确保集群已启用ACL授权
首先确认你的Kafka broker配置文件中已经开启ACL功能,添加或修改以下配置项:
# 启用官方ACL授权器 authorizer.class.name=kafka.security.authorizer.AclAuthorizer # 无匹配ACL规则时默认拒绝访问(关键配置,避免默认开放权限) allow.everyone.if.no.acl.found=false # 可选:指定超级用户(用于执行ACL管理命令的账号) super.users=User:admin
修改完成后重启Kafka broker使配置生效。
2. 添加ACL规则区分不同端口的访问
由于9092是Plaintext协议,所有通过该端口连接的客户端会被识别为匿名身份(Principal为User:ANONYMOUS);而9093是SASL_PLAIN协议,客户端必须提供合法用户名密码,身份为对应的认证用户(例如User:consumer_user)。我们通过ACL权限控制实现需求:
步骤2.1 拒绝匿名用户对目标Topic的消费权限
执行以下kafka-acls.sh命令,拒绝匿名用户读取目标Topic(替换<your_topic>为实际Topic名称):
kafka-acls.sh --bootstrap-server <broker_host>:9093 \ --command-config <path_to_sasl_config> \ --add \ --allow-principal User:ANONYMOUS \ --deny \ --operation READ \ --operation DESCRIBE \ --topic <your_topic>
注:这里使用9093端口执行命令,因为需要通过SASL认证端口连接集群(适配超级用户的SASL认证方式);
DESCRIBE权限是消费者获取Topic元数据必需的,所以需要一并拒绝。
步骤2.2 允许认证用户对目标Topic的消费权限
接下来,允许合法消费者用户读取目标Topic(替换<consumer_username>为实际消费者用户名):
kafka-acls.sh --bootstrap-server <broker_host>:9093 \ --command-config <path_to_sasl_config> \ --add \ --allow-principal User:<consumer_username> \ --allow \ --operation READ \ --operation DESCRIBE \ --topic <your_topic>
如果需要允许所有通过SASL认证的用户消费,可将--allow-principal改为--allow-principal User:*(表示所有认证用户)。
3. 验证配置效果
- 尝试通过Plaintext协议(9092端口)连接集群消费该Topic,会收到
Not authorized to access topics的权限错误。 - 通过SASL_PLAIN协议(9093端口)并提供合法用户名密码连接,可正常消费数据。
原理说明
Kafka的Plaintext协议默认不做身份认证,所有客户端都会被标记为匿名用户;而SASL_PLAIN协议要求客户端提交身份凭证,Broker验证后赋予对应Principal身份。通过ACL分别控制匿名用户和认证用户的权限,就能实现仅允许安全端口的消费请求。
内容的提问来源于stack exchange,提问作者VinayKumar

