在Ubuntu上保障Kafka安全的核心措施
在Ubuntu环境下,Kafka的安全配置需围绕认证、加密、授权三大核心展开,同时配合防火墙、ZooKeeper安全等辅助措施,构建多层次的安全防护体系。以下是具体实施方案:
sudo apt update && sudo apt install -y openjdk-11-jdk
/opt/kafka目录,并配置ZooKeeper集群(建议3节点)。SASL(Simple Authentication and Security Layer)提供灵活的身份验证机制,SCRAM-SHA-256/512因支持动态用户管理(无需重启Broker)成为生产首选。
server.propertieslisteners=SASL_PLAINTEXT://0.0.0.0:9092,SASL_SSL://0.0.0.0:9093 # 同时支持明文+SSL和纯SSL
advertised.listeners=SASL_PLAINTEXT://your-broker-ip:9092,SASL_SSL://your-broker-ip:9093
security.inter.broker.protocol=SASL_PLAINTEXT # Broker间通信协议
sasl.enabled.mechanisms=SCRAM-SHA-512 # 启用SCRAM-SHA-512
sasl.mechanism.inter.broker.protocol=SCRAM-SHA-512 # Broker间认证机制
/opt/kafka/config/下创建kafka_server_jaas.conf,定义Broker用户(如admin)的密码:KafkaServer {
org.apache.kafka.common.security.scram.ScramLoginModule required
username="admin"
password="StrongPassword123!";
};
kafka-server-start.sh,添加JVM参数指向JAAS文件:export KAFKA_OPTS="-Djava.security.auth.login.config=/opt/kafka/config/kafka_server_jaas.conf"
kafka-configs.sh工具添加客户端用户(如producer、consumer):bin/kafka-configs.sh --zookeeper localhost:2181 \
--alter --add-config 'SCRAM-SHA-512=[iterations=8192,password=ProducerPass]' \
--entity-type users --entity-name producer
SSL/TLS通过证书加密数据传输,防止窃听和篡改。需生成密钥库(Keystore)和信任库(Truststore),并配置双向认证(可选)。
# 生成CA私钥和证书
openssl req -new -x509 -days 3650 -keyout ca-key.pem -out ca-cert.pem -subj "/CN=Kafka-CA"
# 生成Broker私钥和证书签名请求(CSR)
openssl req -newkey rsa:2048 -nodes -keyout broker-key.pem -out broker.csr -subj "/CN=kafka-broker"
# 用CA签发Broker证书
openssl x509 -req -in broker.csr -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out broker-cert.pem -days 3650
# 生成客户端证书(同理)
openssl req -newkey rsa:2048 -nodes -keyout client-key.pem -out client.csr -subj "/CN=kafka-client"
openssl x509 -req -in client.csr -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out client-cert.pem -days 3650
keytool将证书导入Java Keystore(Broker需信任CA,客户端需信任Broker证书):# 创建Broker Keystore并导入证书
keytool -import -alias ca -file ca-cert.pem -keystore kafka.server.keystore.jks -storepass KafkaPass -noprompt
keytool -import -alias broker -file broker-cert.pem -keystore kafka.server.keystore.jks -storepass KafkaPass -noprompt
# 创建Broker Truststore并导入CA(用于验证客户端证书,若启用双向认证)
keytool -import -alias ca -file ca-cert.pem -keystore kafka.server.truststore.jks -storepass KafkaPass -noprompt
# 创建客户端Keystore并导入证书
keytool -import -alias ca -file ca-cert.pem -keystore kafka.client.keystore.jks -storepass ClientPass -noprompt
keytool -import -alias client -file client-cert.pem -keystore kafka.client.keystore.jks -storepass ClientPass -noprompt
server.propertieslisteners=SSL://0.0.0.0:9093
security.inter.broker.protocol=SSL
ssl.keystore.location=/opt/kafka/config/kafka.server.keystore.jks
ssl.keystore.password=KafkaPass
ssl.key.password=KafkaPass
ssl.truststore.location=/opt/kafka/config/kafka.server.truststore.jks
ssl.truststore.password=KafkaPass
ssl.client.auth=required # 强制客户端提供证书(双向认证)
ssl.enabled.protocols=TLSv1.2,TLSv1.3 # 禁用旧版协议
ssl.cipher.suites=TLS_AES_128_GCM_SHA256,TLS_AES_256_GCM_SHA384 # 使用强加密套件
client.propertiessecurity.protocol=SSL
ssl.truststore.location=/opt/kafka/config/kafka.client.truststore.jks
ssl.truststore.password=ClientPass
通过**ACL(访问控制列表)**限制用户对Kafka资源(Topic、Group等)的操作权限,需配合SimpleAclAuthorizer使用。
server.properties中配置:authorizer.class.name=kafka.security.authorizer.AclAuthorizer
allow.everyone.if.no.acl.found=false # 无ACL时拒绝访问
super.users=User:admin # 定义超级用户(可绕过ACL)
kafka-acls.sh工具添加规则,例如允许producer用户向test-topic生产消息,允许consumer用户从test-topic消费消息:# 允许producer用户生产消息
bin/kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 \
--add --allow-principal User:producer --operation Produce --topic test-topic
# 允许consumer用户消费消息
bin/kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 \
--add --allow-principal User:consumer --operation Consume --topic test-topic
# 允许admin用户所有操作(管理权限)
bin/kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 \
--add --allow-principal User:admin --operation All --topic test-topic
sudo ufw allow from trusted-ip to any port 9092 proto tcp
sudo ufw allow from trusted-ip to any port 9093 proto tcp
sudo ufw enable
/brokers、/controller等路径的访问,避免未授权修改元数据。log4j.properties配置),记录用户操作行为。通过以上配置,可在Ubuntu上构建一个安全的Kafka环境,有效防范非法访问、数据泄露和未授权操作。实际生产中,需根据业务需求调整认证方式(如启用Kerberos)和加密强度(如使用国密算法)。