作为分布式消息系统的核心枢纽,Kafka的安全防护是每个运维团队的必修课。本文将带你完成从零基础到金融级安全防护的四阶段跃迁,手把手构建坚不可摧的消息堡垒。
阶段一:裸奔模式 - 基础配置(慎用!)
参考本人博客园 安装Kafka(https://www.cnblogs.com/jiaxzeng/p/15980245.html) 文章
这是最原始的配置形态,数据以明文传输,犹如在互联网上"裸奔"。仅建议在内网隔离的测试环境使用,生产环境必须升级!
风险警示:无加密、无认证,攻击者可轻松窃听/篡改数据
阶段二:SSL铠甲 - 传输加密
打造数字证书体系
-
ca证书
# 1. 生成 CA 私钥和自签名证书
openssl req -new -x509 -nodes \
-keyout ca.key -out ca.crt \
-days 3650 -subj "/C=CN/ST=GuangDong/L=GuangZhou/CN=Kafka Root CA"
# 2. 将 CA 证书导入 PKCS#12 格式的 truststore(客户端和服务器共用)
keytool -keystore kafka.server.truststore.p12 -storetype PKCS12 \
-alias CARoot -import -file ca.crt \
-storepass truststore_password -noprompt
# 清理临时文件
rm -f ca.srl
-
服务证书
# 1. 生成服务器 PKCS#12 格式的 keystore(包含私钥和未签名证书)
keytool -keystore kafka.server.keystore.p12 -storetype PKCS12 \
-alias localhost -validity 3650 \
-genkey -keyalg RSA -keysize 2048 \
-storepass keystore_password \
-dname "C=CN/ST=GuangDong/L=GuangZhou/CN=kafka-server"
# 2. 生成证书签名请求 (CSR)
keytool -keystore kafka.server.keystore.p12 -storetype PKCS12 \
-alias localhost -certreq -file server.csr \
-storepass keystore_password
# 3. 使用 CA 签名服务器证书(添加 SAN 扩展)
openssl x509 -req -CA ca.crt -CAkey ca.key \
-in server.csr -out server-signed.crt \
-days 3650 -CAcreateserial \
-extfile <(printf"subjectAltName=IP:172.139.20.17,IP:172.139.20.81,IP:172.139.20.177") # 所有kafka地址
# 4. 将 CA 证书和签名后的证书导入服务器 keystore
keytool -keystore kafka.server.keystore.p12 -storetype PKCS12 \
-alias CARoot -import -file ca.crt \
-storepass keystore_password -noprompt
keytool -keystore kafka.server.keystore.p12 -storetype PKCS12 \
-alias localhost -import -file server-signed.crt \
-storepass keystore_password -noprompt
# 5. 验证服务证书是否有SAN扩展
$ keytool -list -v -keystore kafka.server.keystore.p12 -alias localhost -storepass keystore_password | grep -A4 SubjectAlternativeName
# 清理临时文件
rm -f server.csr
关键配置
listeners=PLAINTEXT://:9092,SSL://:9093
advertised.listeners=PLAINTEXT://172.139.20.17:9092,SSL://172.139.20.17:9093
# SSL 配置
ssl.keystore.location=/app/kafka/pki/kafka.server.keystore.p12
ssl.keystore.password=keystore_password
ssl.keystore.type=PKCS12
ssl.truststore.location=/app/kafka/pki/kafka.server.truststore.p12
ssl.truststore.password=truststore_password
ssl.truststore.type=PKCS12
ssl.client.auth=none
验证 SSL
-
客户端配置 (ssl-client.properties)
security.protocol=SSL
ssl.truststore.location=/app/kafka/pki/kafka.server.truststore.p12
ssl.truststore.password=truststore_password
ssl.truststore.type=PKCS12
-
消费消息(SSL)
bin/kafka-console-consumer.sh --bootstrap-server 172.139.20.17:9093 --topic test --consumer.config ~/ssl-client.properties --from-beginning
防护效果:TLS加密传输,防御中间人攻击
阶段三:SCRAM盾牌 - 身份认证
配置SCRAM-SHA-512认证机制
bin/kafka-configs.sh --bootstrap-server localhost:9092 --alter --add-config 'SCRAM-SHA-512=[password=admin-password]' --entity-type users --entity-name admin
JAAS配置秘籍
KafkaServer {
org.apache.kafka.common.security.scram.ScramLoginModule required
username="admin"
password="admin-secret";
};
关键配置
listeners=PLAINTEXT://:9092,SSL://:9093,SASL_PLAINTEXT://:9094
advertised.listeners=PLAINTEXT://172.139.20.17:9092,SSL://172.139.20.17:9093,SASL_PLAINTEXT://172.139.20.17:9094
# SASL 配置
sasl.enabled.mechanisms=SCRAM-SHA-512
验证 SASL_PLAINTEXT
-
客户端配置 (sasl-plain-client.properties )
security.protocol=SASL_PLAINTEXT
sasl.mechanism=SCRAM-SHA-512
sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="admin" password="admin-password";
-
消费消息(SSL)
bin/kafka-console-consumer.sh --bootstrap-server 172.139.20.17:9094 --topic test --consumer.config ~/sasl-plain-client.properties --from-beginning
安全升级:账号密码认证 + 动态盐值加密,抵御非法接入
阶段四:双剑合璧 - SSL+SASL
关键配置
listeners=PLAINTEXT://:9092,SSL://:9093,SASL_PLAINTEXT://:9094,SASL_SSL://:9095
advertised.listeners=PLAINTEXT://172.139.20.17:9092,SSL://172.139.20.17:9093,SASL_PLAINTEXT://172.139.20.17:9094,SASL_SSL://172.139.20.17:9095
验证 SASL_SSL
-
客户端配置 (sasl-ssl-client.properties )
security.protocol=SASL_SSL
sasl.mechanism=SCRAM-SHA-512
sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="admin" password="admin-password";
ssl.truststore.location=/app/kafka/pki/kafka.server.truststore.p12
ssl.truststore.password=truststore_password
-
消费消息(SASL_SSL)
bin/kafka-console-consumer.sh --bootstrap-server 172.139.20.17:9095 --topic test --consumer.config ~/sasl-ssl-client.properties --from-beginning
军工级防护:传输加密 + 双向认证 + 动态凭证,满足金融级安全要求
避坑指南(血泪经验)
-
证书陷阱:必须包含所有Broker IP的SAN扩展
-
协议隔离:管理命令保持PLAINTEXT通道
-
密码管理:keystore与truststore使用不同密码
-
版本适配:JDK 11+需注意PKCS12兼容性