anhnmt/sentra
GitHub: anhnmt/sentra
基于 Go 和双 YARA 引擎的高性能单文件威胁扫描器,采用分离 I/O 与分析双池架构,专为应急响应和威胁狩猎场景的文件系统快速分类而设计。
Stars: 2 | Forks: 0
# Sentra
[](https://go.dev)
[](LICENSE)
[]()
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), 文件系统取证, 日志审计, 自动化规则更新, 静态分析