Kafka配置中的安全设置
Kafka作为分布式流处理平台,其安全配置需围绕认证、加密、授权、网络隔离及审计五大核心维度展开,以下是具体配置要点:
认证是Kafka安全的基础,用于验证客户端、Broker及Broker间通信的身份。Kafka支持多种认证机制,其中SASL(Simple Authentication and Security Layer) 是主流选择,涵盖PLAIN(文本)、SCRAM-SHA-256/512(散列)、GSSAPI(Kerberos)等机制。
kafka_server_jaas.conf
文件(Broker端),定义用户凭据(如admin
用户的密码);客户端需通过security.protocol
(设为sasl_plaintext
或sasl_ssl
)、sasl.mechanism
(设为PLAIN
)及security.jaas.config
(指向JAAS文件)指定认证信息。kafka_server_jaas.conf
内容:KafkaServer {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="admin"
password="admin-secret"
user_admin="admin-secret" # 客户端用户配置
};
客户端配置示例(Java):props.put("security.protocol", "sasl_plaintext");
props.put("sasl.mechanism", "PLAIN");
props.put("security.jaas.config", "org.apache.kafka.common.security.plain.PlainLoginModule required username=\"admin\" password=\"admin-secret\";");
kafka-configs.sh
工具创建用户并设置密码(如SCRAM-SHA-512
),Broker配置中启用SCRAM-SHA-512
机制。kafka-configs.sh --zookeeper localhost:2181 --alter --add-config 'SCRAM-SHA-512=[iterations=8192,password=user1-secret]' --entity-type users --entity-name user1
Broker配置(server.properties
):sasl.enabled.mechanisms=SCRAM-SHA-512
sasl.mechanism.inter.broker.protocol=SCRAM-SHA-512
通过SSL/TLS加密客户端与Broker、Broker间的通信,防止数据泄露或篡改。
keytool
或OpenSSL
生成密钥库(Keystore,存储Broker私钥和证书)和信任库(Truststore,存储客户端信任的证书)。示例(keytool
):keytool -genkey -alias kafka -keyalg RSA -keystore kafka.server.keystore.jks -validity 365 -keysize 2048
keytool -export -alias kafka -file kafka.server.crt -keystore kafka.server.keystore.jks
keytool -import -alias kafka -file kafka.server.crt -keystore kafka.client.truststore.jks
server.properties
中指定证书路径及密码,启用SSL/TLS:listeners=SSL://:9093
security.inter.broker.protocol=SSL
ssl.keystore.location=/path/to/kafka.server.keystore.jks
ssl.keystore.password=keystore-password
ssl.key.password=key-password
ssl.truststore.location=/path/to/kafka.server.truststore.jks
ssl.truststore.password=truststore-password
ssl.enabled.protocols=TLSv1.2 # 仅启用安全的TLS版本
ssl.cipher.suites=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 # 指定安全的加密套件
security.protocol=SSL
ssl.truststore.location=/path/to/kafka.client.truststore.jks
ssl.truststore.password=truststore-password
通过ACL(Access Control Lists) 细粒度控制用户对Kafka资源(主题、分区、组)的操作权限(如读、写、创建、删除)。
server.properties
中设置授权类为AclAuthorizer
,并关闭“未配置ACL则允许所有”的默认行为:authorizer.class.name=kafka.security.authorizer.AclAuthorizer
allow.everyone.if.no.acl.found=false
kafka-acls.sh
工具为用户分配权限。示例(为用户alice
分配my-topic
的读权限):kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 \
--add --allow-principal User:alice \
--operation Read --topic my-topic
示例(为用户admin
分配my-topic
的所有权限):kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 \
--add --allow-principal User:admin \
--operation All --topic my-topic
通过网络层配置,减少Kafka集群的暴露面:
iptables
或firewalld
仅开放Kafka所需端口(如9092
/9093
),禁止无关IP访问。示例(firewalld
):firewall-cmd --permanent --zone=public --add-port=9093/tcp
firewall-cmd --reload
PLAINTEXT
端口(如9092
),仅保留SASL_SSL
或SSL
端口。通过日志记录和监控,及时发现异常行为:
log4j.properties
中启用Kafka审计日志,记录客户端操作(如DescribeTopics
、Produce
、Consume
):log4j.logger.kafka.authorizer.logger=WARN, authorizerAppender
log4j.additivity.kafka.authorizer.logger=false
log4j.appender.authorizerAppender=org.apache.log4j.RollingFileAppender
log4j.appender.authorizerAppender.File=/var/log/kafka/audit.log
log4j.appender.authorizerAppender.MaxFileSize=10MB
log4j.appender.authorizerAppender.MaxBackupIndex=5
log4j.appender.authorizerAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.authorizerAppender.layout.ConversionPattern=%d{ISO8601} %p %c{1} [%t] %m%n
PLAINTEXT
端口(9092
),仅使用SASL_SSL
(9093
)或SSL
(9094
)端口。Read
而非All
),降低安全风险。server.properties
、kafka_server_jaas.conf
等关键配置文件,防止配置丢失。