Kafka在Linux环境下的安全认证需通过加密通信(SSL/TLS)、身份认证(SASL)和权限控制(ACL)三层机制实现,以下是具体配置步骤:
确保Kafka已安装并正常运行,且Linux系统(如CentOS、Ubuntu)已安装openssl、keytool等工具(用于证书生成)。
SSL/TLS用于加密Broker与客户端、Broker与ZooKeeper之间的通信,防止数据泄露。
生成证书与密钥库
使用keytool生成自签名证书(生产环境建议使用CA签发):
# 生成服务端密钥库(包含私钥和证书)
keytool -genkey -alias kafka-server -keystore kafka.server.keystore.jks -storepass password -validity 365 -keysize 2048
# 导出服务端证书(用于客户端信任)
keytool -export -alias kafka-server -file kafka.server.crt -keystore kafka.server.keystore.jks -storepass password
# 生成客户端信任库(导入服务端证书)
keytool -import -alias kafka-server -file kafka.server.crt -keystore kafka.server.truststore.jks -storepass password -noprompt
注:
keystore存储服务端私钥和证书,truststore存储客户端信任的服务端证书。
配置Kafka Broker
编辑server.properties(通常位于/etc/kafka/),添加以下配置:
listeners=SSL://:9093 # 启用SSL监听端口
security.inter.broker.protocol=SSL # Broker间通信协议
ssl.keystore.location=/etc/kafka/kafka.server.keystore.jks # 密钥库路径
ssl.keystore.password=password # 密钥库密码
ssl.key.password=password # 私钥密码
ssl.truststore.location=/etc/kafka/kafka.server.truststore.jks # 信任库路径
ssl.truststore.password=password # 信任库密码
ssl.enabled.protocols=TLSv1.2,TLSv1.3 # 启用TLS协议版本
ssl.cipher.suites=TLS_AES_128_GCM_SHA256,TLS_AES_256_GCM_SHA384 # 加密套件
配置客户端
客户端(生产者/消费者)需配置信任服务端证书,编辑client.properties:
security.protocol=SSL # 启用SSL
ssl.truststore.location=/etc/kafka/kafka.server.truststore.jks # 信任库路径
ssl.truststore.password=password # 信任库密码
验证SSL连接
使用Kafka命令行工具测试:
# 生产者发送消息(指定SSL配置)
bin/kafka-console-producer.sh --broker-list localhost:9093 --topic test --producer.config client.properties
# 消费者接收消息(指定SSL配置)
bin/kafka-console-consumer.sh --bootstrap-server localhost:9093 --topic test --from-beginning --consumer.config client.properties
SASL提供灵活的身份认证机制(如PLAIN、SCRAM),推荐使用SCRAM-SHA-256(比PLAIN更安全,避免明文传输密码)。
创建SCRAM凭证
使用Kafka命令行工具为用户创建SCRAM凭证(如用户kafka-user):
bin/kafka-configs.sh --zookeeper localhost:2181 --entity-type users --entity-name kafka-user --alter --add-config SCRAM-SHA-256=[iterations=8192,password=password]
注:
iterations为迭代次数(越高越安全),password为用户密码。
配置Kafka Broker的JAAS文件
创建kafka_server_jaas.conf(位于/etc/kafka/),配置SCRAM登录模块:
KafkaServer {
org.apache.kafka.common.security.scram.ScramLoginModule required
username="kafka-user"
password="password";
};
修改Broker配置
编辑server.properties,添加以下配置:
listeners=SASL_SSL://:9093 # 启用SASL+SSL
security.inter.broker.protocol=SASL_SSL # Broker间协议
sasl.mechanism.inter.broker.protocol=SCRAM-SHA-256 # Broker间认证机制
sasl.enabled.mechanisms=SCRAM-SHA-256 # 支持的认证机制
sasl.jaas.config=file:/etc/kafka/kafka_server_jaas.conf # JAAS文件路径
配置客户端
客户端需指定SCRAM认证信息,编辑client.properties:
security.protocol=SASL_SSL # 启用SASL+SSL
sasl.mechanism=SCRAM-SHA-256 # 认证机制
sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="kafka-user" password="password";
重启Kafka服务
使配置生效:
systemctl restart kafka
ACL(访问控制列表)用于定义用户对Kafka资源(Topic、Group等)的操作权限(如读、写、创建)。
server.properties,添加以下配置:authorizer.class.name=kafka.security.authorizer.AclAuthorizer # 使用ACL授权器
allow.everyone.if.no.acl.found=false # 无ACL时拒绝访问
super.users=User:kafka-user # 超级用户(可管理所有资源)
kafka-acls.sh工具创建规则(如允许kafka-user读写test-topic):# 添加读权限
bin/kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 \
--add --allow-principal User:kafka-user --operation Read --topic test-topic
# 添加写权限
bin/kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 \
--add --allow-principal User:kafka-user --operation Write --topic test-topic
注:
--principal指定用户,--operation指定操作(Read/Write/Create等),--topic指定资源。
通过Linux防火墙(如firewalld)限制Kafka端口的访问,仅允许可信IP连接:
# 开放SSL端口(9093)
firewall-cmd --permanent --zone=public --add-port=9093/tcp
# 开放SASL端口(若单独配置)
firewall-cmd --permanent --zone=public --add-port=9092/tcp
# 重新加载防火墙规则
firewall-cmd --reload
test-topic,应提示权限不足。通过以上步骤,可实现Kafka在Linux环境下的加密通信、身份认证和权限控制,提升集群安全性。