借助LDAP实现Apache Kafka原生组/角色认证
Apache Kafka 基于Kerberos/LDAP的组/角色认证实现
问题解答
Apache Kafka原生支持结合Kerberos做身份认证、LDAP做组/角色授权的方案,也可直接用LDAP同时完成认证与授权。通过这种方式,你只需给用户组配置ACL,组内所有用户会自动继承权限,无需手动为每个用户单独配置主体和ACL。
一、前提准备
- 已部署Kerberos KDC(仅当使用Kerberos认证时需要)
- 已部署LDAP服务器(如OpenLDAP、Active Directory),且已创建用户组、用户,并将用户分配到对应组
- Kafka集群版本建议2.0及以上(更早版本支持但配置复杂度更高)
二、Kerberos身份认证配置(可选)
如果选择用Kerberos做身份验证,需完成以下配置:
- 为Kafka服务创建Kerberos主体
在KDC服务器上执行命令:kadmin.local -q "addprinc -randkey kafka/<kafka-broker-hostname>@YOUR_REALM.COM" kadmin.local -q "ktadd -k /etc/kafka/kafka.keytab kafka/<kafka-broker-hostname>@YOUR_REALM.COM" - 修改Kafka Broker的
server.properties
添加Kerberos相关配置:# 启用SASL协议 security.inter.broker.protocol=SASL_PLAINTEXT sasl.enabled.mechanisms=GSSAPI sasl.mechanism.inter.broker.protocol=GSSAPI # Kerberos服务名称与JAAS配置 listener.name.sasl_plaintext.gssapi.sasl.kerberos.service.name=kafka listener.name.sasl_plaintext.gssapi.sasl.jaas.config=com.sun.security.auth.module.Krb5LoginModule required \ useKeyTab=true \ keyTab="/etc/kafka/kafka.keytab" \ storeKey=true \ useTicketCache=false \ serviceName="kafka" \ principal="kafka/<kafka-broker-hostname>@YOUR_REALM.COM";
三、LDAP组授权配置(核心步骤)
这部分是实现基于组权限的关键,通过LDAP让Kafka获取用户所属组信息,进而应用组ACL:
- 启用LDAP授权器
在server.properties中添加:authorizer.class.name=kafka.security.authorizer.AclAuthorizer super.users=User:kafka;User:admin # 超级用户,拥有所有权限 allow.everyone.if.no.acl.found=false # 禁用默认允许,仅授权用户/组可访问 - 配置LDAP连接与映射规则
在server.properties中添加LDAP相关参数,根据你的LDAP结构调整:# LDAP服务器地址 ldap.url=ldap://your-ldap-host:389 # LDAP绑定账号(用于查询用户组) ldap.bind.dn=cn=admin,dc=example,dc=com ldap.bind.password=your-ldap-admin-password # 用户搜索基础DN ldap.user.search.base=ou=users,dc=example,dc=com # 用户匹配规则({0}会被替换为认证用户名,Kerberos用户会自动去掉REALM后缀) ldap.user.search.filter=(uid={0}) # 组搜索基础DN ldap.group.search.base=ou=groups,dc=example,dc=com # 组匹配规则(查找包含当前用户的组) ldap.group.search.filter=(member={0}) # 提取组名称的属性(比如OpenLDAP用cn,AD用sAMAccountName) ldap.group.name.attribute=cn - 为用户组配置ACL
使用Kafka自带的kafka-acls.sh脚本给组添加权限,示例:# 给dev-group组授予test-topic的读写权限 bin/kafka-acls.sh --authorizer-properties zookeeper.connect=your-zk-host:2181 \ --add --allow-principal Group:dev-group \ --operation Read --operation Write \ --topic test-topic # 查看已配置的ACL bin/kafka-acls.sh --authorizer-properties zookeeper.connect=your-zk-host:2181 --list --topic test-topic
四、客户端配置(以Java客户端为例)
如果用Kerberos认证,需配置客户端JAAS文件:
KafkaClient { com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true keyTab="/path/to/user.keytab" storeKey=true useTicketCache=false principal="user@YOUR_REALM.COM"; };
启动客户端时指定JAAS文件:
java -Djava.security.auth.login.config=/path/to/kafka_client_jaas.conf -jar your-kafka-client.jar
五、验证
- 使用属于
dev-group的用户客户端连接Kafka,尝试读写test-topic,应能正常操作 - 使用非该组的用户客户端连接,会收到权限拒绝的错误提示
内容的提问来源于stack exchange,提问作者Bernard Tran
相关产品推荐
相关产品推荐

