在 Ubuntu 上保障 Kafka 安全的实用方案
一 安全架构与最小原则
二 传输加密与认证配置
KafkaServer {
org.apache.kafka.common.security.scram.ScramLoginModule required
username="admin"
password="Admin@Sec2025"
user_admin="Admin@Sec2025"
user_producer="Prod@Sec2025"
user_consumer="Cons@Sec2025";
};
listeners=SASL_PLAINTEXT://:9092
advertised.listeners=SASL_PLAINTEXT://<your-hostname-or-ip>:9092
security.inter.broker.protocol=SASL_PLAINTEXT
sasl.enabled.mechanisms=SCRAM-SHA-256
sasl.mechanism.inter.broker.protocol=SCRAM-SHA-256
listener.name.sasl_plaintext.scram-sha-256.sasl.jaas.config=file:/opt/kafka/conf/kafka_server_jaas.conf
# Kafka 2.x
bin/kafka-configs.sh --zookeeper localhost:2181 --alter \
--add-config 'SCRAM-SHA-256=[password=Prod@Sec2025]' --entity-type users --entity-name producer
bin/kafka-configs.sh --zookeeper localhost:2181 --alter \
--add-config 'SCRAM-SHA-256=[password=Cons@Sec2025]' --entity-type users --entity-name consumer
# Kafka 3.x
bin/kafka-configs.sh --bootstrap-server localhost:9092 --alter \
--add-config 'SCRAM-SHA-256=[password=Prod@Sec2025]' --entity-type users --entity-name producer
bin/kafka-configs.sh --bootstrap-server localhost:9092 --alter \
--add-config 'SCRAM-SHA-256=[password=Cons@Sec2025]' --entity-type users --entity-name consumer
bin/kafka-console-producer.sh --bootstrap-server <host>:9092 --topic test-topic \
--producer-property security.protocol=SASL_PLAINTEXT \
--producer-property sasl.mechanism=SCRAM-SHA-256 \
--producer-property sasl.jaas.config='org.apache.kafka.common.security.scram.ScramLoginModule required username="producer" password="Prod@Sec2025";'
bin/kafka-console-consumer.sh --bootstrap-server <host>:9092 --topic test-topic \
--from-beginning \
--consumer-property security.protocol=SASL_PLAINTEXT \
--consumer-property sasl.mechanism=SCRAM-SHA-256 \
--consumer-property sasl.jaas.config='org.apache.kafka.common.security.scram.ScramLoginModule required username="consumer" password="Cons@Sec2025";'
keytool -genkey -alias kafka -keyalg RSA -keystore kafka.server.keystore.jks -validity 3650
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
listeners=SASL_SSL://:9093
advertised.listeners=SASL_SSL://<your-hostname-or-ip>:9093
security.inter.broker.protocol=SASL_SSL
sasl.enabled.mechanisms=SCRAM-SHA-256
sasl.mechanism.inter.broker.protocol=SCRAM-SHA-256
listener.name.sasl_ssl.scram-sha-256.sasl.jaas.config=file:/opt/kafka/conf/kafka_server_jaas.conf
ssl.keystore.location=/opt/kafka/security/kafka.server.keystore.jks
ssl.keystore.password=<keystore-pass>
ssl.key.password=<key-pass>
ssl.truststore.location=/opt/kafka/security/kafka.client.truststore.jks
ssl.truststore.password=<truststore-pass>
三 授权与访问控制
# 创建主题
bin/kafka-topics.sh --create --topic sensitive-data --bootstrap-server <host>:9092 --partitions 3 --replication-factor 1
# 授予生产者写权限(Kafka 2.x 使用 --zookeeper;3.x 使用 --bootstrap-server)
bin/kafka-acls.sh --bootstrap-server <host>:9092 --add --allow-principal User:producer \
--operation Write --operation Create --topic sensitive-data
# 授予消费者组读权限
bin/kafka-acls.sh --bootstrap-server <host>:9092 --add --allow-principal User:consumer \
--operation Read --operation Describe --group console-consumer
# 查看 ACL
bin/kafka-acls.sh --bootstrap-server <host>:9092 --list --topic sensitive-data
四 网络安全与系统加固
sudo ufw allow from <app-subnet> to any port 9093 proto tcp
sudo ufw deny 9092/tcp # 禁用明文端口
sudo ufw enable && sudo ufw status verbose
五 快速核查清单