1. 首页 > 技术教程 > 正文

SSH 被爆破怎么办?AI Agent 自动统计攻击 IP 和失败次数

VPS 只要开了 22 端口,被 SSH 暴力破解是迟早的事。主机选经常看到新手对着 `/var/log/auth.log` 发愁,满屏的“Failed password”看着确实闹心。与其手动一条条查 IP,不如部署一个 AI Agent,让它自动统计攻击 IP 和失败次数,甚至分析攻击来源特征。这不仅能省下人力,还能把枯燥的日志变成直观的安全报告,方便后续配合防火墙策略。

zhujixuan TASK 202

解析 SSH 日志与数据清洗

要统计攻击情况,第一步是把日志里的“干货”提炼出来。Linux 自带的文本处理工具完全够用,不用装额外的重型软件。我们主要关注“Failed password”这类关键词,提取攻击者的 IP 地址和尝试次数。

登录 VPS 终端,执行以下命令查看最近的爆破记录:

grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr | head -n 10

如果系统是 CentOS/Rocky,日志路径通常是 `/var/log/secure`。

这条命令的逻辑很简单:
1. `grep "Failed password"`:筛选出登录失败的行。
2. `awk '{print $(NF-3)}'`:提取倒数第 3 列,通常是 IP 地址(不同系统日志格式略有差异,建议先用 `head` 看一眼结构)。
3. `sort | uniq -c`:排序并统计每个 IP 出现的次数。
4. `sort -nr`:按次数从高到低排序,把最猖狂的 IP 放在最前面。

如果输出结果里有几百次失败的记录,说明你的 VPS 正在被“狂轰滥炸”。

Docker 部署 n8n 搭建 AI Agent

光靠 `grep` 只能看到冷冰冰的数字。我们用 n8n 作为工作流引擎,配合大模型 API(如 OpenAI 或 DeepSeek)来做一个能“思考”的 AI Agent。它负责接收日志数据,分析攻击模式,并生成总结报告。

拉取 n8n 镜像并启动:

docker run -d –name n8n \
-p 5678:5678 \
-e N8N_BASIC_AUTH_ACTIVE=true \
-e N8N_BASIC_AUTH_USER=admin \
-e N8N_BASIC_AUTH_PASSWORD=your_strong_password \
-v ~/.n8n:/home/node/.n8n \
n8nio/n8n

注意:务必修改 `your_strong_password`,且不要直接将 5678 端口暴露在公网。建议配合 Nginx 反向代理,并配置 IP 白名单或 Basic Auth,防止别人乱触你的 Webhook。

配置 AI Agent 工作流

n8n 启动后,访问 `http://你的VPS_IP:5678`,新建一个 Workflow。

创建 Webhook 接收数据

拖入一个Webhook节点,设置为 `POST` 方法。这个节点用来接收定时任务发过来的日志统计结果。

连接 AI 模型

拖入一个OpenAI节点(或者HTTP Request节点调用其他模型 API)。在 Prompt 里填入指令,让 AI 充当安全分析师:

> 你是一个服务器安全专家。以下是从 Linux auth.log 中提取的 SSH 攻击统计数据,包含 IP 地址和失败尝试次数。请分析这些数据,判断是否存在暴力破解趋势,识别高频攻击源,并给出简要的安全建议。数据格式为:“次数 IP”。

输出结果

可以接一个Respond to Webhook节点,把 AI 的分析结果返回,或者直接发到 Telegram/企业微信机器人里告警。

定时任务联动与自动化

现在我们需要一个脚本,定期把刚才统计的数据扔给 n8n 的 Webhook。

写一个简单的 Shell 脚本 `ssh_monitor.sh`:

#!/bin/bash

DATA=$(grep "Failed password" /var/log/auth.log | tail -n 1000 | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr | awk '{print $1 " " $2}')

if [ -z "$DATA" ]; then
exit 0
fi

curl -X POST http://127.0.0.1:5678/webhook/ssh-analysis \
-H "Content-Type: application/json" \
-d "{\"attack_data\": \"$DATA\"}"

给脚本执行权限:

chmod +x ssh_monitor.sh

加入 Crontab,每小时跑一次:

crontab -e

添加一行:

0 * * * * /root/ssh_monitor.sh

这样,每小时 AI Agent 都会帮你巡视一遍 SSH 日志,告诉你哪个 IP 最嚣张,甚至能根据频率判断是脚本扫描还是定向攻击。

老鸟叮嘱

1.日志轮转问题:Linux 日志默认会轮转(logrotate),`grep` 全量文件会浪费 IO。建议脚本里只读最近一小时或最近 1000 行,用 `tail -n 1000` 配合管道过滤效率更高。
2.别让 AI 直接操作防火墙:虽然有风险,但很多人想实现自动封禁。建议让 AI 只输出 IP 列表或 Fail2ban 规则建议,再由脚本二次校验后执行。直接让 AI 调用 `iptables` 容易把自己关在外面。
3.API Key 安全:n8n 里配置 Credential 时,最好使用环境变量存储 API Key,不要明文写在 Workflow 里导出。
4.资源占用:n8n 比较吃内存,低配 VPS(如 512M 内存)跑起来可能吃力。如果机器配置一般,建议直接用 Python 脚本调用 API,别上 n8n 这种重型调度器。

FAQ

Q1:AI Agent 能直接自动封禁 IP 吗?
技术上可以,让 n8n 调用 SSH 节点执行 `iptables` 命令,但风险极高。一旦 AI 误判或数据格式错误,可能会把正常用户的 IP 或你自己封掉。建议只做分析和告警,人工确认后再封禁。

Q2:除了 n8n 还有什么轻量级方案?
如果 VPS 内存小于 1G,别用 n8n。写个 Python 脚本,用 `requests` 库把日志 POST 到大模型 API,再把结果打印出来或发邮件,资源占用几乎可以忽略不计。

Q3:如何区分是扫描还是针对性爆破?
可以在 Prompt 里告诉 AI:“如果同一个 IP 尝试了不同的用户名(如 root, admin, test),判定为全网扫描;如果只针对一个用户名高频尝试,判定为针对性爆破。” AI 能根据上下文很好地识别这两种模式。

Q4:日志里没有 IP 只有 hostname 怎么办?
有些攻击者反向解析了域名,或者你的配置做了反向解析。用 `awk` 时注意看列的位置,或者在 SSH 配置(`sshd_config`)里关闭 `UseDNS`,重启 SSHD 服务,这样日志里就会直接显示 IP。

Q5:用本地模型(如 Ollama)跑这个流程可行吗?
可行。在 n8n 里配置 LangChain 节点连接本地 Ollama。不过分析这种简单的统计任务,用 `llama3:8b` 这种小模型足矣,不需要上 70B,否则小 VPS 内存会爆。

把这套流程跑起来,你的 VPS 安全运维就从“人工查日志”进化到了“AI 辅助运营”,不仅效率高,排查故障时也有据可依。

转载请注明出处:https://www.zhujixuan.com/jishujiaocheng/10118.html 商家投稿邮箱:zhujixuanblog@qq.com