anhnmt/sentra

GitHub: anhnmt/sentra

基于 Go 和双 YARA 引擎的高性能单文件威胁扫描器,采用分离 I/O 与分析双池架构,专为应急响应和威胁狩猎场景的文件系统快速分类而设计。

Stars: 2 | Forks: 0

# Sentra [![Go Version](https://img.shields.io/badge/go-1.24+-00ADD8?style=flat&logo=go)](https://go.dev) [![License](https://img.shields.io/badge/license-MIT-blue?style=flat)](LICENSE) [![Platform](https://img.shields.io/badge/platform-linux%20%7C%20macOS%20%7C%20windows-lightgrey?style=flat)]() Sentra 是一个快速、单二进制文件的威胁扫描器,专为文件系统快速分类(triage)而构建。它并行运行多个检测引擎,使用分离的 I/O 和分析工作池来最大化吞吐量,并内置自动更新签名的功能。设计上支持扩展 —— 新的检测器可以与现有的检测器并存,无需更改核心流水线。 ## 功能特性 - **多检测器流水线** — 检测器按文件并行运行;结果在引擎间聚合与去重 - **YARA 检测** — 双后端([yara-x](https://github.com/VirusTotal/yara-x) + [yara](https://github.com/VirusTotal/yara)),若其中一个后端失败可优雅降级 - **高性能架构** — 分离的 I/O 池和分析池(上限为 `NumCPU`),对大文件使用 mmap,对小文件进行批处理,以及 magic-byte(魔数)预过滤 - **自动签名更新** — 获取最新的 [YARA Forge Core](https://github.com/YARAHQ/yara-forge) 规则,并通过版本缓存避免重复下载 - **智能过滤** — 可配置的文件大小范围、跳过目录、最大遍历深度、针对无关二进制格式的 magic-byte(魔数)过滤 - **优雅关闭** — CTRL+C 立即停止新任务,并在退出前安全地处理完进行中的分析 - **结构化日志** — zerolog 输出包含扫描统计:已扫描文件数、跳过数、匹配数、错误数、耗时 ## 安装 ### 从源码安装 ``` git clone https://github.com/anhnmt/sentra cd sentra go build -o sentra ./cmd/sentra ``` ### 更新签名 ``` ./sentra --update-signatures ``` ## 使用方法 ``` # 扫描目录 ./sentra --target /path/to/scan # 使用自定义 rules 目录扫描 ./sentra --target /home --rules-dir /opt/rules # 限制扫描深度并跳过 build 目录 ./sentra --target /srv --max-depth 5 --skip-dir build --skip-dir dist # 调整文件大小范围(bytes) ./sentra --target /tmp --min-file-size 1024 --max-file-size 10485760 # 更新 signatures 后扫描 ./sentra --update-signatures && ./sentra --target /var/www ``` ## 选项 ### 扫描选项 | 标志 | 默认值 | 描述 | |------|---------|-------------| | `--target` | *(必需)* | 要扫描的文件或目录 | | `--rules-dir` | `signatures/yara` | YARA 规则目录 | | `--workers` | `NumCPU × 2` | I/O worker goroutine 的数量 | | `--skip-dir` | — | 要跳过的目录名,可重复使用 (`--skip-dir .git --skip-dir build`) | | `--max-depth` | `0` *(无限制)* | 目录遍历的最大深度 | | `--min-file-size` | `4096` (4 KB) | 要扫描的最小文件大小(字节) | | `--max-file-size` | `31457280` (30 MB) | 要扫描的最大文件大小(字节) | ### 工具 | 标志 | 默认值 | 描述 | |------|---------|-------------| | `--update-signatures` | `false` | 获取最新的 YARA Forge Core 规则 | ## 架构 ``` Walk (fastwalk) └── eligibility filter (size, dir, magic bytes) └── ioPool (Workers = NumCPU×2) ├── readFile: stat → ReadAll (<512KB) or mmap (≥512KB) ├── magic-byte check └── analysisPool (Workers = NumCPU) ├── detector A ──┐ ├── detector B ──┤ └── detector N ──┴── dedup → result channel → consumer → log ``` **双池设计:** I/O 受磁盘限制,受益于大量的 goroutine。分析(尤其是 CGo/原生引擎)受 CPU 限制 —— 将其上限设为 `NumCPU` 可防止线程抖动并提高缓存局部性。 **mmap 阈值 (512 KB):** 小文件使用 `io.ReadAll` 以避免 mmap 开销。大文件使用 mmap 以跳过堆分配,让操作系统页缓存发挥作用。 **批处理:** mmap 阈值以下的文件在提交到分析池之前会被分组成 16 个一批,从而减少小文件密集型目录下的 goroutine 生成开销。 **检测器接口:** 每个检测器实现一个通用接口 —— 新的检测引擎可以插入同一流水线,而无需涉及遍历器或工作器逻辑。 ## 检测器 | 检测器 | 状态 | 描述 | |----------|--------|-------------| | YARA (yara-x) | ✅ 启用 | 基于 Rust 的 YARA 引擎,高性能 | | YARA (yarac) | ✅ 启用 | 基于 C 的 YARA 引擎,广泛的规则兼容性 | | IOC 匹配 | 🔜 计划中 | 哈希 (MD5/SHA1/SHA256) 和文件名指标匹配 | ## 跳过的目录(内置) 除了任何 `--skip-dir` 标志外,以下目录始终被跳过: `.git` · `.svn` · `node_modules` · `vendor` · `.cache` · `.devenv` ## 签名 Sentra 使用 [YARA Forge Core](https://github.com/YARAHQ/yara-forge) —— 一个经过筛选、高准确率的规则集,聚合自公共仓库,针对低误报率进行了优化。 运行 `--update-signatures` 以获取最新版本。当前版本缓存在 `signatures/yara/.version` 中,并在下载前与 GitHub API 进行比对 —— 避免不必要的重复下载。 ## 日志输出 ``` INF scan starting target=/home workers=16 max_depth=0 min_file_size=4096 max_file_size=31457280 WRN match detected detector=yarax rule=Suspicious_PowerShell file=/home/user/malware.ps1 INF scan complete scanned=18432 skipped=3201 matches=1 errors=0 duration=12s ``` ## 环境要求 - Go 1.24+ - 启用 CGo(yara-x 和 yara 绑定需要) - Linux, macOS, 或 Windows ## 许可证 MIT
标签:Burp Suite 替代, EVTX分析, Go, HTTP工具, Ruby工具, Triage, YARA, YARA Forge, 云安全监控, 云资产可视化, 威胁扫描器, 库, 应急响应, 搜索语句(dork), 文件系统取证, 日志审计, 自动化规则更新, 静态分析