如何设置Web日志审计的告警策略?
美国、香港服务器
如何设置Web日志审计的告警策略?
07-01 来源:
一、先梳理需要配置的核心告警规则(安全必配)
1. 访问类告警(攻击识别)
单个 IP 5 分钟内请求超过 100 次(CC、端口扫描)
同一 IP 短时间大量 403/404 请求(目录爆破、漏洞扫描)
高频 POST 请求(疑似上传木马、登录暴力破解)
恶意特征 URL 访问:eval、base64、webshell、cmd、phpinfo、sql注入关键字
2. 业务异常告警
5xx 服务错误突增(程序崩溃、服务宕机)
大量 401 未授权访问(后台暴力破解)
3. 日志自身安全告警
日志文件被删除、篡改、日志轮转异常
日志长时间无新增(Web 服务异常、采集中断)
二、方案 1:轻量 Shell 脚本定时告警(适合单机 Nginx+GoAccess,零组件依赖)
前置:配置钉钉机器人 Webhook(推荐,实时推送)
钉钉群 → 群设置 → 智能群助手 → 添加自定义机器人
安全设置:选择加签,保存 Webhook 地址 + 密钥
编写告警推送通用脚本 log_alert.sh
1. 钉钉告警推送函数脚本
bash
运行
#!/bin/bash
# log_alert.sh
WEBHOOK="你的钉钉webhook地址"
SECRET="你的加签密钥"
send_ding() {
CONTENT=$1
TIMESTAMP=$(date +%s%3N)
SIGN=$(echo -n "${TIMESTAMP}\n${SECRET}" | openssl dgst -sha256 -hmac ${SECRET} -binary | base64)
curl -s "${WEBHOOK}×tamp=${TIMESTAMP}&sign=${SIGN}" \
-H "Content-Type: application/json" \
-d "{\"msgtype\":\"text\",\"text\":{\"content\":\"【Web日志安全告警】\n${CONTENT}\n告警时间:$(date "+%Y-%m-%d %H:%M:%S")\"}}"
}
授权:
bash
运行
chmod +x /usr/local/bin/log_alert.sh
2. 规则 1:单 IP 高频访问告警(5 分钟访问超 100 次)
bash
运行
#!/bin/bash
LOG_FILE="/var/log/nginx/access.log"
TMP_FILE=$(mktemp)
# 取最近5分钟日志
awk -v time="$(date -d "5 minutes ago" +%Y-%m-%dT%H:%M)" "$1 >= time {print $2}" $LOG_FILE > $TMP_FILE
# 统计IP访问次数,超过100次触发告警
awk "{ips[$1]++}END{for(ip in ips)if(ips[ip]>100)print ip":"ips[ip]}" $TMP_FILE > /tmp/attack_ip.txt
if [ -s /tmp/attack_ip.txt ];then
ALERT_CONTENT="检测到高频访问恶意IP:\n$(cat /tmp/attack_ip.txt)"
/usr/local/bin/log_alert.sh "$ALERT_CONTENT"
fi
rm -rf $TMP_FILE
3. 规则 2:恶意 WebShell / 注入特征告警
bash
运行
grep -E "eval|base64|cmd=|select.*from|union.*select|webshell" /var/log/nginx/access.log > /tmp/shell_attack.log
if [ -s /tmp/shell_attack.log ];then
/usr/local/bin/log_alert.sh "检测到Web注入/木马扫描行为:\n$(cat /tmp/shell_attack.log)"
# 自动封禁恶意IP
ATTACK_IP=$(cat /tmp/shell_attack.log | awk "{print $2}" | sort | uniq)
iptables -A INPUT -s $ATTACK_IP -j DROP
fi
4. 规则 3:5xx 服务异常告警
bash
运行
ERROR_COUNT=$(grep "" 5[0-9][0-9] " /var/log/nginx/access.log | wc -l)
if [ $ERROR_COUNT -gt 20 ];then
/usr/local/bin/log_alert.sh "Nginx大量5xx异常,错误请求总数:${ERROR_COUNT}"
fi
5. 配置定时任务(每 5 分钟执行一次告警检测)
bash
运行
crontab -e
*/5 * * * * /shell/nginx_alert.sh >> /var/log/alert_task.log 2>&1
三、方案 2:GoAccess 结合日志脚本告警
GoAccess 仅做可视化,无法原生告警,搭配上面 Shell 脚本:
GoAccess 输出实时日志文件
脚本定期扫描日志异常特征,触发钉钉告警
额外配置:GoAccess 页面异常访问记录单独告警后台扫描行为。
四、方案 3:ELK Stack(Kibana)企业级告警(多服务器集中告警,等保推荐)
步骤 1:开启 Kibana 告警功能(X-Pack 安全)
进入 Kibana → Stack 管理 → 告警和规则 → 创建规则
数据源选择 Elasticsearch
常用告警规则配置
规则 1:短时间单 IP 请求次数 > 100
索引:Nginx 日志索引
时间范围:最近 5 分钟
聚合:按client_ip分组,统计 count > 100
触发条件:命中条数 > 0 → 推送钉钉 / 邮件
规则 2:403、404 访问量突增
过滤条件:status:403 OR status:404
5 分钟总量 > 50 触发告警
规则 3:检测注入、WebShell 恶意 URL
匹配:request:(*eval* OR *base64* OR *union select* OR *cmd=*)
规则 4:5xx 错误峰值告警
status:500 OR status:502 OR status:503,阈值 20 条触发告警
步骤 2:配置告警通知渠道
钉钉 / Webhook、企业微信、邮箱、短信
告警分组:安全告警推送给运维安全组,业务错误推送给开发群
配置告警防抖:相同 IP10 分钟内只告警一次,避免刷屏
进阶能力
告警联动:触发攻击告警后,自动调用 API 在防火墙封禁攻击 IP;
告警报表:每日自动推送 Web 安全访问日报。
三二互联专业提供香港VPS,美国VPS主机,香港云服务器租用等业务香港美国到大陆CN2 GIA速度最快