AI中转站日志审计溯源恶意API调用记录
为什么AI中转站需要日志审计
AI中转站(即代理多个AI API的服务器)一旦被恶意利用,轻则额度被刷光,重则导致服务瘫痪。
日志审计就是把这些「痕迹」记录下来——谁、什么时候、调用了哪个接口、返回了什么状态。
有了完整记录,才能精准溯源并封禁。
动手配置:开启请求与响应日志(以Nginx为例)
大部分AI中转站使用Nginx反向代理。
先检查当前日志配置,打开站点配置文件(通常位于 /etc/nginx/conf.d/ 或 /etc/nginx/sites-available/)。
http {
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
access_log /var/log/nginx/access.log main;
}
如果想记录响应时间及请求体大小,可扩展自定义格式。
记得保存后执行 nginx -t 测试配置,再 systemctl reload nginx 重载。
建议:为AI中转站单独开一个日志文件,方便后续分析。
在server块中加入:
access_log /var/log/nginx/ai_gateway.log main;
日志分析实战:从海量记录中揪出异常IP
假设日志位于 /var/log/nginx/ai_gateway.log,先看最近1000条:
tail -n 1000 ai_gateway.log | less
定位高频IP:恶意调用通常表现为短时间内大量请求。
用awk统计IP出现次数:
awk '{print $1}' ai_gateway.log | sort | uniq -c | sort -nr | head -20
如果某个IP请求量异常高(例如超过正常用户数十倍),记录下来。
查看具体请求内容:过滤该IP的日志:
grep '^123.45.67.89 ' ai_gateway.log | head -50
注意看请求路径、参数和返回状态码。
恶意调用常返回 429(限流)、401(鉴权失败)或200(成功消耗额度)。
若发现返回200且路径为 /v1/chat/completions 这类高消耗接口,基本可确认恶意。
时间模式:用 grep 按小时统计:
awk '{print $2, $4}' ai_gateway.log | cut -d: -f1 | sort | uniq -c | sort -nr
恶意行为常集中在凌晨或业务低峰期。
容易踩的坑:日志轮转、隐私脱敏与性能影响
- 日志轮转:长期运行不轮转会撑爆磁盘。使用logrotate配置,例如
/etc/logrotate.d/nginx中设置rotate 7和daily。 - 隐私脱敏:日志中可能包含客户端IP、User-Agent等,若需对外分享审计结果,先脱敏(如用
sed替换IP末段)。 - 性能影响:开启access_log会增加I/O开销。若机器压力大,可调整缓冲:
access_log /var/log/nginx/ai_gateway.log main buffer=64k flush=5s; - 不要依赖默认格式:默认日志不含请求体,无法看到传入的prompt或key。如需全量审计,可在upstream中增加
$request_body,但注意磁盘消耗。
验证效果:一条命令快速检查是否还在被刷
配置好日志和自动封禁后,定期执行以下命令查看异常IP是否消失:
# 统计最近5分钟请求TOP20
tail -50000 ai_gateway.log | awk -v now="$(date +%d/%b/%Y:%H:%M)" -v ago="$(date +%d/%b/%Y:%H:%M -d '5 minutes ago')" '{if ($4 >= "["ago && $4 <= "["now) print $1}' | sort | uniq -c | sort -nr | head -20
若之前的高频IP不再出现,说明封禁生效;
否则需检查fail2ban规则或WAF配置。
---
高频问题
- 日志文件被清空怎么办? 检查logrotate是否误删。建议保留至少一周日志再做轮转。
- 怎样自动封禁恶意IP? 结合fail2ban,匹配日志中的异常模式(如返回429过多)。具体配置可参考后续教程。
- 能否用ELK做可视化? 可以,但中小站点推荐先用命令行快速定位。
如果你正在处理AI中转站日志审计溯源恶意API调用记录,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。