禁用危险函数:通过php.ini文件禁用可能被远程执行的函数(如eval()、exec()、passthru()、shell_exec()等),防止攻击者通过输入恶意代码执行系统命令。例如,在php.ini中添加:disable_functions = eval,exec,passthru,shell_exec。
设置错误日志路径与级别:关闭生产环境的错误显示(避免泄露敏感信息),开启日志记录并将日志保存到安全目录。例如:display_errors = Off、log_errors = On、error_log = /var/log/php_errors.log。同时,将error_reporting设置为E_ALL & ~E_NOTICE & ~E_STRICT,仅记录严重错误。
限制文件操作范围:使用open_basedir指令限制PHP脚本只能访问指定目录(如Web根目录),防止恶意代码遍历文件系统。例如:open_basedir = /var/www/html/:/tmp/。
设置正确权限:日志文件应仅能被Web服务器用户(如apache、nginx)和授权管理员访问。例如,使用chown将日志文件所有者设为apache,组设为adm;用chmod设置权限为640(-rw-r-----):chown apache:adm /var/log/php_errors.log、chmod 640 /var/log/php_errors.log。
使用SELinux增强保护:通过SELinux限制对日志文件的写访问。例如,为日志目录设置httpd_sys_rw_content_t上下文:semanage fcontext -a -t httpd_sys_rw_content_t "/var/log/php_errors.log",然后应用上下文:restorecon -v /var/log/php_errors.log。
配置日志轮转:使用logrotate工具自动分割、压缩旧日志,防止日志文件过大占用磁盘空间。创建/etc/logrotate.d/php文件,添加以下内容:
/var/log/php_errors.log {
daily
missingok
rotate 7
compress
notifempty
create 640 apache adm
sharedscripts
postrotate
systemctl reload httpd > /dev/null 2>&1 || true
endscript
}
此配置表示每天轮转日志,保留7天的压缩日志。
使用专业日志分析工具:借助ELK Stack(Elasticsearch+Logstash+Kibana)或Splunk实现日志的集中存储、实时分析与可视化。例如,通过ELK设置关键词告警(如“SQL injection”“XSS attack”),快速定位异常请求。
自动化监控与告警:使用Fail2Ban监控日志中的恶意行为(如频繁的登录失败、SQL注入尝试),自动封禁攻击IP。例如,创建/etc/fail2ban/jail.local文件,添加以下规则:
[php-errors]
enabled = true
filter = php-errors
action = iptables[name=PHP, port=80, protocol=tcp]
logpath = /var/log/php_errors.log
maxretry = 5
bantime = 3600
此配置表示当1小时内出现5次PHP错误(如SQL注入),则封禁该IP 1小时。
实时监控异常活动:通过grep、awk等工具定期检查日志中的异常关键词(如“Unauthorized”“eval”“union select”)。例如,实时监控PHP错误日志:tail -f /var/log/php_errors.log | grep -i "eval\|union select\|sql injection"。
定期审计日志:每周检查日志文件,统计恶意请求的数量、来源IP和类型(如SQL注入、XSS、文件上传漏洞)。例如,使用以下命令统计某IP的失败登录次数:grep "Login failed" /var/log/php_errors.log | grep "192.168.1.100" | wc -l。
验证日志完整性:通过哈希算法(如SHA256)确保日志未被篡改。在记录日志时,同时计算内容的哈希值并保存到安全位置(如数据库);读取日志时,重新计算哈希值并与保存的值对比,若不一致则说明日志被修改。
应急响应流程:一旦发现可疑活动(如大量恶意请求、敏感文件被访问),立即采取以下措施:
iptables封禁);rpm -Va验证系统文件完整性);