CentOS7环境下使用Modsecurity自动封禁触发严重告警境外IP的方法咨询
实现自动封禁触发ModSecurity严重告警非本国IP的操作步骤
1. 确认ModSecurity严重级别日志输出正常
- 打开你的ModSecurity主配置文件,Nginx环境默认路径为
/etc/nginx/modsec/modsec.conf,Apache环境默认路径为/etc/httpd/conf.d/mod_security.conf - 确保
SecAuditLog配置项已开启,添加规则筛选严重级别告警:SecAuditLogRelevantStatus "^(?:5|4(?!04))",确认所有severity:CRITICAL级别的规则触发后都会输出到审计日志中 - 执行命令
grep CRITICAL /var/log/modsec_audit.log验证日志是否正常输出,确认每条严重告警日志都包含[client 客户端IP]格式的IP字段
2. 安装IP归属地查询工具
- 执行命令安装GeoIP工具:
yum install geoip -y - 验证工具可用性:执行
geoiplookup 8.8.8.8,确认返回结果包含IP对应的国家代码,比如中国对应国家代码为CN,后续以此为匹配依据 - 如有更高的IP归属地准确率需求,可自行替换
/usr/share/GeoIP/GeoIP.dat数据库文件
3. 编写自动封禁脚本
- 新建脚本文件
/usr/local/bin/modsec_ban.sh,写入以下内容:
#!/bin/bash # 配置项:允许放行的国家代码,多个用空格分隔 ALLOW_COUNTRY="CN" # 封禁时长,单位秒,86400为1天,设为0则为永久封禁 BAN_TIME=86400 # ModSecurity审计日志路径,根据实际环境修改 MODSEC_LOG="/var/log/modsec_audit.log" # 临时IP存储文件路径 TEMP_IP="/tmp/modsec_temp_ip.txt" # 提取最近产生的严重告警IP,去重 grep "CRITICAL" $MODSEC_LOG | awk '/\[client/ {print $3}' | tr -d ']' | sort | uniq > $TEMP_IP # 遍历处理所有待检测IP while read ip; do # 跳过已经被CSF封禁的IP,避免重复处理 if csf -g $ip | grep -q "Denied"; then continue fi # 查询IP所属国家代码 country=$(geoiplookup $ip | awk -F ": " '{print $2}' | awk '{print $1}') # 非允许国家的IP执行封禁 if [[ ! " $ALLOW_COUNTRY " =~ " $country " ]]; then csf -td $ip $BAN_TIME "ModSecurity严重告警触发封禁,归属国:$country" fi done < $TEMP_IP # 清理临时文件 rm -f $TEMP_IP
- 给脚本添加执行权限:
chmod +x /usr/local/bin/modsec_ban.sh - 手动执行脚本验证功能:
/usr/local/bin/modsec_ban.sh,执行后运行csf -t查看临时封禁列表,确认符合规则的IP已被封禁
4. 配置定时任务实现自动执行
- 执行
crontab -e添加定时任务,以下配置为每10分钟执行一次脚本,可根据需求调整执行间隔:*/10 * * * * /usr/local/bin/modsec_ban.sh > /dev/null 2>&1
注意事项
- 提前将自己的办公IP添加到CSF白名单
/etc/csf/csf.allow中,避免误封导致无法登录服务器 - 定期检查ModSecurity规则,减少误报情况,避免合法IP被误封禁
- 如果ModSecurity日志路径和示例不一致,必须修改脚本中的
MODSEC_LOG变量为实际路径,否则脚本无法正常提取IP
内容的提问来源于stack exchange,提问作者Wael
相关产品推荐
相关产品推荐

