shawheen1904/THOR-Orchestrator

GitHub: shawheen1904/THOR-Orchestrator

一个无代理的并行编排脚本,通过 SSHFS 只读挂载远程主机并批量运行 THOR 安全扫描器,解决大规模事件响应场景下的远程取证扫描部署问题。

Stars: 0 | Forks: 0

# THOR Orchestrator [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](https://github.com/shawheen1904/THOR-Orchestrator/actions/workflows/ci.yml) [![License: Apache 2.0](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](LICENSE) `THOROrchestrator.sh` (THOR Orchestrator) 是一个生产级、并行、无代理的辅助工具,它通过 **SSHFS** 以只读方式挂载远程主机并在其上运行 THOR。这**不是** THOR 扫描器本身;它是一个用于大规模部署的编排脚本。它被设计为可以直接在响应者环境中下载并运行,无需修改其源码,通过本地 `thor-orchestrator.conf`、`/etc/thor/thor-orchestrator.conf` 或环境变量进行配置。 **适用于任何 SSH 主机 —— 不局限于 NetScaler。** 扫描逻辑中没有任何特定于 NetScaler 的内容;该工具适用于任何满足以下条件的主机: 接受基于密钥的 SSH 认证,并且 暴露 SSHFS 所依赖的 **SFTP 子系统**。它已经在 Citrix NetScaler 设备上(一个经过刻意设计的、高难度的受限 shell 场景)完成了测试,因此标准的 Linux/Unix SSH 目标通常都能“直接运行”。SSH 用户只需要对你想要扫描的路径具有读取权限即可。 ## 环境要求 - 本地已安装 THOR(默认路径为 `/thor`),包含 `thor-util` 以及 `thor-linux-64`(付费版)或 `thor-lite-linux-64`( Lite 版)可执行文件。 - 执行扫描的主机上需要可用 `sshfs`、`timeout`、`findmnt`、`sed`、`flock`、`wc`、`jobs` 和 `fusermount`/`fusermount3`。除非你使用 `--no-preflight` 参数,否则还需要 `sftp`。 - 专用于扫描的 SSH 密钥,以及固定在 known hosts 文件中的主机密钥。 - **在每个目标主机上:** 需要运行暴露了 SFTP 子系统的 SSH 服务器(OpenSSH 中的默认配置为:`Subsystem sftp ...`)。如果目标主机上禁用了 SFTP,SSHFS 将无法挂载。 ## 快速入门 1. 创建一个主机列表(每行一个主机): cat > remote_hosts.txt <<'HOSTS' netscaler-1.example.com netscaler-2.example.com HOSTS 2. 将你的 SSH 密钥和 known_hosts 文件放在 `THOROrchestrator.sh` 旁边,或者通过配置文件/环境变量指向它们。 3. 首先通过 dry run(预演,不执行挂载和扫描)验证你的设置: ./THOROrchestrator.sh --dry-run 4. 以非 root 的专用用户身份运行脚本(推荐): ./THOROrchestrator.sh 在运行结束时,你会获得每个主机的摘要,例如: ``` ==== SUMMARY ==== host-a.example.com OK host-b.example.com SKIPPED_PREFLIGHT Total: 2 OK: 1 Failed: 1 ``` ## 命令行选项 ``` -n, --dry-run Validate config and print the scan plan; do not mount/scan. --no-preflight Skip the SFTP reachability probe before mounting. --no-update Skip THOR update/upgrade (implies THOR_DO_UPDATE=0). --hosts FILE Path to the hosts file (one host per line). --parallel N Max concurrent host scans. -V, --version Print version and exit. -h, --help Show help and exit. ``` 任何设置的优先级顺序依次为:内置默认值 → 环境变量 → 配置 文件 → **CLI 参数(最高优先级)**。 ## 配置 脚本会按以下顺序加载第一个匹配到的配置文件: 1. `./thor-orchestrator.conf` 2. `/etc/thor/thor-orchestrator.conf` 3. `./thorscan.conf`(旧版) 4. `/etc/thor/thorscan.conf`(旧版) 你也可以通过环境变量覆盖任何设置。 压缩包中包含了一个示例配置文件 `thorscan.conf.example`。 ### `thor-orchestrator.conf` 示例 ``` # 路径 LOCAL_MOUNT_BASE=/mnt/Thor HOSTS_FILE=/path/to/remote_hosts.txt KNOWN_HOSTS=/path/to/known_hosts SSH_KEY=/path/to/thor_scan_ed25519 SSH_USER=nsroot SSH_PORT=22 # THOR THOR_DIR=/thor THOR_UTIL=/thor/thor-util THOR_BIN=/thor/thor-linux-64 # 或者对于 THOR Lite: # THOR_BIN=/thor/thor-lite-linux-64 THOR_ACTION=FileScan # THOR scan module/action to run # THOR_SCAN_OPTS=( --nohtml --nolog --nocsv --maxsysloglength 0 ) # 覆盖输出选项 (bash array) SIEM_TARGET=siem.example.com:514:SYSLOGJSON:UDP THOR_DO_UPDATE=1 # 可达性与弹性 PREFLIGHT=1 # SFTP probe before mounting (0 to disable) MOUNT_RETRIES=1 # extra mount attempts on transient failure MOUNT_RETRY_DELAY=3 # seconds between mount attempts # 日志记录 / 并行性 LOG_DIR=/var/log/thor LOG_FILE=/var/log/thor/thor_agentless_scan.log MAX_PARALLEL=5 ``` ### 常用覆盖设置(环境变量) ``` THOR_DO_UPDATE=0 MAX_PARALLEL=10 ./THOROrchestrator.sh ``` ## 注意事项 - 脚本强制执行严格的主机密钥检查;请确保 `KNOWN_HOSTS` 包含目标主机的固定密钥。 - SSH 密钥权限必须为 `600` 或 `400`。 - 使用专用的非 root 扫描用户以减少影响范围。 - **防篡改路径:** 配置文件、SSH 密钥、`known_hosts`、主机列表文件、挂载根目录和日志目录必须由你本人(或 root)拥有,并且**不能**具有组/其他用户的写入权限。否则脚本将拒绝运行,从而防止使用共享或全局可写的目录来注入配置(导致代码执行)或替换 `known_hosts`(绕过主机密钥固定)。可以使用 `chmod go-w` / `chown` 进行修复。 ## 故障排除 - **主机密钥错误:** 确保 `KNOWN_HOSTS` 包含目标主机的正确固定密钥。 - **SSH 密钥权限:** `SSH_KEY` 必须为 `600` 或 `400`。 - **缺少二进制文件:** 确认已安装 `sshfs`、`timeout` 和 `findmnt` 并且在 `PATH` 中。 - **找不到 THOR:** 显式设置 `THOR_BIN` 或确保 `THOR_DIR` 包含 `thor-linux-64` 或 `thor-lite-linux-64`。 - **摘要中出现 `SKIPPED_PREFLIGHT`:** 对该主机的 SFTP 探测失败 —— 请检查基于密钥的认证、`KNOWN_HOSTS` 中固定的主机密钥,以及目标主机的 `sshd` 是否暴露了 SFTP 子系统。使用 `--dry-run` 验证配置,或使用 `--no-preflight` 跳过探测。 ## 日志轮转 如果你经常运行此脚本,建议使用 `logrotate` 或系统的日志管理工具来轮转 `${LOG_FILE}`,防止日志无限增长。 ## 安全与授权 仅扫描你获得授权评估的系统。确保你拥有相应的事件响应授权,并遵守所有适用的政策和法律。 ## 开发与测试 该脚本的结构允许**在无副作用的情况下被 source 引入** —— 其 `main()` 入口点仅在直接执行时才会运行 —— 这使得它的辅助 函数能够进行单元测试。 ``` shellcheck THOROrchestrator.sh # static analysis bash -n THOROrchestrator.sh # syntax check bats tests/ # unit tests (bats-core) ``` 这三项测试在每次 push 和 pull request 时都会在 [CI](.github/workflows/ci.yml) 中运行。 详情请参阅 [CONTRIBUTING.md](CONTRIBUTING.md)。 ## 许可证 基于 [Apache License 2.0](LICENSE) 授权。有关第三方归属说明,请参阅 [NOTICE](NOTICE)。
标签:HTTP工具, PB级数据处理, PE 加载器, Shell脚本, 内存分配, 安全运维, 库, 应急响应, 应用安全, 无代理架构, 远程取证