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
等關鍵配置文件,防止配置丟失。