fdsimoes-git/idps-agent-smith

GitHub: fdsimoes-git/idps-agent-smith

面向 GCP 上 Node.js 应用的 AI 驱动入侵检测与告警代理系统,解决实时威胁监测与快速响应问题。

Stars: 1 | Forks: 0

IDPS Agent

# IDPS 代理 [![License: MIT](https://img.shields.io/badge/License-MIT-brightgreen.svg)](LICENSE) 适用于 GCP 上运行 Node.js 的网络入侵检测与防御系统,具备 AI 驱动的威胁分析能力。 ## 概述 IDPS 代理实时监控服务器日志文件,使用可配置规则检测威胁,通过 Telegram 发送告警,并可选地使用 Claude AI 分析威胁并采取自主防御操作。 **适用场景:** 在 Nginx + Cloudflare 后方运行 Node.js 的 GCP e2-micro 实例。 ## 功能特性 - **10 种检测规则**:暴力破解、端口扫描、HTTP 泛洪、4xx/5xx 激增、SSH 滥用、扫描器用户代理、地理异常、SQL 注入、XSS、封禁后重新访问 - **实时日志监控**:Nginx、auth.log、UFW、fail2ban、systemd 日志 - **Telegram 告警**:带严重级别标签,包含协议/请求/来源上下文和内联操作命令 - **AI 分析**:Claude 评估高危/严重威胁,分类攻击类型并推荐操作 - **自主模式**:通过 fail2ban 和 iptables 实现 AI 驱动的自动 IP 阻断(可配置) - **人工介入**:通过 Telegram 命令手动阻断、加入白名单、生成报告 - **每日摘要**:上午 08:00 发送,**每周 AI 报告**在周一发送 - **HTTP API**:提供 `/health` 和 `/stats` 端点 - **蜜罐(可选)**:监听诱饵端口以捕获探测服务器的攻击者,包含统计与数据可视化 - **地理 IP 增强**:通过 ip-api.com(免费,无需 API 密钥)自动查询攻击者 IP 的国家/城市/ISP - **轻量级**:单进程、内存存储、最小依赖 ## 系统要求 - Node.js >= 20 - Ubuntu 24(GCP e2-micro) - Nginx(配置为反向代理) - Cloudflare(在服务器前端) - fail2ban(已安装并运行) - iptables(可用) ## 快速安装 ``` # 克隆仓库(不要克隆到 /opt/idps-agent — setup.sh 会安装到那里) git clone ~/idps-agent cd ~/idps-agent # 以 root 身份运行 setup sudo bash setup.sh ``` 安装脚本将: 1. 创建 `idps-agent` 系统用户 2. 设置日志与数据目录 3. 安装 Node.js 依赖 4. 配置文件权限与 sudoers 5. 安装 systemd 服务 ## 配置 所有配置均通过 **systemd 服务文件中的环境变量** 设置: ``` sudo nano /etc/systemd/system/idps-agent.service ``` | 变量 | 是否必需 | 描述 | |---|---|---| | `TELEGRAM_BOT_TOKEN` | 是 | Telegram 机器人 API 令牌 | | `TELEGRAM_CHAT_ID` | 是 | 告警用的 Telegram 聊天 ID | | `ANTHROPIC_API_KEY` | 是 | Anthropic API 密钥,用于 Claude AI | | `ANTHROPIC_MODEL` | 否 | Claude 模型用于 AI 分析(默认:`claude-sonnet-4-20250514`) | | `ANTHROPIC_DECISION_MODEL` | 否 | Claude 模型用于自主模式威胁决策(默认:`claude-haiku-4-5-20251001`) | | `AUTONOMOUS_MODE` | 否 | `true` 启用自动阻断(默认:`false`) | | `MONITORED_SERVICE` | 是 | 应用对应的 systemd 服务名称 | | `API_BEARER_TOKEN` | 是 | `/stats` 端点的 Bearer 令牌 | | `ALLOWED_COUNTRIES` | 否 | 逗号分隔的国家代码(默认:`BR,US`) | | `IDPS_PORT` | 否 | HTTP API 端口(默认:`3001`) | | `HONEYPOT_ENABLED` | 否 | `true` 启用蜜罐诱饵端口(默认:`false`) | | `HONEYPOT_PORTS` | 否 | 逗号分隔的诱饵端口(默认:`2222,8080,3389,5900`) | | `HONEYPOT_SSH_PORTS` | 否 | 模拟 SSH 服务器的端口(含横幅与凭证日志,默认:`2222`) | | `HONEYPOT_DATA_PATH` | 否 | 蜜罐数据文件路径(默认:`/var/log/idps-agent/honeypot.json`) | | `HONEYPOT_HTTP_ENABLED` | 否 | `true` 启用 HTTP 蜜罐(含伪造登录页,默认:`false`) | | `HONEYPOT_HTTP_PORT` | 否 | HTTP 蜜罐监听端口(默认:`8080`) | | `GEOIP_ENABLED` | 否 | `false` 禁用地理 IP 查询(默认:`true`) | | `GEOIP_API_URL` | 否 | ip-api.com 基础 URL(默认:`http://ip-api.com`)。付费计划可使用 `https://pro.ip-api.com` | | `HONEYPOT_DAILY_DIGEST` | 否 | `true` 启用通过 Telegram 发送每日蜜罐活动摘要(默认:`false`) | | `HONEYPOT_DIGEST_TIME` | 否 | 每日摘要发送时间(`HH:MM` 格式,默认:`08:00`)。优先于 `HONEYPOT_DIGEST_HOUR` | | `HONEYPOT_DIGEST_HOUR` | 否 | 每日摘要发送小时(0-23,默认:`8`)。若同时设置 `HONEYPOT_DIGEST_TIME` 则忽略此值 | | `HONEYPOT_MAX_FILE_MB` | 否 | `honeypot.json` 达到此大小(MB)后进行 gzip 压缩轮换(默认:`50`),保留最近 3 个归档 | | `HONEYPOT_ARCHIVE_ENABLED` | 否 | `false` 禁用 gzip 压缩/轮换(默认:`true`)。禁用后即使超过大小也不会轮换 | | `HONEYPOT_ARCHIVE_NDJSON` | 否 | `true` 同时生成压缩的 NDJSON 导出文件(默认:`false`) | | `HONEYPOT_ARCHIVE_NDJSON_MAX_MB` | 否 | 触发 NDJSON 导出的 `honeypot.json` 大小阈值(MB,默认:`10`),超过时跳过导出并警告 | | `MEMORY_ALERT_MB` | 否 | RSS 阈值(MB),超过后通过 Telegram 发送告警(每小时限一次,默认:`256`) | ## 日志磁盘限制 `setup.sh` 会安装一个 journald 降级配置至 `/etc/systemd/journald.conf.d/idps-agent.conf`(源自 `journald-idps-agent.conf`),使用 `SystemMaxUse=100M` 与 `SystemKeepFree=50M` 限制总日志磁盘用量。这些是 journald 设置,**不适用于 service unit**,因此 idps-agent 服务文件中不包含它们。如需修改限制,请编辑降级配置并运行 `sudo systemctl restart systemd-journald`。 ## Nginx 日志格式 IDPS 代理要求 Nginx 访问日志的第一个字段为真实客户端 IP(来自 Cloudflare)。请在 `nginx.conf` 中添加以下内容: ``` http { log_format cf '$http_cf_connecting_ip - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent"'; access_log /var/log/nginx/access.log cf; } ``` ### 通过 Nginx 进行 IP 阻断 IDPS 代理会自动管理 `/etc/nginx/blocked-ips.conf`,在 HTTP 层面阻断被封禁的 IP(这在 Cloudflare 后方至关重要,因为 iptables 仅能看到 Cloudflare 的 IP)。请在每个 nginx `server` 块中添加以下包含项: ``` server { include /etc/nginx/blocked-ips.conf; # ... rest of your config } ``` ## 运行 ``` # 启动 sudo systemctl start idps-agent # 开机启用 sudo systemctl enable idps-agent # 检查状态 sudo systemctl status idps-agent # 查看日志 sudo journalctl -u idps-agent -f # 运行状况检查 curl http://localhost:3001/health # 统计信息(受保护) curl -H "Authorization: Bearer YOUR_TOKEN" http://localhost:3001/stats ``` ## Telegram 命令 | 命令 | 描述 | |---|---| | `/block_ip ` | 通过 fail2ban + iptables 阻断 IP | | `/whitelist ` | 屏蔽未来针对某 IP 的告警 | | `/report ` | 对某 IP 活动进行 AI 深度分析报告 | | `/status` | 当前威胁统计与摘要 | | `/honeypot` | 蜜罐统计摘要 | | `/help` | 显示可用命令 | ## 检测规则 | 规则 | 触发条件 | 严重级别 | |---||---| | brute-force | 60 秒内 5 次以上登录失败(401/403)来自同一 IP | MEDIUM/HIGH | | port-scan | 30 秒内来自同一 IP 的 10 个以上不同端点 | HIGH | | http-flood | 60 秒内来自同一 IP 的 100 次以上请求 | HIGH/CRITICAL | | 4xx-spike | 1 分钟内 30 次以上客户端错误(全局) | MEDIUM | | 5xx-spike | 1 分钟内 3 次以上服务器错误(全局) | HIGH | | ssh-abuse | 同一 IP 3 次以上 SSH 登录失败 | HIGH/CRITICAL | | suspicious-user-agent | 已知扫描器签名(sqlmap、nikto、nmap 等) | HIGH | | geo-anomaly | 来自未允许国家/地区的请求 | LOW | | sqli-attempt | URL 中的 SQL 注入模式 | CRITICAL | | xss-attempt | URL 中的 XSS 模式 | HIGH | | post-ban-access | 被封禁后再次访问服务器的 IP | MEDIUM | | honeypot | 连接诱饵蜜罐端口 | HIGH | | honeypot (HTTP) | 伪造管理登录页面的凭证尝试 | HIGH | ## AI 集成 当检测到 HIGH 或 CRITICAL 威胁时,Claude AI 将: 1. 分析完整上下文(日志数据、IP 历史、检测规则、协议、HTTP 方法/状态、用户代理、来源) 2. 分类攻击类型并给出置信度评分 3. 推荐操作:`block`、`monitor`、`ignore` 或 `escalate` 4. 提供可读解释 **自主模式**(`AUTONOMOUS_MODE=true`):置信度 ≥ 70% 的 AI 推荐阻断将自动执行。 **人工介入**(`AUTONOMOUS_MODE=false`):AI 提出建议,操作员通过 Telegram 命令确认。 AI 决策将记录至 `/var/log/idps-agent/ai-decisions.log`。 ## 蜜罐 可选的集成蜜罐,监听可配置的诱饵端口以主动探测试图攻击服务器的行为。 ### 工作原理 1. TCP 服务器监听诱饵端口(默认:2222、8080、3389、5900) 2. 任何连接均被记录,包括攻击者 IP、时间戳与捕获的有效载荷 3. 每次连接生成一条 HIGH 级别 `honeypot` 威胁,并进入标准检测流程(告警、AI 分析、自主阻断) 4. 统计信息以 7 天滚动窗口持久化到磁盘 ### SSH 横幅模拟 `HONEYPOT_SSH_PORTS`(默认:`2222`)所列端口将模拟真实 SSH 服务器而非静默 TCP 监听: 1. 连接时发送伪造 SSH 横幅(`SSH-2.0-OpenSSH_8.9p1 Ubuntu-3`) 2. 记录客户端发送的 SSH 版本字符串(首行响应) 3. 尝试捕获基础认证交换中的用户名/密码(许多机器人会明文发送凭证) 4. 在蜜罐统计中存储增强数据:横幅、客户端版本及尝试的凭证 SSH 相关数据以所有报告格式(ASCII、Telegram、HTML)呈现,包括顶级客户端版本与近期凭证尝试。 ### 启用 ``` # 在 systemd 服务环境中 HONEYPOT_ENABLED=true HONEYPOT_PORTS=2222,8080,3389,5900 # optional, these are the defaults HONEYPOT_SSH_PORTS=2222 # optional, ports to emulate SSH (default: 2222) ``` ### 每日摘要 启用后(`HONEYPOT_DAILY_DIGEST=true`),将在配置时间通过 Telegram 发送每日摘要,包括:24 小时总命中数、唯一攻击 IP、最受目标端口、最活跃时段及顶级凭证尝试。计划中的“Top Countries”章节待地理 IP 集成(参见 #18)。 ### 数据可视化 - **HTML 报告**:`GET /honeypot/report` — 包含顶级攻击 IP、最受探测端口、每小时连接分布及最近有效载荷的完整可视化报告 - **JSON 统计**:`GET /honeypot/stats` — 原始统计数据,供程序访问 - **Telegram**:`/honeypot` 命令 — 内联摘要,含顶级攻击者与端口 两个 HTTP 端点均需使用与 `/stats` 相同的 `Authorization: Bearer` 令牌。 ### 端口选择建议 选择攻击者常扫描但服务器未使用的端口: - `2222` — 备用 SSH - `8080` — HTTP 代理/备用 Web - `3389` — RDP(Windows 远程桌面) - `5900` — VNC - `6379` — Redis - `27017` — MongoDB - `3306` — MySQL 请避免使用服务器实际使用的端口。低于 1024 的端口需要 `CAP_NET_BIND_SERVICE` 或 root 权限。 ### HTTP 蜜罐 可选的 HTTP 服务器,提供具有说服力的伪造管理登录页面以捕获凭证填充攻击并识别扫描工具。 #### 工作原理 1. HTTP 服务器监听可配置端口(默认:8080) 2. 提供真实感强的伪造登录页面,覆盖常见管理路径: - `/wp-admin`、`/wp-login.php` — WordPress 登录 - `/admin`、`/login`、`/dashboard` — 通用管理面板 - `/phpmyadmin` — phpMyAdmin 登录 - 其他路径返回模仿真实 Nginx 的 404 3. POST 请求至登录页面将捕获提交的凭证(用户名/密码) 4. 返回“凭证无效”响应以保持机器人活跃并尝试更多密码 5. 每个请求均记录 IP、路径、用户代理与时间戳 6. 用户代理字符串会检查是否匹配已知扫描工具签名(sqlmap、Nikto、Hydra、Nmap 等) 7. 凭证尝试生成 HIGH 级别威胁并进入标准告警流程 #### 启用 ``` # 在 systemd 服务环境中 HONEYPOT_HTTP_ENABLED=true HONEYPOT_HTTP_PORT=8080 # optional, 8080 is the default ``` **注意:** 若同时在 `HONEYPOT_PORTS` 中使用 TCP 蜜罐的 8080 端口,请在启用 HTTP 蜜罐时从该列表中移除 8080 以避免端口冲突。 ## 地理 IP 增强 攻击者 IP 将自动通过免费的 [ip-api.com](http://ip-api.com) 服务增强地理数据(国家/城市/ISP/代理/托管标识)。无需 API 密钥。 - **默认启用** — 设置 `GEOIP_ENABLED=false` 可禁用 - 结果内存缓存(最多 1,000 个 IP)以避免重复查询 - 同一 IP 的并发查询合并为单个出站请求 - 速率限制:45 请求/分钟(ip-api.com 免费层限制) - 私有/保留 IP(10.x、192.168.x、127.x 等)自动跳过 - 地理数据出现在蜜罐报告中:顶级攻击 IP 显示国家代码,所有报告格式(Telegram、HTML、ASCII)均包含“Top Countries”细分 ## 架构 ``` src/ ├── index.js # Main entry — wires everything together ├── store.js # In-memory IP tracking with TTL cleanup ├── parsers/ # Log line parsers (nginx, auth, ufw, fail2ban, journal) ├── detectors/ # Detection rules (one per file) ├── alerters/ # Telegram alerts + daily summary ├── ai/ # Claude AI analyzer, autonomous actions, threat memory ├── honeypot/ # Optional decoy port listeners, stats, reports, and protocol emulators │ └── protocols/ # Protocol-specific handlers (SSH banner emulation, etc.) ├── api/ # HTTP health/stats endpoints ├── bot/ # Telegram bot command handler └── utils/ # Logger, sanitizer, file tailer, cooldown manager, origin identifier, geo-IP ``` ## 部署建议 1. 首次启动时设置 `AUTONOMOUS_MODE=false` 2. 在 `/var/log/idps-agent/ai-decisions.log` 中查看 AI 决策 3. 对可疑 IP 使用 `/report ` 验证 AI 准确性 4. 确认 AI 判断可靠后启用自主模式 5. 通过 `/stats` 监控内存使用——内存存储每 5 分钟清理一次 ## 文件清单 | 文件 | 用途 | |---|---| | `config.js` | 中心配置文件(读取环境变量) | | `idps-agent.service` | systemd 服务模板 | | `setup.sh` | Ubuntu 24 的自动化安装脚本 | | `.gitignore` | 排除密钥与日志 |
标签:4xx/5xx异常检测, AI安全, Chat Copilot, Claude AI, Cloudflare, fail2ban, GCP, GCP e2-micro, Geo-IP, GNU通用公共许可证, Google Cloud, HTTP API, HTTP洪水检测, iptables, IP封禁, LangChain, MITM代理, MITRE ATT&CK, Nginx, Node.js, SQL注入检测, SSH防护, Telegram告警, Ubuntu 24, XSS检测, 云端安全, 人机协同, 健康检查, 免杀技术, 入侵防御, 协议上下文, 后封禁再访问, 周报, 地理异常检测, 威胁分析, 安全可视化, 安全告警, 实时日志监控, 暴力破解检测, 每日摘要, 用户代理扫描, 端口扫描检测, 统计端点, 自动化侦查工具, 自动化响应, 自动阻断, 自定义脚本, 蜜罐, 证书利用, 轻量级