一、用戶與組管理:隔離Kafka進程權限
創建專用用戶和組,避免以root身份運行Kafka,降低安全風險。
# 創建kafka組和用戶(-r表示系統用戶,-g指定主組)
sudo groupadd kafka
sudo useradd -m -r -g kafka kafka
二、文件系統權限:限制目錄訪問范圍
將Kafka的安裝目錄、數據目錄、日志目錄的所有權歸屬到kafka用戶和組,并設置嚴格的目錄權限(750:所有者可讀寫執行,組可讀執行,其他用戶無權限)。
# 假設Kafka安裝在/usr/local/kafka,數據目錄為/var/lib/kafka,日志目錄為/var/log/kafka
sudo chown -R kafka:kafka /usr/local/kafka # 安裝目錄
sudo chown -R kafka:kafka /var/lib/kafka # 數據目錄(Broker存儲消息的地方)
sudo chown -R kafka:kafka /var/log/kafka # 日志目錄(Broker和消費者日志)
sudo chmod -R 750 /usr/local/kafka
sudo chmod -R 750 /var/lib/kafka
sudo chmod -R 750 /var/log/kafka
三、配置文件權限:保護敏感配置
Kafka的核心配置文件(如server.properties)需限制為root用戶可寫、kafka組可讀,防止未經授權的修改。
# 假設配置文件路徑為/etc/kafka/server.properties
sudo chown root:kafka /etc/kafka/server.properties
sudo chmod 640 /etc/kafka/server.properties
四、服務啟動用戶:確保以kafka身份運行
通過systemd單元文件配置Kafka服務以kafka用戶啟動,避免權限提升風險。
# 編輯Kafka的systemd服務文件(通常位于/etc/systemd/system/kafka.service)
sudo vim /etc/systemd/system/kafka.service
在[Service]段添加以下內容:
User=kafka
Group=kafka
保存后重載systemd并重啟Kafka服務:
sudo systemctl daemon-reload
sudo systemctl restart kafka
五、網絡訪問控制:限制端口訪問
通過防火墻(如firewalld)開放Kafka監聽端口(默認9092),僅允許受信任的IP地址訪問。
# 開放9092端口(TCP協議)
sudo firewall-cmd --zone=public --add-port=9092/tcp --permanent
# 重載防火墻規則
sudo firewall-cmd --reload
六、SSL/TLS加密:保障通信安全
為Kafka配置SSL/TLS,加密Broker與客戶端、Broker之間的通信,防止數據泄露。
keytool生成密鑰庫(Keystore)和信任庫(Truststore)。# 生成密鑰庫(包含Broker私鑰和證書)
keytool -genkeypair -alias kafka -keyalg RSA -keystore kafka.server.keystore.jks -validity 365 -storepass kafka-pass -keypass kafka-key-pass
# 導出證書(用于客戶端信任)
keytool -exportcert -alias kafka -keystore kafka.server.keystore.jks -file kafka.server.crt -storepass kafka-pass
# 導入證書到信任庫(Broker信任客戶端)
keytool -importcert -alias kafka -file kafka.server.crt -keystore kafka.server.truststore.jks -storepass kafka-trust-pass
server.properties中添加SSL參數。listeners=SSL://:9093
security.inter.broker.protocol=SSL
ssl.keystore.location=/path/to/kafka.server.keystore.jks
ssl.keystore.password=kafka-pass
ssl.key.password=kafka-key-pass
ssl.truststore.location=/path/to/kafka.server.truststore.jks
ssl.truststore.password=kafka-trust-pass
七、SASL認證:實現身份驗證
通過SASL(如PLAIN機制)驗證客戶端和Broker的身份,防止未授權訪問。
/etc/kafka/sasl_server.conf),定義Broker認證憑據。KafkaServer {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="admin"
password="admin-secret"
user_admin="admin-secret" # admin用戶的密碼
user_producer="producer-secret" # producer用戶的密碼
user_consumer="consumer-secret"; # consumer用戶的密碼
};
server.properties中啟用SASL。listeners=SASL_SSL://:9093
security.inter.broker.protocol=SASL_SSL
sasl.mechanism.inter.broker.protocol=PLAIN
sasl.enabled.mechanisms=PLAIN
authorizer.class.name=kafka.security.authorizer.AclAuthorizer
allow.everyone.if.no.acl.found=false
super.users=User:admin # admin用戶擁有所有權限
export KAFKA_OPTS="-Djava.security.auth.login.config=/etc/kafka/sasl_server.conf"
sudo -u kafka /usr/local/kafka/bin/kafka-server-start.sh /usr/local/kafka/config/server.properties
八、ACL(訪問控制列表):精細化權限管理
使用Kafka自帶的kafka-acls.sh工具,基于用戶、主題、操作類型(讀/寫/創建等)設置權限,遵循最小權限原則。
server.properties中已配置authorizer.class.name=kafka.security.authorizer.AclAuthorizer和allow.everyone.if.no.acl.found=false。producer用戶對test-topic的寫權限:kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 \
--add --allow-principal User:producer --operation Write --topic test-topic
consumer用戶對test-topic的讀權限:kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 \
--add --allow-principal User:consumer --operation Read --topic test-topic
admin用戶對所有主題的管理權限(創建、刪除等):kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 \
--add --allow-principal User:admin --operation All --topic *
通過以上步驟,可實現Kafka在Linux環境下的權限精細化管理,覆蓋用戶隔離、文件保護、網絡控制、通信加密和訪問授權等全流程安全需求。