CentOS环境下Kafka安全设置指南
在CentOS上部署Kafka时,需通过认证、加密、授权、网络隔离及监控等多层措施保障集群安全。以下是具体实施步骤:
/etc/passwd
排查id=0
的账户(除root外),使用passwd -l <用户名>
锁定无用超级账户,或将其shell改为/sbin/nologin
(如usermod -s /sbin/nologin testuser
),防止未授权root访问。authconfig --passminlen=10 --passcomplexity=1 --update
设置)。使用chattr +i /etc/shadow
锁定口令文件,防止篡改。SCRAM-SHA-256机制(推荐):
kafka-configs.sh
添加用户及SCRAM密码(如kafka-configs.sh --zookeeper localhost:2181 --entity-type users --entity-name kafka-user --alter --add-config SCRAM-SHA-256=[iterations=8192,password=test123]
)。/etc/kafka/kafka_server_jaas.conf
):指定SCRAM登录模块及用户信息(如KafkaServer { org.apache.kafka.common.security.scram.ScramLoginModule required username="kafka-user" password="test123"; };
)。server.properties
:启用SASL,指定机制及JAAS文件路径(如security.inter.broker.protocol=SASL_SSL
、sasl.enabled.mechanisms=SCRAM-SHA-256
、sasl.mechanism.inter.broker.protocol=SCRAM-SHA-256
、sasl.jaas.config=file:/etc/kafka/kafka_server_jaas.conf
)。PLAIN机制(测试用,不推荐生产):
JAAS文件配置示例:KafkaServer { org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="admin-secret" user_admin="admin-secret"; };
,server.properties
中设置sasl.mechanism.inter.broker.protocol=PLAIN
。
keytool -genkey -alias kafka-server -keystore kafka.server.keystore.jks -storepass kafka123 -validity 365 -keysize 2048
;导出证书并导入信任库:keytool -export -alias kafka-server -file kafka.server.crt -keystore kafka.server.keystore.jks -storepass kafka123
;keytool -import -alias kafka-server -file kafka.server.crt -keystore kafka.server.truststore.jks -storepass kafka123
)。server.properties
中启用SSL,指定证书路径及密码(如listeners=SSL://:9093
、ssl.keystore.location=/etc/kafka/kafka.server.keystore.jks
、ssl.keystore.password=kafka123
、ssl.truststore.location=/etc/kafka/kafka.server.truststore.jks
、ssl.truststore.password=kafka123
、ssl.enabled.protocols=TLSv1.2
、ssl.cipher.suites=TLS_AES_128_GCM_SHA256,TLS_AES_256_GCM_SHA384
)。server.properties
,设置授权器为AclAuthorizer
,禁止无ACL时的全局访问(如authorizer.class.name=kafka.security.authorizer.AclAuthorizer
、allow.everyone.if.no.acl.found=false
)。kafka-configs.sh
添加用户(如kafka-configs.sh --zookeeper localhost:2181 --entity-type users --entity-name user1 --alter --add-config SCRAM-SHA-256=[password=test123]
);创建用户组并添加成员(如kafka-configs.sh --zookeeper localhost:2181 --entity-type groups --entity-name group1 --alter --add-config Members=user1,user2
)。kafka-acls.sh
定义权限(如允许user1
向topic1
生产消息:kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --add --allow-principal User:user1 --operation Produce --topic topic1
;允许group1
从topic1
消费消息:kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --add --allow-principal Group:group1 --operation Consume --topic topic1
)。firewall-cmd
开放Kafka端口(默认9092用于SASL_PLAINTEXT,9093用于SSL;若使用Zookeeper,需开放2181端口),并限制访问源(如firewall-cmd --permanent --zone=public --add-port=9093/tcp
;firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="9093" protocol="tcp" accept'
;firewall-cmd --reload
)。server.properties
中配置listeners
为具体IP(如listeners=SASL_SSL://192.168.1.100:9093
),而非0.0.0.0
,避免暴露给无关网络。server.properties
中配置日志路径(如log.dirs=/var/log/kafka
),通过log4j.properties
调整日志级别(如log4j.logger.kafka.authorizer.logger=WARN
),记录用户访问、权限变更等活动。grep
、awk
等工具分析日志(如grep "Unauthorized" /var/log/kafka/server.log
),及时发现未授权访问尝试。setenforce 0
)或调整其策略(如setsebool -P kafka_connect_any 0
);避免使用默认的Zookeeper端口(2181),修改为非标准端口。yum update kafka
),修复已知漏洞;定期备份/var/lib/kafka
数据目录(如使用rsync
或tar
),防止数据丢失。/etc/security/limits.conf
,增加Kafka进程的文件描述符(如kafka hard nofile 65536
)和进程数限制(如kafka hard nproc 65536
),防止DoS攻击。通过以上步骤,可构建CentOS环境下Kafka的多层安全防护体系,满足生产环境的基本安全需求。需根据实际场景调整配置(如使用Kerberos替代SCRAM-SHA-256实现更高级的身份认证)。