1. 严格管理日志文件权限
通过chmod命令限制日志文件的访问权限,确保只有Apache运行用户(如www-data)及必要管理员可访问。例如:
sudo chown www-data:www-data /var/log/apache2/access.log /var/log/apache2/error.log
sudo chmod 640 /var/log/apache2/access.log /var/log/apache2/error.log
对于关键日志文件,可使用chattr命令设置不可修改属性(需root权限),防止未经授权的删除或篡改:
sudo chattr +a /var/log/apache2/access.log # 仅允许追加内容
sudo chattr +i /var/log/apache2/error.log # 不可修改/删除(需解除后才能修改)
2. 配置日志轮转与归档
使用logrotate工具自动管理日志文件的生命周期,避免单个文件过大导致存储溢出或难以分析。编辑/etc/logrotate.d/apache2文件,添加以下配置:
/var/log/apache2/*.log {
daily # 每日轮转
missingok # 忽略缺失文件
rotate 30 # 保留30个归档文件
compress # 压缩旧日志(节省空间)
delaycompress # 延迟压缩(避免压缩当天日志)
notifempty # 空日志不轮转
create 640 www-data adm # 新日志文件权限与所有者
sharedscripts # 所有日志轮转完成后执行脚本
postrotate
systemctl reload apache2 >/dev/null 2>&1 || true
endscript
}
此配置可自动压缩30天前的日志,并限制新日志文件的访问权限。
3. 监控与实时分析日志
使用日志分析工具实时监控Apache日志,及时发现异常行为(如大量404错误、暴力破解尝试、SQL注入)。常见工具包括:
goaccess /var/log/apache2/access.log --real-time-html --log-format=COMBINED
4. 隐藏Apache版本与敏感信息
修改Apache配置文件(/etc/apache2/apache2.conf或虚拟主机配置),隐藏服务器版本和操作系统信息,减少攻击者针对性探测:
ServerSignature Off # 关闭错误页面中的服务器版本信息
ServerTokens Prod # 仅显示“Apache”而非详细版本和模块信息
此配置可避免在404、500等错误页面中泄露敏感信息。
5. 启用入侵防御与防火墙
sudo apt install fail2ban
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
编辑jail.local,启用Apache日志监控:[apache-badbots]
enabled = true
filter = apache-badbots
action = iptables[name=HTTP, port=http, protocol=tcp]
logpath = /var/log/apache2/access.log
maxretry = 3
bantime = 86400 # 封禁24小时
ufw仅允许必要端口(80/HTTP、443/HTTPS)访问,拒绝其他端口:sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
6. 最小权限与模块管理
/etc/apache2/apache2.conf中的User和Group指令:User www-data
Group www-data
a2dismod命令禁用未使用的模块(如status、autoindex),减少攻击面:sudo a2dismod status autoindex
sudo systemctl restart apache2
7. 定期更新与补丁管理
保持Apache及其依赖库的最新状态,及时修复已知安全漏洞。使用以下命令更新系统:
sudo apt update && sudo apt upgrade -y
建议开启自动安全更新(针对Apache及相关包):
sudo apt install unattended-upgrades
sudo dpkg-reconfigure unattended-upgrades
8. 防止敏感信息泄露
LogLevel指令限制日志详细程度,避免记录敏感信息(如密码、会话ID)。建议设置为warn或error级别:LogLevel warn
SetEnvIf或第三方模块(如mod_security)过滤日志中的敏感字段(如password、credit_card),避免其被记录。例如,在配置文件中添加:SetEnvIf Request_URI ".*password=.*" dontlog
CustomLog /var/log/apache2/access.log combined env=!dontlog