You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

借助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做身份验证,需完成以下配置:

  1. 为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"
    
  2. 修改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:

  1. 启用LDAP授权器
    在server.properties中添加:
    authorizer.class.name=kafka.security.authorizer.AclAuthorizer
    super.users=User:kafka;User:admin  # 超级用户,拥有所有权限
    allow.everyone.if.no.acl.found=false  # 禁用默认允许,仅授权用户/组可访问
    
  2. 配置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
    
  3. 为用户组配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 18:18:50