用 Apache 日志预防网站攻击的实操方案
一 建立日志基线与安全存放
<FilesMatch "\.(log|txt)$">
Order Allow,Deny
Deny from all
</FilesMatch>
二 识别常见攻击的日志特征与排查命令
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head
grep " 404 " access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head
grep "POST /login" access.log | awk '{print $1}' | sort | uniq -c | sort -nr
grep -i "UNION.*SELECT" access.log
grep -i -E "sleep\(|benchmark\(" access.log
grep "GET .*'.*" access.log
grep "GET .*%27.*" access.log
grep -E "\.\./|\.\.%2f" access.log
grep -E "\.\.\\|\.\.%5c" access.log
grep -i -E "<script|%3Cscript" access.log
grep -i -E "onerror=|onload=|onmouseover=" access.log
grep "POST " access.log | grep "\.php" | awk '{print $7}' | sort | uniq -c | sort -nr | head
grep -i -E "python|curl|wget|nmap|sqlmap|antsword|godzilla" access.log
grep -i "wp-admin\|wp-login\|adminer\|phpmyadmin" access.log
三 从告警到处置的自动化闭环
[sshd]
enabled = true
maxretry = 5
bantime = 3600
[apache-auth]
enabled = true
filter = apache-auth
logpath = /var/log/apache2/error.log
maxretry = 5
bantime = 3600
[apache-noscript]
enabled = true
filter = apache-noscript
logpath = /var/log/apache2/access.log
maxretry = 10
bantime = 7200
# 伪代码
if 单IP在5分钟内404>100 or 对 /login POST>20:
将IP写入iptables DROP或.htaccess Deny
elif 系统负载与连接数恢复正常:
恢复默认配置
四 加固与长期改进
五 快速响应清单