近日检查服务器日志时,发现大量异常请求尝试扫描 WordPress 站点的敏感路径和文件。攻击者使用自动化脚本系统性地探测网站漏洞,日志中充斥着各种恶意请求:
45.155.205.xxx - - [25/Jan/2024:16:53:57 +0000] "GET /wp-admin/admin-ajax.php HTTP/1.1" 404 150 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36" 185.180.143.xxx - - [26/Jan/2024:21:10:00 +0000] "POST /xmlrpc.php HTTP/1.1" 403 162 "-" "python-requests/2.28.1" 78.128.113.xxx - - [03/Feb/2024:21:14:32 +0000] "GET /.env HTTP/1.1" 403 13 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" |
这些扫描请求具有明显特征:高频访问敏感路径、使用异常 User-Agent、产生大量 404/403 错误响应。传统的手动处理方式已无法应对这种规模的自动化攻击。
安装步骤:
# 更新系统包列表 sudo apt update # 安装 Fail2ban sudo apt install fail2ban # 启用并启动服务 sudo systemctl enable fail2ban sudo systemctl start fail2ban # 验证安装 sudo systemctl status fail2ban |
基础配置(/etc/fail2ban/jail.local):
[DEFAULT] # 禁止时间(24小时) bantime = 86400 # 查找时间窗口(10分钟) findtime = 600 # 最大重试次数 maxretry = 3 # 忽略本地网络 ignoreip = 127.0.0.1/8 192.168.1.0/24 # 使用 UFW 作为防火墙后端 banaction = ufw |
创建过滤器(/etc/fail2ban/filter.d/nginx-wp-scan.conf):
[Definition] failregex = ^<HOST> -.*"(GET|POST).* (wp-admin|wp-login|xmlrpc\.php).* 404 ^<HOST> -.*"(GET|POST).* /(\.env|wp-config\.php).* HTTP ^<HOST> -.*"(GET|POST).* (eval|base64_decode|call_user_func).* HTTP ^<HOST> -.*"(GET|POST).* \.(sql|bak|backup|old).* HTTP ignoreregex = |
启用防护规则(/etc/fail2ban/jail.d/wordpress.conf):
[wordpress-scan] enabled = true port = http,https filter = nginx-wp-scan logpath = /var/log/nginx/access.log maxretry = 5 findtime = 600 bantime = 86400 action = %(action_mwl)s |
设置 UFW 基础规则:
# 重置防火墙 sudo ufw --force reset # 设置默认策略 sudo ufw default deny incoming sudo ufw default allow outgoing # 允许基础服务 sudo ufw allow ssh sudo ufw allow http sudo ufw allow https # 启用防火墙 sudo ufw enable |
添加安全头限制:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | server { # 添加安全头部 add_header X-Frame-Options "SAMEORIGIN" always; add_header X-XSS-Protection "1; mode=block" always; add_header X-Content-Type-Options "nosniff" always; # 阻止敏感文件访问 location ~ /\.(env|git|ht) { deny all; return 403; } location ~* (wp-admin|wp-login) { # 允许内部网络访问 allow 192.168.1.0/24; deny all; # 限制请求频率 limit_req zone=wp_limit burst=5 nodelay; } } |
# 测试过滤器规则 sudo fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-wp-scan.conf # 查看当前封禁状态 sudo fail2ban-client status wordpress-scan # 实时监控封禁情况 sudo tail -f /var/log/fail2ban.log | grep 'Ban' |
#!/bin/bash # 安全状态监控脚本 echo "=== 安全防护状态 ===" echo "检查时间: $(date)" echo echo "1. Fail2Ban 封禁统计:" sudo fail2ban-client status wordpress-scan | grep -E '(Currently banned|Total banned)' echo echo "2. 最近封禁记录:" sudo tail -10 /var/log/fail2ban.log | grep 'Ban' | awk '{print $5,$6,$7}' echo echo "3. 当前网络连接数:" netstat -an | grep :80 | wc -l |
对于高频请求的进一步防护:
[nginx-request-flood] enabled = true port = http,https filter = nginx-request-flood logpath = /var/log/nginx/access.log maxretry = 100 findtime = 60 bantime = 3600 |
# 安装 ipset sudo apt install ipset # 创建国家黑名单 ipset create country_blacklist hash:net # 添加需要封锁的国家IP段 |
通过 Fail2Ban 与 Nginx、系统防火墙的联动,我们构建了三层防护体系:
实施建议:
预期效果:
这套方案能够有效应对当前普遍存在的自动化扫描攻击,为 WordPress 站点提供坚实的安全保障。