PHP-FPM在Linux上的安全设置方法
确保PHP-FPM以非root用户(如www-data)运行,降低权限滥用风险。修改配置文件(路径通常为/etc/php/{version}/fpm/pool.d/www.conf或/etc/php-fpm.d/www.conf),设置:
user = www-data
group = www-data
若使用Unix socket通信,还需明确socket文件的归属与权限:
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
修改后重启服务使配置生效:sudo systemctl restart php{version}-fpm。
listen指令设置为:listen = /run/php/php{version}-fpm.sock
listen指令为127.0.0.1:9000(仅本地访问),并通过防火墙(如ufw)限制端口访问:sudo ufw allow from 192.168.1.0/24 to any port 9000 # 仅允许可信IP段
sudo ufw enable
www.conf中通过disable_functions指令禁用可能执行系统命令的函数,如:disable_functions = exec,shell_exec,system,passthru,curl_exec,fopen,file_put_contents
php.ini中关闭远程文件包含和打开URL的功能,防止恶意代码远程执行:allow_url_fopen = Off
allow_url_include = Off
expose_php以避免暴露PHP版本信息,减少针对性攻击:expose_php = Off
/var/www/html)仅能被Web服务器用户读写,避免其他用户修改文件:sudo chown -R www-data:www-data /var/www/html
sudo find /var/www/html -type d -exec chmod 755 {} \;
sudo find /var/www/html -type f -exec chmod 644 {} \;
uploads)设置在Web根目录之外(如/var/uploads),并禁止脚本执行:sudo mkdir /var/uploads
sudo chown www-data:www-data /var/uploads
sudo chmod 755 /var/uploads
在Web服务器配置中添加规则,禁止上传目录执行PHP:location ~* ^/uploads/.*\.php$ {
deny all;
}
php.ini中设置display_errors = Off,避免将敏感信息(如数据库凭据、路径)暴露给用户。/var/log/php-fpm/error.log),便于后续审计:log_errors = On
error_log = /var/log/php-fpm/error.log
定期检查日志文件,关注异常请求(如大量404错误、可疑POST请求)。php.ini中启用:opcache.enable = 1
opcache.enable_cli = 1
opcache.memory_consumption = 128
opcache.interned_strings_buffer = 8
opcache.max_accelerated_files = 4000
opcache.revalidate_freq = 60
ufw或iptables限制对PHP-FPM端口(TCP 9000或Unix socket)的访问,仅允许可信IP地址连接。sudo apt update && sudo apt upgrade -y
www.conf)中的权限设置、禁用函数列表,确保无遗漏;使用ps命令监控PHP-FPM进程,确认其以www-data用户运行。setsebool命令限制PHP-FPM的网络访问:sudo setsebool -P httpd_can_network_connect_db 0 # 禁止PHP连接数据库(按需调整)
sudo setsebool -P httpd_enable_homedirs 0 # 禁止访问用户家目录
/etc/apparmor.d/usr.sbin.php-fpm),限制其对系统目录(如/etc、/root)的访问权限,增强进程隔离。