Linux下PHP-FPM安全配置指南
PHP-FPM(FastCGI Process Manager)是Linux環境下PHP應用的關鍵組件,其安全配置直接影響服務器整體安全性。以下是分步驟的安全加固措施:
定期更新系統和PHP-FPM是修復已知安全漏洞的首要步驟。使用包管理器(如apt
)執行:
sudo apt update && sudo apt upgrade php-fpm php-cli
確保所有依賴包同步更新,避免因舊版本漏洞引發風險。
避免PHP-FPM以root
身份運行,降低權限濫用風險。編輯PHP-FPM進程池配置文件(通常位于/etc/php/{版本號}/fpm/pool.d/www.conf
),修改以下參數:
user = www-data
group = www-data
修改后重啟服務使變更生效:
sudo systemctl restart php{版本號}-fpm
```。
### **3. 選擇安全的監聽方式(Unix Socket優先)**
- **Unix Socket**:相比TCP端口,Unix Socket僅限本地訪問,更安全。修改配置文件中的`listen`指令:
```ini
listen = /run/php/php{版本號}-fpm.sock
確保Socket文件權限正確(屬主為www-data
,權限為755
):
sudo chown www-data:www-data /run/php
sudo chmod 755 /run/php
127.0.0.1
),并配置防火墻規則。通過進程池參數控制PHP-FPM的資源消耗,防止資源耗盡攻擊:
pm = dynamic # 動態進程管理模式
pm.max_children = 50 # 最大子進程數(根據服務器內存調整,如2GB內存建議30-40)
pm.start_servers = 5 # 啟動時的子進程數
pm.min_spare_servers = 5 # 最小空閑進程數
pm.max_spare_servers = 35 # 最大空閑進程數
合理配置可平衡性能與安全性。
php.ini
(或fpm/php.ini
)中禁用可執行系統命令的函數,防止惡意代碼執行:disable_functions = exec,passthru,shell_exec,system,eval
allow_url_fopen
和allow_url_include
,防止遠程文件包含攻擊:allow_url_fopen = Off
allow_url_include = Off
expose_php
,避免泄露PHP版本信息:expose_php = Off
display_errors = Off
log_errors = On
error_log = /var/log/php_errors.log
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
```。
通過open_basedir
限制PHP腳本只能訪問指定目錄,防止非法訪問系統文件:
open_basedir = /var/www/html/:/tmp/
多個目錄用冒號分隔,確保包含網站根目錄(如/var/www/html
)和臨時目錄(如/tmp
)。
使用ufw
(Uncomplicated Firewall)限制對PHP-FPM的訪問:
9000
),僅允許必要IP(如本地127.0.0.1
):sudo ufw allow from 127.0.0.1 to any port 9000/tcp
sudo ufw enable
同時,限制SSH(22/tcp
)、HTTP(80/tcp
)、HTTPS(443/tcp
)等必要服務的訪問。
開啟慢日志可識別執行緩慢的腳本(可能被惡意利用),在進程池配置文件中添加:
request_slowlog_timeout = 10s # 超過10秒的請求視為慢請求
slowlog = /var/log/php-fpm/www-slow.log
定期檢查慢日志,優化性能或排查異常。
sudo apt install selinux-basics selinux-policy-default
sudo setenforce 1
sudo apt install apparmor apparmor-utils
sudo aa-enforce /etc/apparmor.d/usr.sbin.php-fpm
根據實際需求調整策略。
www.conf
、php.ini
)的權限(屬主應為root
,權限為644
),確保無未經授權的修改;通過以上步驟,可顯著提升Linux環境下PHP-FPM的安全性,降低被攻擊的風險。配置完成后,重啟PHP-FPM服務使變更生效:
sudo systemctl restart php{版本號}-fpm