创建专用用户和组,避免使用root运行Kafka,降低系统风险。
# 创建kafka组和用户(-r表示系统用户,-m自动创建家目录)
sudo groupadd kafka
sudo useradd -m -r -g kafka kafka
将Kafka安装目录(如/usr/local/kafka
)的所有权赋予kafka
用户和组,设置750
权限(所有者可读写执行,组可读执行,其他用户无权限):
sudo chown -R kafka:kafka /usr/local/kafka
sudo chmod -R 750 /usr/local/kafka
Kafka数据目录(如/var/lib/kafka
,存储消息日志)需严格限制为kafka
用户专属访问:
sudo chown -R kafka:kafka /var/lib/kafka
sudo chmod -R 750 /var/lib/kafka
Kafka日志目录(如/var/log/kafka
,存储服务运行日志)同样需隔离权限:
sudo chown -R kafka:kafka /var/log/kafka
sudo chmod -R 750 /var/log/kafka
配置文件(如/etc/kafka/server.properties
)需限制为root和kafka
组可读,防止未授权修改:
sudo chown root:kafka /etc/kafka/server.properties
sudo chmod 640 /etc/kafka/server.properties
编辑server.properties
,添加以下关键配置以提升权限安全性:
listeners=PLAINTEXT://your_server_ip:9092
advertised.listeners=PLAINTEXT://your_server_ip:9092
security.inter.broker.protocol=SASL_SSL
sasl.mechanism.inter.broker.protocol=PLAIN
sasl.enabled.mechanisms=PLAIN
ssl.keystore.location=/path/to/kafka.server.jks
ssl.keystore.password=your_keystore_password
authorizer.class.name=org.apache.kafka.common.security.auth.SimpleAclAuthorizer
allow.everyone.if.no.acl.found=false # 禁止无ACL时的默认访问
super.users=User:admin # 定义超级用户(如admin),用于管理ACL
通过systemd单元文件配置Kafka以kafka
用户身份启动,避免权限提升风险。
编辑/etc/systemd/system/kafka.service
(若不存在则创建),添加以下内容:
[Unit]
Description=Apache Kafka Server
After=network.target zookeeper.service
[Service]
Type=simple
User=kafka
Group=kafka
ExecStart=/usr/local/kafka/bin/kafka-server-start.sh /usr/local/kafka/config/server.properties
ExecStop=/usr/local/kafka/bin/kafka-server-stop.sh
Restart=on-failure
[Install]
WantedBy=multi-user.target
加载并启动服务:
sudo systemctl daemon-reload
sudo systemctl start kafka
sudo systemctl enable kafka
通过防火墙(如iptables)仅允许可信IP访问Kafka端口(默认9092):
# 允许特定IP(如192.168.1.100)访问9092端口
sudo iptables -A INPUT -p tcp -s 192.168.1.100 --dport 9092 -j ACCEPT
# 拒绝其他IP访问9092端口
sudo iptables -A INPUT -p tcp --dport 9092 -j DROP
# 保存规则(根据系统选择对应命令)
sudo service iptables save # CentOS 6
sudo iptables-save > /etc/iptables/rules.v4 # Ubuntu/Debian
生成自签名证书并导入Keystore(用于Broker间加密):
# 生成私钥和证书
sudo openssl req -newkey rsa:2048 -nodes -keyout kafka.server.key -x509 -days 365 -out kafka.server.crt
# 转换为Java Keystore格式
sudo keytool -import -alias kafka -file kafka.server.crt -keystore kafka.server.jks -storepass your_password -noprompt
# 设置证书权限(仅kafka用户可访问)
sudo chown kafka:kafka kafka.server.jks
sudo chmod 600 kafka.server.jks
创建JAAS配置文件(如/etc/kafka/kafka_server_jaas.conf
),定义Broker认证信息:
KafkaServer {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="admin"
password="admin-secret"
user_admin="admin-secret"; # 超级用户密码
};
启动Kafka时指定JAAS文件路径:
export KAFKA_OPTS="-Djava.security.auth.login.config=/etc/kafka/kafka_server_jaas.conf"
sudo systemctl restart kafka
使用kafka-acls.sh
工具为Topic分配权限,例如授予用户alice
对test_topic
的读写权限:
# 添加ACL(--bootstrap-server指定Broker地址)
kafka-acls.sh --bootstrap-server localhost:9092 \
--add --allow-principal User:alice --operation Read --topic test_topic
kafka-acls.sh --bootstrap-server localhost:9092 \
--add --allow-principal User:alice --operation Write --topic test_topic
查看Topic的ACL列表:
kafka-acls.sh --bootstrap-server localhost:9092 --list --topic test_topic
通过以上步骤,可实现Kafka在Linux环境下的权限精细化管理,覆盖用户隔离、文件保护、网络控制、加密认证及访问授权等全流程安全需求。