在CentOS上配置PHP安全需从系统基础加固、PHP核心配置、Web服务器防护、扩展与监控等多维度入手,以下是具体步骤:
保持系统和PHP最新是防范已知漏洞的关键。执行以下命令更新所有软件包:
sudo yum update -y
sudo yum install epel-release -y # 启用EPEL仓库(可选,用于安装额外PHP扩展)
安装或更新PHP及相关扩展(如MySQL、GD、MBString等):
sudo yum install php php-cli php-fpm php-mysqlnd php-gd php-mbstring php-xml php-bcmath -y
若使用PHP-FPM(常见于Nginx/Apache反向隧道场景),需修改其池配置文件(通常为/etc/php-fpm.d/www.conf),关键设置如下:
apache或nginx等非特权用户:user = apache
group = apache
pm.max_children(如50),防止资源耗尽攻击:pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
disable_functions = eval,assert,system,shell_exec,passthru,exec,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
security.limit_extensions = .php .php3 .php4 .php5 .phtml
修改后重启PHP-FPM:
sudo systemctl restart php-fpm
编辑主配置文件/etc/php.ini,强化以下关键参数:
display_errors = Off
log_errors = On
error_log = /var/log/php_errors.log # 确保目录可写
file_uploads = On
upload_max_filesize = 2M
post_max_size = 8M
session.cookie_httponly = On # 禁止JavaScript访问Cookie
session.cookie_secure = On # 仅通过HTTPS传输Cookie(需启用HTTPS)
session.cookie_samesite = Strict # 限制跨站请求携带Cookie
session.gc_maxlifetime = 1440 # 会话有效期(分钟)
allow_url_fopen = Off
allow_url_include = Off
password_hash_default = bcrypt
根据使用的Web服务器(Apache/Nginx),调整配置以减少攻击面:
编辑虚拟主机或全局配置文件(如/etc/httpd/conf/httpd.conf或/etc/httpd/conf.d/php.conf),添加以下指令:
<Directory "/var/www/html">
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
<Directory "/var/www/html">
AllowOverride None # 仅在必要时开启(如需要URL重写)
</Directory>
编辑虚拟主机配置文件(如/etc/nginx/conf.d/default.conf),添加以下指令:
.htaccess):location ~ /\.ht {
deny all;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php-fpm/www.sock; # 根据实际路径调整
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
使用firewalld仅开放必要的HTTP(80)和HTTPS(443)端口,阻止非法IP访问:
sudo yum install firewalld -y
sudo systemctl start firewalld
sudo systemctl enable firewalld
sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --reload
通过SSL/TLS加密网站流量,防止数据在传输过程中被窃取或篡改。使用mod_ssl模块(Apache)或Nginx原生支持配置HTTPS:
sudo yum install mod_ssl openssl -y
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/pki/tls/private/apache-selfsigned.key -out /etc/pki/tls/certs/apache-selfsigned.crt
/etc/httpd/conf.d/ssl.conf):<VirtualHost *:443>
ServerName yourdomain.com
DocumentRoot /var/www/html
SSLEngine on
SSLCertificateFile /etc/pki/tls/certs/apache-selfsigned.crt
SSLCertificateKeyFile /etc/pki/tls/private/apache-selfsigned.key
</VirtualHost>
sudo systemctl restart httpd # Apache
# 或
sudo systemctl restart nginx # Nginx
使用ModSecurity(开源WAF)拦截SQL注入、XSS、CSRF等常见攻击:
sudo yum install mod_security -y
sudo systemctl enable mod_security
sudo systemctl start mod_security
默认规则集可通过OWASP ModSecurity Core Rule Set (CRS)增强,需额外下载并配置。
rsync或mysqldump定期备份,存储到异地或云存储:rsync -avz --delete /var/www/html/ /backup/website_backup/
mysqldump -u root -p your_database | gzip > /backup/db_backup.sql.gz
fail2ban防止暴力破解,定期检查PHP错误日志(/var/log/php_errors.log)和Web服务器日志:sudo yum install fail2ban -y
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
通过以上步骤,可显著提升CentOS上PHP应用的安全性。需定期更新系统和配置,应对新的安全威胁。