suisuss/secy

GitHub: suisuss/secy

一款运行在沙箱化 Docker 容器中的 Linux 自主安全监控器,利用 Claude AI 持续检测供应链攻击、恶意软件和系统异常。

Stars: 0 | Forks: 0

# secy — Linux 自主安全监控器 一个自主 AI 安全监控器,持续监控您的 Linux 系统以发现威胁。四个容器化服务 —— watch、patrol、C2 和一次性审计 —— 读取主机文件系统,检测异常,关联跨服务发现,并向用户报告可操作的问题。在具有只读主机访问权限的沙箱化 Docker 容器中运行。 ## 工作原理 ``` Host machine ┌─────────────────────────────────────────────────────────────┐ │ │ │ ~/.local/share/secy/ │ │ ├── issues/ ← user-visible output (bind mount) │ │ └── state/ ← patrol history, findings, baselines │ │ │ │ Docker ┌────────────────────────────────────────────┐ │ │ │ state/ bind mount → /var/lib/secy/state │ │ │ │ ├── findings/ ← all services write here │ │ │ │ ├── directives/ ← C2 writes, others read │ │ │ │ ├── patrol/ ← module runs, diffs │ │ │ │ ├── watch/ ← seen DB, queue │ │ │ │ └── c2/ ← progress memory │ │ │ └────────────────────────────────────────────┘ │ │ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ watch │ │ patrol │ │ C2 │ │ │ │ (sensor) │ │ (sensor) │ │ (brain) │ │ │ │ inotify/ │ │scheduled │ │ event- │ │ │ │ poll │ │ scans │ │ driven │ │ │ └────┬─────┘ └────┬─────┘ └────┬─────┘ │ │ │ │ │ │ │ └── findings/ ─┴───────────────┘ │ │ ↑ │ │ │ └─ directives/ ←─┘ │ │ │ │ /host:ro ─────────────────── host filesystem (read-only) │ │ │ │ Host-side (systemd user service) │ │ ┌──────────────────────────────────────────────────┐ │ │ │ notify.sh (inotifywait on issues/) │ │ │ │ → desktop notifications on new findings │ │ │ │ ← cron healthcheck (hourly, restarts if down) │ │ │ └──────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────┘ ``` **Watch** 监控 Downloads 中的新文件 —— 对照恶意软件数据库进行哈希检查,然后使用 Claude 对未知文件进行分诊。**Patrol** 运行计划安全扫描(涵盖端口、服务、内核模块、用户、网络威胁、进程树、临时目录执行、挂载加固等的 41 个模块),对比运行之间的差异,并使用 Claude 审查变更。**C2** 关联跨两个服务的发现,识别复合威胁(例如,可疑下载 + 新的监听端口 + 来自 /tmp 的进程),并为用户创建问题。 问题被写入 `~/.local/share/secy/issues/` —— 自包含的 markdown 文件,描述检测到的内容、证据以及需要调查的内容。主机端通知监视程序会在新问题出现时发送桌面警报。所有内部状态都位于主机的 `~/.local/share/secy/state/` 中。 不在主机上执行任何命令。容器以只读方式在 `/host` 读取主机文件系统,并使用 `sread` —— 一个具有黑名单强制执行和输出修订功能的受限审计工具 —— 来处理可能包含机密的配置文件。 ## 设置 ``` git clone https://github.com/suisuss/secy.git && cd secy ./setup.sh install ``` 这将检查先决条件,构建 Docker 镜像,启动所有服务,并安装桌面通知。 ### 先决条件 - Docker 和 Docker Compose - 以下之一: - **Claude Code OAuth**(Pro/Max 订阅)—— 在主机上通过认证的 `claude` CLI - **Anthropic API key**(按次付费)—— 在 `.env` 中设置 - 如需桌面通知:`inotify-tools`、`libnotify-bin` 在不安装的情况下检查先决条件: ``` ./setup.sh doctor ``` ### 认证 **选项 A:OAuth(Pro/Max 订阅)** 如果您已在主机上通过 `claude` 认证,凭据位于 `~/.claude/.credentials.json`。容器会自动挂载此文件 —— 无需额外配置。 **选项 B:API key** ``` cp .env.example .env # 编辑 .env 并设置 ANTHROPIC_API_KEY=sk-ant-... ``` ## 用法 ### 生命周期命令 ``` ./setup.sh install # Build image, start services, setup notifications ./setup.sh start # Start all services ./setup.sh stop # Stop all services ./setup.sh status # Dashboard of all components ./setup.sh doctor # Check prerequisites, diagnose issues ./setup.sh uninstall # Stop everything, optionally remove data and images ``` ### 一次性扫描 ``` docker compose run --rm secy audit # Full security sweep docker compose run --rm secy baseline # Capture system baseline docker compose run --rm secy monitor # Compare against baseline ``` ### 无 AI(dry-run / 调试) ``` docker compose run --rm secy watch --no-claude docker compose run --rm secy patrol --no-claude docker compose run --rm secy c2 --no-claude ``` ### 预期内容 Agent 在工作时以流式方式输出其活动: ``` [secy 2026-02-09T00:24:06+00:00] Starting audit (max 3 iterations) [secy 2026-02-09T00:24:06+00:00] Iteration 1/3 [init] model=claude-opus-4-6-20250901 [read] /host/proc/net/tcp [read] /host/etc/passwd [bash] find /host -perm -4000 -type f 2>/dev/null [read] /host/etc/ssh/sshd_config [write] /var/lib/secy/state/findings/audit-2026-02-09-002406.md [done] 12 turns, 45230ms ``` 当发现值得用户关注时,会出现包含问题标题和严重程度的桌面通知。 ### 故障排除 **Claude 无输出(立即退出):** ``` docker compose run --entrypoint bash secy -c ' cp /opt/secy/conf/srt-settings.json /root/.srt-settings.json if [ -f /mnt/claude-credentials.json ]; then mkdir -p /root/.claude cp /mnt/claude-credentials.json /root/.claude/.credentials.json fi claude --print -p "say hello" 2>&1 echo "exit: $?" cat /root/.claude/debug/latest 2>/dev/null ' ``` **“Not logged in” 错误:** OAuth 凭据未找到。检查主机上是否存在 `~/.claude/.credentials.json`。 **srt sandbox 失败:** 在大多数 Docker 设置中是预期行为。Agent 会回退到不使用 srt 运行 —— Docker 是主要的沙箱边界。 ## 服务 | 服务 | 角色 | 模型 | 运行方式 | |---------|------|-------|---------| | `secy` | 一次性审计、基线、监控 | Opus | `docker compose run` | | `secy-watch` | 下载恶意软件检测 | Opus | Daemon | | `secy-patrol` | 计划安全扫描 | Opus | Daemon | | `secy-c2` | 跨服务关联 | Haiku | Daemon | Watch 和 patrol 使用 Opus 对原始、非结构化输入(未知文件、模棱两可的系统更改)进行细致判断。C2 使用 Haiku —— 它的输入已经过分诊和结构化,因此关联任务更简单。 ### Watch 使用 inotify(带回退轮询)监控 `/home/*/Downloads/` 中的新文件。对于每个新文件: 1. **哈希检查** —— 对照 MalwareBazaar 数据库进行 SHA256 检查(约 150 万个已知恶意软件哈希,在构建时内置)。已知恶意软件会立即触发 CRITICAL 警报。 2. **分类** —— MIME 类型检查。跳过媒体文件。脚本、可执行文件、PDF、办公文档和存档将被排队。 3. **AI 分诊** —— Claude 根据元数据、结构和内容指标将每个排队的文件评估为 CLEAN、SUSPICIOUS 或 MALICIOUS。 ### Patrol 以可配置的时间表运行 41 个 sread 模块,对比运行之间的输出差异,并调用 Claude 审查有意义的变更。 每个模块以自己的间隔运行(例如,`netthreats` 每 2 分钟,`pkgverify` 每小时)。当积累非空差异时 —— 尤其是来自高优先级模块的差异 —— 会调用 Claude 评估变更内容。 默认 patrol 时间表(高优先级模块): | 模块 | 间隔 | 检查内容 | |--------|----------|---------------| | `netthreats` | 120s | 非标准端口连接、信标行为、可疑进程连接、反向 DNS | | `tmpexec` | 120s | 从 /tmp 运行的进程、分阶段 payload、隐藏文件、临时目录中的解释器脚本 | | `ports` | 300s | 开放端口、监听服务 | | `spyproc` | 300s | 键盘记录器、RAT、已删除的二进制文件、memfd 执行、进程欺骗 | | `netconn` | 300s | 具有进程归因的已建立连接、异常远程端口 | | `proctree` | 300s | 孤立 daemon、供应链进程链、setsid 分离 | | `kmod` | 600s | 可疑内核模块 | | `preload` | 600s | LD_PRELOAD 劫持、shell hooks | | `cron` | 600s | 可疑 cron 任务 | 模块时间表可通过 `state/patrol/schedule.conf` 配置。 ### C2(关联) 监控 `state/findings/` 中来自 watch 和 patrol 的新报告。当发现积累超过防抖间隔(默认 5 分钟)时,生成 Claude 进行: 1. **跨服务关联** —— 可疑下载 + 新的监听端口 + 来自 /tmp 的进程共同表明供应链攻击已执行 2. **评估复合威胁** —— 分阶段、持久化、权限提升、横向移动、数据渗出模式 3. **发布指令** —— 增加特定模块的扫描频率,扩展监控目录 4. **创建问题** —— 写入 `~/.local/share/secy/issues/` 的自包含报告,供用户查看 C2 调整 watch 和 patrol 监控的内容,但从不采取修复行动。secy 严格仅限观察。 ### 一次性模式 | 模式 | 作用 | 迭代次数 | |------|-------------|-----------| | `baseline` | 捕获当前系统状态作为“正常”参考 | 1 | | `audit` | 全面安全扫描 —— 读取系统文件,生成发现报告 | 最多 3 次 | | `monitor` | 将当前状态与基线比较,标记偏差 | 最多 2 次 | ## 桌面通知 secy 包含一个具有三重监视器的主机端通知系统: ``` secy patrol (Docker) | secyhealth module (every 30min): | notify service installed? | cron entry present? v notify service <-------- cron healthcheck (hourly) | | | inotifywait on | checks: | issues/ dir | notify service alive? | -> desktop alerts | patrol container alive? | | watch container alive? | | c2 container alive? v v [you see it] [you see it] ``` 任何单个故障都会被至少一个其他组件捕获。设置由 `./setup.sh install` 处理。如需独立管理: ``` ./scripts/setup-notify.sh # Install service + cron ./scripts/setup-notify.sh --uninstall # Remove systemctl --user status secy-notify # Check status ``` ### 严重程度级别和通知紧急性 | 严重程度 | 图标 | 通知 | 含义 | |----------|------|-------------|---------| | **critical** | 红色 | 持续 | 可能是需要立即关注的活跃威胁 | | **warning** | 黄色 | 普通 | 值得调查的可疑活动 | | **info** | 蓝色 | 低 | 用户应该注意的显著变化 | ## 问题 问题是 secy 与用户沟通的方式。`~/.local/share/secy/issues/` 是主机上可见的唯一 secy 输出。 当 C2 识别出值得用户关注的内容时,它会创建一个 markdown 文件: ``` ~/.local/share/secy/issues/ 0001-suspicious-binary-downloaded.md 0002-axios-supply-chain-rat-credentials-at-risk.md 0003-new-listening-port-4444.md ``` 每个问题都是自包含的 —— 它包括所有证据、时间戳、检测细节和建议的调查步骤。 **生命周期**:问题文件存在 = 开放状态。用户在解决后将其删除。如果同一问题伴随新证据再次发生,C2 会创建一个新问题。 ### 问题格式 每个问题包括: - **检测到的内容** —— 带有特定文件、端口、进程、时间戳的通俗语言描述 - **如何检测到的** —— 哪个服务标记了它、哪个扫描发现了异常 - **证据** —— 内联数据:哈希、diff 片段、端口号、进程名。用户可以运行以验证的命令 - **为什么这很重要** —— 安全影响、攻击阶段、置信度水平 - **建议行动** —— 需要调查什么、需要寻找什么 ## 指令 C2 通过写入指令文件来调整监控。Watch 和 patrol 每 60 秒轮询一次变更。 | 指令 | 目标 | 目的 | |-----------|--------|---------| | `state/directives/schedule-override.conf` | Patrol | 增加特定模块的扫描频率 | | `state/directives/watch-config.conf` | Watch | 扩展监控范围(额外目录、扫描深度) | | `state/directives/active/*.directive` | Patrol | 一次性覆盖(处理后移至 `applied/`) | | `state/directives/active/*.watch-directive` | Watch | 一次性覆盖(处理后移至 `applied/`) | 指令仅调整 secy 监控的内容 —— 它们从不采取更改主机系统的行动。 ## 检查内容 ### sread 模块(41 个模块) | 模块 | 检查内容 | |--------|---------------| | `netthreats` | 到非标准端口的外部连接、跨运行的信标检测、来自 /tmp 或隐藏路径的可疑进程连接、带有网络的分离解释器、反向 DNS | | `tmpexec` | 从 /tmp、/dev/shm、/var/tmp 执行的进程;运行临时脚本的解释器;分阶段可执行文件;最近创建的脚本;隐藏的点前缀文件 | | `proctree` | 孤立用户进程(PPID=1)、可疑父子链(npm->sh->python)、无终端的会话领导者(setsid/double-fork) | | `mountsec` | /tmp、/dev/shm、/var/tmp 上的 noexec/nosuid/nodev;/home 挂载选项;修复命令 | | `secyhealth` | secy-notify 服务已安装并启用、cron healthcheck 存在、issues 目录可访问 | | `netconn` | 具有进程归因的已建立 TCP 连接、0.0.0.0 上的监听器、到异常远程端口的连接 | | `ports` | TCP/UDP 监听器 | | `spyproc` | 键盘记录器、屏幕记录器、RAT、已删除的二进制文件、memfd 执行、进程名欺骗、ptrace 附加、线程注入、/dev/input 读取器、PID namespace 异常 | | `dnstun` | DNS 隧道工具、恶意 DNS 监听器、可疑 resolv.conf | | `firewall` | ufw/nftables/iptables 规则、默认策略、覆盖评估 | | `kmod` | 可疑内核模块、未签名/out-of-tree、受污染内核 | | `preload` | LD_PRELOAD 劫持、/etc/ld.so.preload、shell profile hooks、PAM 模块、ld cache | | `autostart` | XDG autostart、systemd 用户服务、rc.local、非包 init.d 脚本 | | `userpersist` | Shell rc 后门、SSH authorized_keys 异常、systemd 用户定时器、XDG autostart | | `cron` | 可疑 cron 任务、可写脚本、远程执行模式 | | `users` | UID 0 账户、具有登录 shell 的服务账户、sudo 配置 | | `services` | Systemd 服务、不安全配置 | | `sysctl` | 内核参数:ASLR、IP 转发、ptrace scope | | `credexpose` | 全局可读位置的凭据文件 | | `credperms` | 敏感凭据存储的文件权限 | | `privesc` | 权限提升向量 | | `setuid` | 标准位置之外的 SUID/SGID 二进制文件 | | `world` | 全局可写文件、/dev/shm artifacts | | `mounts` | Bind mount 遮蔽、重叠挂载 | | `tamper` | 倒填日期的二进制文件、包完整性 | | `pkgverify` | 包文件哈希验证 | | `packages` | 已安装的包 | | `logs` | 认证日志、暴力破解检测 | | `desktop` | 远程桌面、浏览器扩展 | | `display` | 显示服务器访问、屏幕共享 | | `surveil` | 监控指标 | | `` | 容器逃逸向量 | | `ebpf` | eBPF 程序、安全相关 tracepoint | | `firmware` | EFI/UEFI Secure Boot、启动项 | | `xattr` | 二进制文件上的可疑扩展属性 | | `files` | 文件内容读取(仅文本,经 MIME 检查) | | `fileinfo` | 文件元数据和风险指标 | | `hash` | SHA256/MD5 哈希 | | `hashlookup` | 对照恶意软件数据库进行哈希查找 | | `perms` | 文件权限分析 | | `full` | 运行所有模块 | ## 安全模型 每个容器运行三个嵌套隔离层: ``` +------------------------------------------------------+ | Docker Container | | - /host:ro (read-only host mount) | | - read_only: true (immutable container filesystem) | | - no-new-privileges, cap_drop: ALL | | - tmpfs: /tmp, /root (only writable dirs) | | | | +------------------------------------------------+ | | | srt (Anthropic sandbox-runtime) | | | | - Network: api.anthropic.com only | | | | - Filesystem: deny /etc/shadow, SSH keys, | | | | credential stores | | | | | | | | +------------------------------------------+ | | | | | Claude Code + sread | | | | | | - sread: path blocklist, output | | | | | | redaction, MIME whitelist | | | | | | - Reads /host/proc, /host/etc, /host/var| | | | | | - Writes to state/ + issues/ | | | | | +------------------------------------------+ | | | +------------------------------------------------+ | +------------------------------------------------------+ ``` | 层 | 机制 | 防止 | |-------|-----------|----------| | **Docker** | 只读主机挂载、不可变容器文件系统、`no-new-privileges`、除 `DAC_READ_SEARCH`/`SYS_ADMIN`/`NET_ADMIN` 外丢弃所有 capabilities、仅 tmpfs 可写目录 | 主机修改、权限提升、主机上执行命令、篡改 agent 代码 | | **srt** | Anthropic sandbox-runtime —— 网络白名单(仅 `api.anthropic.com`)、文件系统拒绝凭据/密钥 | 数据渗出、OS 级别的凭据盗窃 | | **sread** | 路径黑名单、输出修订、MIME 类型白名单、参数验证 | 凭据文件读取、输出中密码泄露、二进制文件读取 | ### 未防御的内容 - 审计输出和问题揭示系统架构(用户、端口、服务、配置)。将 `~/.local/share/secy/issues/` 视为敏感信息。 - 来自主机文件的 Prompt 注入(恶意日志条目、投毒配置)可能会影响 agent 推理。三层机制约束了 agent 可以采取的响应行动。 - 审计数据发送到 Claude API。这是使用云 LLM 所固有的。 - secy 仅限观察 —— 它不修复威胁。受损主机理论上可以通过 `/host:ro` 提供误导性数据。 ## 数据 所有 secy 数据位于 `~/.local/share/secy/`(可通过 `SECY_DATA_DIR` 环境变量配置): ``` ~/.local/share/secy/ +-- issues/ # User-visible output, desktop notifications watch this +-- state/ +-- findings/ # Reports from watch, patrol, and C2 +-- directives/ | +-- schedule-override.conf # Persistent patrol overrides | +-- watch-config.conf # Persistent watch overrides | +-- active/ # One-shot directives (pending) | +-- applied/ # Processed directives + .report files +-- patrol/ | +-- runs//latest # Latest module output | +-- diffs/ # Diffs between runs | +-- schedule.conf # Module schedule +-- watch/ | +-- seen.db # Processed file database | +-- queue/ # Files pending triage +-- c2/ | +-- processed.db # Findings already correlated | +-- progress.md # Investigation continuity notes +-- baseline/ # Baseline snapshots ``` ## 测试 测试在 Docker 内部使用预填充了模拟威胁 artifacts 的威胁实验室容器运行: ``` docker compose --profile test run --rm secy-test ``` 测试容器与威胁实验室共享 PID 和网络 namespace,以扫描其进程和监听器。34 个测试覆盖 autostart、preload、spyproc、setuid、world、tamper、desktop、pkgverify、netconn、tmpexec、proctree、mountsec 和 netthreats 模块。 ## 配置 ### Agent 设置(`agent/conf/agent.conf`) ``` # AI 模型(按服务) CLAUDE_MODEL="opus" # Used by watch + patrol (raw judgment calls) CLAUDE_MODEL_C2="haiku" # Used by C2 (structured correlation) # One-shot 模式 AUDIT_MAX_ITERATIONS=3 MONITOR_MAX_ITERATIONS=2 BASELINE_MAX_ITERATIONS=1 MAX_BUDGET_USD="1.00" # Per-iteration cap (API key auth only) # Watch WATCH_POLL_INTERVAL=5 WATCH_BATCH_SIZE=10 WATCH_MAX_FILE_SIZE=52428800 # 50MB # Patrol PATROL_TICK_INTERVAL=10 PATROL_REVIEW_INTERVAL=1800 # 30 min PATROL_REVIEW_BUDGET_USD="0.50" # C2 C2_DEBOUNCE_INTERVAL=300 # 5 min C2_REVIEW_BUDGET_USD="0.75" C2_MAX_FINDINGS_PER_REVIEW=20 C2_CONTEXT_WINDOW=10 ``` 预算设置(`MAX_BUDGET_USD`、`*_REVIEW_BUDGET_USD`)是由 Claude Code CLI 通过 `--max-budget-usd` 强制执行的每次调用上限。这些仅适用于 API key 认证(按次付费)。在 Pro/Max OAuth 订阅中,约束是订阅速率限制,而不是金额。 ### 数据目录 默认:`~/.local/share/secy`。通过环境变量覆盖: ``` export SECY_DATA_DIR=/path/to/custom/location ./setup.sh install ``` ## 状态 原型。未经生产使用审计。修订模式和黑名单并不详尽。 ## 文档 - [docs/THREATS.md](docs/THREATS.md) — 威胁检测索引 - [docs/THREATS-DEPTH.md](docs/THREATS-DEPTH.md) — 详细威胁解释和修复 - [docs/plans/sandboxing.md](docs/plans/sandboxing.md) — 安全架构和沙箱层 - [docs/plans/sread.md](docs/plans/sread.md) — sread 架构和模块清单 - [docs/plans/watch-mode.md](docs/plans/watch-mode.md) — Watch 模式设计 - [docs/plans/patrol-mode.md](docs/plans/patrol-mode.md) — Patrol 模式设计 - [docs/plans/c2-inotify.md](docs/plans/c2-inotify.md) — C2 + inotify 实现计划 - [docs/plans/threatlab.md](docs/plans/threatlab.md) — 威胁实验室测试容器设计
标签:AI, Debian, Docker, EDR, GNOME, HTTP工具, NIDS, SQL, 人工智能, 供应链攻击, 威胁情报, 安全防御评估, 容器化, 应用安全, 开发者工具, 开源, 异常检测, 搜索语句(dork), 文件系统监控, 文档安全, 无线安全, 沙箱, 版权保护, 用户模式Hook绕过, 端点检测与响应, 系统审计, 网络调试, 脆弱性评估, 脱壳工具, 自动化, 自动化代码审查, 自定义DNS解析器, 请求拦截, 逆向工具