AI安全告警配置:从日志采集到告警通知的实操步骤

AI应用上线后,模型接口被刷、异常调用或敏感内容输出往往最先体现在日志里。
告警配置的核心不是堆规则,而是把“日志字段→检测逻辑→通知渠道”串成一条可验证的链路。
下面以一台运行Nginx反向代理和Python推理服务的Linux服务器为例,演示从零配置一条针对“高频调用”的AI安全告警。

先确认日志里有哪些可用字段

AI安全告警依赖的日志至少要包含:请求时间、客户端IP、请求路径、响应状态码、响应耗时。
如果使用Nginx作为入口,默认的combined格式缺少耗时字段,需要自定义。

修改Nginx配置,在http块中增加一个日志格式:

log_format ai_security '$remote_addr - $remote_user [$time_local] '
                       '"$request" $status $body_bytes_sent '
                       '"$http_referer" "$http_user_agent" '
                       'rt=$request_time';
access_log /var/log/nginx/ai_access.log ai_security;

执行nginx -t检查语法后重载nginx -s reload。
检查日志文件是否出现rt=字段:tail -n 5 /var/log/nginx/ai_access.log。
如果字段缺失,先确认log_format写在http块内,且access_log引用了正确的格式名。

编写检测规则并接入告警脚本

以“同一IP在60秒内请求超过100次”作为异常条件。
新建Python脚本/opt/ai_alert/check_freq.py,读取日志尾部并统计:

import re, time, collections
from datetime import datetime, timedelta

LOG_PATH = '/var/log/nginx/ai_access.log'
THRESHOLD = 100
WINDOW = 60

def parse_line(line):
    m = re.match(r'(\S+) .* \[(.*?)\] "(.*?)" (\d+) .* rt=(\S+)', line)
    if not m:
        return None
    ip, ts, req, status, rt = m.groups()
    t = datetime.strptime(ts, '%d/%b/%Y:%H:%M:%S %z')
    return ip, t, req, status, float(rt)

counts = collections.Counter()
now = datetime.now().astimezone()
with open(LOG_PATH) as f:
    for line in f:
        p = parse_line(line)
        if p and now - p[1] < timedelta(seconds=WINDOW):
            counts[p[0]] += 1

for ip, cnt in counts.items():
    if cnt > THRESHOLD:
        print(f'ALERT: IP {ip} 在{WINDOW}秒内请求{cnt}次,超过阈值{THRESHOLD}')

将脚本加入crontab,每分钟执行一次:* * * * * /usr/bin/python3 /opt/ai_alert/check_freq.py >> /var/log/ai_alert.log 2>&1。
脚本输出会写入/var/log/ai_alert.log,后续可接入邮件或Webhook通知。

验证告警是否按预期触发

在另一台机器上用ab或curl循环发起请求,观察/var/log/ai_alert.log是否出现ALERT行:

for i in $(seq 1 120); do curl -s http://你的服务器IP/health > /dev/null; done

如果日志中没有告警,依次检查:cron服务是否运行(systemctl status cron)、脚本是否有执行权限(chmod +x)、日志路径是否与Nginx配置一致、时间窗口计算是否因时区导致偏差。
确认后,再用tail -f /var/log/ai_alert.log实时观察。

配置通知渠道与日常维护

告警日志本身不会主动通知人,需要增加发送环节。
以Webhook为例,在脚本的print后追加requests.post调用(需安装requests库),将告警内容推送到企业微信或钉钉机器人。
注意不要把机器人密钥硬编码在脚本里,建议通过环境变量传入。

日常维护时,定期检查日志轮转是否影响脚本读取(logrotate配置中postrotate可重载Nginx),并观察告警频率是否合理。
阈值过低会产生大量误报,过高则可能漏掉真实攻击,建议先以观察模式运行一周再调整。

常见疑问

告警规则只能检测频率吗? 不是。
频率只是最容易验证的起点,还可以针对特定状态码(如大量401)、敏感路径(如/v1/chat/completions异常参数)或响应内容关键词做规则,但需要先确保日志字段能覆盖这些维度。

脚本读取整个日志文件会不会太慢? 示例中每次读取全文件并过滤时间窗口,日志量大时建议改用tail -n 5000或记录上次读取位置(offset),只处理新增行。

没有Nginx能配置吗? 可以。
如果AI服务直接暴露,可在应用层记录结构化日志(如JSON格式),告警脚本改为解析JSON字段即可,核心思路不变:字段完整、规则明确、验证可重复。

分享到:
上一篇
给AI应用配安全运营规则,先打通日志到告警的链路
下一篇
给AI应用配安全日志,先定字段再落地采集与验证
1
系统公告

关于香港云优质服务器IP地址更换的通知

尊敬的客户: 因原IP运营商大幅涨价,为避免成本转嫁至用户,我司决定更换IP服务商。本次更换后,您的续费价格将保持不变,且新IP网络质量与服务标准不受影响。新IP已分配至后台,即刻生效(更换的新IP都是香港原生IPv4)。 涉及 IP 段: 45.192.x.x 旧 IP 停用时间: 2026 年 12 月 1 日
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意