You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Apache Kafka服务端100%阻止主题被自动创建?

如何在Apache Kafka服务端100%阻止主题被自动创建?

嗨,我完全理解你刚接触Kafka时的困惑——想从服务端彻底管控主题创建权限,不让任意客户端私自生成主题,对吧?你已经试过关闭auto.create.topics.enable=false,但消费者仍能自动创建主题,这个问题其实挺常见的,我来给你拆解下完整解决方案:

首先,先排查你当前的auto.create.topics.enable配置是否真的生效了。有时候我们修改了server.properties但没重启broker,或者只改了集群中单个broker的配置(集群环境下必须所有broker同步修改)。你可以用Kafka自带的命令行工具验证:

kafka-configs.sh --bootstrap-server <你的broker地址>:9092 --describe --entity-type brokers --entity-name <broker ID>

看看输出里这个参数是否确实设为false。如果没生效,先把所有broker的配置改对,重启后再测试。

不过就算这个参数配置正确,还有个关键漏洞:客户端可以主动调用AdminClient API来创建主题,这个操作是不受auto.create.topics.enable控制的。所以要实现100%的服务端管控,必须结合Kafka的ACL(访问控制列表)来限制创建权限。

下面是具体的落地步骤:

  • 第一步:启用Kafka的认证与ACL授权
    先在broker的server.properties里开启ACL授权器,并配置关键参数:

    # 启用ACL授权器
    authorizer.class.name=kafka.security.authorizer.AclAuthorizer
    # 设置超级用户(拥有所有权限,比如你的管理员账号)
    super.users=User:admin
    # 核心:没有匹配的ACL时,拒绝所有请求(默认是允许,这步必须改)
    allow.everyone.if.no.acl.found=false
    

    另外,ACL是基于用户身份生效的,所以必须先启用认证(比如最简单的SASL PLAIN):
    server.properties中添加认证相关配置:

    listeners=PLAINTEXT://:9092,SASL_PLAINTEXT://:9093
    advertised.listeners=PLAINTEXT://<你的broker地址>:9092,SASL_PLAINTEXT://<你的broker地址>:9093
    security.inter.broker.protocol=SASL_PLAINTEXT
    sasl.mechanism.inter.broker.protocol=PLAIN
    sasl.enabled.mechanisms=PLAIN
    

    然后创建JAAS配置文件(比如kafka_server_jaas.conf),定义管理员和普通应用账号:

    KafkaServer {
        org.apache.kafka.common.security.plain.PlainLoginModule required
        username="admin"
        password="admin-secret"
        user_admin="admin-secret"
        user_appuser="app-secret";
    };
    

    启动broker时指定这个JAAS文件:

    export KAFKA_OPTS="-Djava.security.auth.login.config=/path/to/kafka_server_jaas.conf"
    bin/kafka-server-start.sh config/server.properties
    
  • 第二步:配置ACL限制主题创建权限
    给管理员账号授予创建所有主题的权限:

    kafka-acls.sh --bootstrap-server <你的broker地址>:9093 --command-config config/client.properties --add --allow-principal User:admin --operation Create --topic *
    

    这里的client.properties需要包含管理员的SASL认证信息:

    security.protocol=SASL_PLAINTEXT
    sasl.mechanism=PLAIN
    sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="admin-secret";
    

这样配置完成后,只有管理员账号拥有主题创建权限,普通应用账号既不能通过自动创建逻辑生成主题,也无法主动调用API创建主题,完全实现了服务端的权限管控。

备注:内容来源于stack exchange,提问作者craigmiller160

火山引擎 最新活动