EclipseFdn/yara-rest

GitHub: EclipseFdn/yara-rest

基于 YARA-X 的轻量级文件扫描 HTTP 微服务,提供标准化 REST API 用于恶意特征检测与文件分析。

Stars: 0 | Forks: 0

# YARA REST [![GitHub go.mod Go 版本](https://img.shields.io/github/go-mod/go-version/EclipseFdn/yara-rest)](go.mod) [![许可证](https://img.shields.io/badge/License-EPL2.0-blue.svg)](LICENSE.md) [![Docker](https://img.shields.io/badge/Docker-Ready-2496ED?style=flat&logo=docker)](Dockerfile) 一个使用 [YARA-X](https://virustotal.github.io/yara-x/) 规则扫描文件的内部 HTTP 服务。设计用于在反向代理之后或私有网络内使用。 ## 功能 - **简单的 REST API** — 通过 multipart 表单上传文件,获取 JSON 结果 - **归档支持** — 自动解压并扫描 ZIP 归档文件 - **Zip 炸弹防护** — 可配置的文件数量、大小和解压限制 - **安全加固** — 非 root 用户、HTTP 超时、日志脱敏,兼容 OpenShift - **完全可配置** — 所有限制和超时均可通过环境变量设置 - **健康检查** — 内置用于存活/就绪探针的端点 ## 快速开始 ``` # 使用 Docker 构建并运行 docker build -t yara-rest . docker run -d -p 9001:9001 -v /path/to/rules:/rules:ro yara-rest # 测试它 curl http://localhost:9001/health curl -X POST -F "file=@archive.zip" http://localhost:9001/scan ``` ## API ### `POST /scan` 上传文件进行 YARA-X 扫描。接受单个文件或 ZIP 归档文件。 ``` # 扫描单个文件 curl -X POST -F "file=@suspicious.js" http://localhost:9001/scan # 扫描 ZIP 归档文件(解压并扫描所有内容) curl -X POST -F "file=@package.zip" http://localhost:9001/scan ``` **响应:** ``` { "matches": [ { "rule": "EICAR_Test_Signature", "file": "eicar.txt", "file_hash": "275a021bbfb6489e54d471899f7db9d1663fc695ec2fe2a2c4538aabf651fd0f", "severity": "LOW", "description": "Detects the EICAR antivirus test file" } ], "scanned_files": 1, "scan_time_ms": 45 } ``` ### `GET /health` 健康检查端点。就绪时返回 `200 OK`。 ``` {"status": "ok", "rules_path": "/rules"} ``` ## 配置 所有设置均可通过环境变量进行配置: ### 服务器设置 | 变量 | 默认值 | 描述 | |----------|---------|-------------| | `PORT` | `9001` | HTTP 服务器端口 | | `YARA_RULES_PATH` | `/rules` | 包含 `.yar` 文件的目录 | | `LOG_LEVEL` | `info` | 日志级别(`info` 或 `debug`) | ### HTTP 超时 防止 slowloris 攻击和慢速客户端造成的资源耗尽。 | 变量 | 默认值 | 描述 | |----------|---------|-------------| | `HTTP_READ_TIMEOUT_SECONDS` | `60` | 读取完整请求的最大时间 | | `HTTP_WRITE_TIMEOUT_SECONDS` | `300` | 写入响应的最大时间 | | `HTTP_IDLE_TIMEOUT_SECONDS` | `120` | keep-alive 连接的最大空闲时间 | ### 大小限制 | 变量 | 默认值 | 描述 | |----------|---------|-------------| | `MAX_UPLOAD_SIZE_MB` | `512` | 最大上传大小(multipart 表单) | | `MAX_EXTRACTED_SIZE_MB` | `1024` | 最大总解压大小 | | `MAX_FILE_COUNT` | `100000` | 归档文件中的最大文件数量 | | `MAX_SINGLE_FILE_MB` | `256` | 单个文件的最大大小 | ### 扫描设置 | 变量 | 默认值 | 描述 | |----------|---------|-------------| | `SCAN_TIMEOUT_MINUTES` | `5` | YARA-X 扫描的最大时间 | | `MAX_RECURSION` | `0` | 最大目录递归深度(0 = 无限制) | ## YARA-X 规则 将 `.yar` 或 `.yara` 文件放置在规则目录中。子目录将被递归扫描。 规则可以包含用于严重性和描述的元数据: ``` rule Example_Rule { meta: description = "Describes what this rule detects" severity = "high" strings: $suspicious = "malicious_pattern" condition: $suspicious } ``` ## 开发 提供了一个 Makefile 用于执行常见任务: ``` make build # Build the binary make test # Run unit tests make test-verbose # Run tests with verbose output make test-cover # Run tests with coverage report make fmt # Format code make vet # Run go vet make clean # Remove build artifacts ``` ### 从源代码构建 需要 Go 1.23+。YARA-X 仅在运行时(容器中)需要。 ``` make build YARA_RULES_PATH=./test ./yara-rest ``` ### Docker / Podman ``` make docker-build # Build image make docker-run # Run container make docker-test # Build, run, and test # 或使用 Podman make podman-build make podman-run ``` 手动命令: ``` docker build -t yara-rest . docker run -d -p 9001:9001 -v ./rules:/rules:ro yara-rest ``` ## 部署 ### OpenShift 兼容性 该容器遵循 **GID 0 模式** 以兼容 OpenShift: - 文件归 `1001:0`(UID 1001,GID 0)所有 - 权限允许组写入(`ug+rwx`) - 适用于 OpenShift 分配的随机 UID(始终为 GID 0) ### 文件系统要求 | 路径 | 访问权限 | 用途 | |------|--------|---------| | `/tmp/scans` | 读写 | 扫描工作区 | | `/rules` | 只读 | YARA-X 规则 | | `/app` | 只读 | 应用程序二进制文件 | 当 `/tmp/scans` 作为可写卷挂载时,支持**只读根文件系统**。 ### 调整 `/tmp/scans` 大小 每次并发扫描都需要临时空间来存放上传的文件和解压后的内容: ``` tmp_size = (MAX_UPLOAD_SIZE_MB + MAX_EXTRACTED_SIZE_MB) × concurrent_scans ``` | 并发扫描数 | 卷大小 | |------------------|-------------| | 1 | 1.5 GB | | 5 | 7 GB | | 20 | 30 GB | 使用 **tmpfs**(基于内存)以提高性能,或者在 RAM 有限的高并发场景下使用**磁盘**。 ### 资源限制 推荐的 Kubernetes/OpenShift 资源配置: ``` resources: limits: cpu: "2" memory: "2Gi" requests: cpu: "500m" memory: "512Mi" securityContext: allowPrivilegeEscalation: false readOnlyRootFilesystem: true runAsNonRoot: true capabilities: drop: - ALL ``` 对于只读根文件系统,请挂载一个可写卷用于扫描: ``` volumeMounts: - name: scans mountPath: /tmp/scans volumes: - name: scans emptyDir: {} ``` ### 资源指南 | 流量 | 内存 | CPU | |---------|--------|-----| | 低 | 512Mi | 0.5 | | 高(20 个并发) | 2Gi+ | 2+ | ## 测试 ### 单元测试 在本地运行测试套件(无需 YARA-X): ``` make test # Run all tests make test-cover # Generate coverage report ``` 单元测试涵盖配置、HTTP 处理程序、ZIP 解压和输出解析。需要 YARA-X 的集成测试在本地运行时会自动跳过。 ### 集成测试 在容器中运行完整的集成测试: ``` make docker-test ``` ### 手动测试 包含一个测试规则,可检测 [EICAR 测试签名](https://www.eicar.org/): ``` docker run -d --name yara-test -p 9001:9001 -v $(pwd)/test:/rules:ro yara-rest curl http://localhost:9001/health curl -X POST -F "file=@test.zip" http://localhost:9001/scan docker rm -f yara-test ``` ## 贡献 欢迎贡献!请随时提交 Pull Request。 ## 许可证 本项目基于 EPL 2.0 许可证授权 — 详见 [LICENSE.md](LICENSE.md)。
标签:DAST, Docker容器化, EICAR测试, EVTX分析, Go语言, Go语言工具, HTTP服务, REST API, URL发现, Web截图, YARA, YARA-X, ZIP解压, 云资产可视化, 云资产清单, 威胁情报, 子域名暴力破解, 安全检测, 容器安全, 开发者工具, 恶意软件分析, 文件哈希, 文件扫描, 日志审计, 沙箱, 程序破解, 网络安全, 网络测绘, 网页爬虫, 自动化检测, 规则匹配, 请求拦截, 逆向分析, 逆向工程, 防Zip Bomb, 隐私保护