1. 配置PHP错误日志记录
关闭生产环境中的错误显示,防止敏感信息(如数据库凭证、服务器路径)泄露给终端用户。修改php.ini文件,设置display_errors = Off;开启错误日志记录,指定安全的日志路径(如/var/log/php_error.log),并通过error_reporting参数限制记录的错误级别(推荐E_ALL & ~E_NOTICE & ~E_STRICT,避免记录不必要的调试信息)。此外,可通过自定义错误处理程序(如set_error_handler函数)捕获错误,将错误信息写入受保护的日志文件,而非直接显示给用户。
2. 设置严格的文件权限
确保PHP日志文件的权限设置合理,仅允许必要用户访问。通常,日志文件的所有者应为运行PHP进程的用户(如www-data或apache),组可设置为www-data,权限设为640(所有者可读写,组可读,其他用户无权限),命令示例:chmod 640 /var/log/php_error.log、chown www-data:www-data /var/log/php_error.log。同时,日志文件所在目录的权限应设为755(所有者可读写执行,组和其他用户可读执行),确保PHP进程能正常写入日志。
3. 限制日志文件访问范围
通过SELinux或AppArmor等安全模块,进一步限制对日志文件的访问。若系统启用SELinux,可使用audit2allow工具分析日志并生成自定义策略,允许Web服务器用户(如www-data)写入日志目录;若使用AppArmor,编辑对应配置文件(如/etc/apparmor.d/usr.sbin.apache2),添加日志目录的写入权限(如/var/log/php_error.log rw)。此外,避免将日志文件存放在Web根目录下,防止通过URL直接访问。
4. 使用日志轮转管理日志文件
通过logrotate工具自动管理日志文件的大小和数量,防止日志文件过大导致磁盘空间耗尽,同时保留历史日志以便审计。编辑/etc/logrotate.d/php配置文件,设置日志轮转规则(如每周轮转、保留4周日志、压缩旧日志),示例配置:
/var/log/php_error.log {
weekly
rotate 4
compress
missingok
notifempty
create 640 www-data www-data
sharedscripts
postrotate
systemctl reload php-fpm # 若使用PHP-FPM,重启服务使配置生效
endscript
}
定期检查logrotate执行情况(如/var/lib/logrotate/status),确保日志轮转正常。
5. 集中管理与实时监控日志
使用rsyslog或syslog-ng等工具将PHP日志集中发送到远程日志服务器,避免本地日志被篡改或删除。配置rsyslog.conf文件,添加如下规则将PHP日志转发到远程服务器(如192.168.1.100):
local6.* @192.168.1.100:514 # UDP转发
local6.* @@192.168.1.100:514 # TCP转发(更可靠)
同时,使用ELK Stack(Elasticsearch+Logstash+Kibana)或Splunk等工具集中分析日志,设置实时警报(如检测到大量500 Internal Server Error或SQL注入关键词时,通过邮件或短信通知管理员),及时发现异常行为。
6. 定期更新与漏洞管理
保持PHP、Web服务器(如Apache/Nginx)及相关库(如MySQL、PDO)的最新版本,及时修补已知安全漏洞(如通过yum update命令更新CentOS仓库中的软件包)。启用自动更新功能(如yum-cron),确保系统持续获得安全补丁,降低因软件漏洞导致的日志泄露风险。