Kafka在Linux上的权限管理实现
一 总体架构与原则
二 操作系统层权限配置
sudo groupadd kafka、sudo useradd -m -r -g kafka kafkasudo chown -R kafka:kafka /opt/kafka /var/lib/kafka /var/log/kafkachmod 755 /opt/kafka/bin/*chmod 600 /opt/kafka/config/*.properties /opt/kafka/ssl/*chmod 700 /var/lib/kafka && chmod 600 /var/lib/kafka/*su - kafka后启动;三 认证与授权配置步骤
listeners=SASL_PLAINTEXT://:9092、security.inter.broker.protocol=SASL_PLAINTEXT、sasl.enabled.mechanisms=SCRAM-SHA-256、sasl.mechanism.inter.broker.protocol=SCRAM-SHA-256KafkaServer {
org.apache.kafka.common.security.scram.ScramLoginModule required
username="admin"
password="admin-secret";
};
export KAFKA_OPTS="-Djava.security.auth.login.config=/opt/kafka/config/kafka_server_jaas.conf"authorizer.class.name=kafka.security.authorizer.AclAuthorizer
allow.everyone.if.no.acl.found=false
super.users=User:admin
bin/kafka-configs.sh --zookeeper localhost:2181 --alter --add-config 'SCRAM-SHA-256=[password=admin-secret]' --entity-type users --entity-name adminbin/kafka-configs.sh --zookeeper localhost:2181 --describe --entity-type users --entity-name adminsecurity.protocol=SASL_PLAINTEXT
sasl.mechanism=SCRAM-SHA-256
sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="admin" password="admin-secret";
四 ACL授权常用操作
bin/kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --add --allow-principal User:test --operation Write --topic test_topicbin/kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --add --allow-principal User:test --operation Read --topic test_topicbin/kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --add --deny-principal User:* --operation Read --operation Write --topic test_topicbin/kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --list --topic test_topicbin/kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --remove --topic test_topic五 常见问题与排查要点
listeners、security.protocol、sasl.mechanism、sasl.jaas.config是否与服务端一致;SCRAM用户是否已通过kafka-configs.sh创建;必要时打开DEBUG日志。authorizer.class.name与allow.everyone.if.no.acl.found设置;注意Deny规则优先级与super.users豁免;ACL资源类型(Topic/Group/Cluster)与操作是否匹配。