OWLZOPS/owlzops-mapper
GitHub: OWLZOPS/owlzops-mapper
一个无 Agent 的 Linux 服务器审计与基础设施扫描工具,以 Rust 静态二进制文件形式快速检测安全风险、配置漂移和入侵指标。
Stars: 3 | Forks: 1
# owlzops-mapper
[](https://github.com/OWLZOPS/owlzops-mapper/actions/workflows/ci.yml)
[](https://github.com/OWLZOPS/owlzops-mapper/releases)
[](LICENSE)
**owlzops-mapper** 是一个独立的 Rust 二进制文件,可在几秒钟内完成
Linux 服务器审计,并将结果导出为 Excel、JSON 或
终端格式。无需联网,数据不会离开服务器。
对于系统管理员来说,它是即时的资产盘点工具。对于 CTO 来说,它提供了技术债务的可视化。对于 CEO 来说,它助力于
风险与成本优化。
## 为什么会有这个项目?
大多数基础架构扫描器需要安装 agent、Python 运行时,或者
开放防火墙端口。但本工具不需要。它是一个静态的 Rust 二进制文件,
在本地完成所有工作后即退出。我开发它是因为我厌倦了在审计期间手动
检查服务器配置——而且我想要一个能够随时间对比快照的工具,
这样我就能确切地看到发生了什么变化以及何时变化的。
## 快速开始
**选项 1 – 直接下载:**
```
curl -L https://github.com/OWLZOPS/owlzops-mapper/releases/latest/download/owlzops-mapper-linux-x86_64.tar.gz | tar xz
sudo ./owlzops-mapper audit
```
**选项 2 – 安装脚本(验证 SHA256 + GPG):**
```
curl -sSL https://raw.githubusercontent.com/OWLZOPS/owlzops-mapper/main/install.sh | sh
sudo ./owlzops-mapper audit
```
## 核心功能
- **多主机远程审计** – 通过 SSH 并行扫描数十台服务器,支持自动部署二进制文件并具有限流控制。同时支持免密 sudo 和**基于密码的 sudo** (`‑‑ask‑sudo‑pass`) —— 无需预先配置 `NOPASSWD`。
- **快照对比与漂移监控** – 将服务器状态捕获为 JSON 快照,对比任意两个快照,并在 Excel/终端中生成彩色编码的差异报告,准确显示变更内容。
- **上下文感知的风险评分** – 结合环境因素评估审计发现(例如,Docker/kubelet 主机不会因为 `ip_forward=1` 而被扣分)。安全、可靠性和基础维护的子评分机制可防止分数饱和。
- **深度的 Docker 与容器审计** – 检测特权容器、缺少内存/CPU 限制、敏感的主机目录挂载、被 OOM 杀死的容器、重启循环以及状态异常的健康检查。以上全部提供 CIS 参考。
- **CIS Benchmark 映射** – 每一项安全发现都包含对应的 CIS Benchmark 规则参考(例如 `CIS 5.2.10`),随时可用于合规性审计。
- **无 Agent 与气隙隔离** – 单一静态二进制文件,无运行时依赖;`--offline` 模式可确保在受限环境中不发起任何外部网络请求。
- **丰富的 Excel 与终端输出** – 提供仪表板式的终端报告,以及包含执行摘要、各主机明细表和彩色对比的专业 Excel 工作簿。
### v0.5.11 (2026-07-10)
**入侵指标检测流水线**
- **SEC‑015 – 网络上的特权非 root 植入** – 标记拥有关键内核 capabilities、监听通配符地址且从临时路径(`/tmp`、`/dev/shm`、`/home`、`/var/tmp`)运行的进程。权重:60。
- **SEC‑016 – 已知的恶意进程名** – 根据编译时的黑名单(`xmrig`、`kinsing`、`kdevtmpfsi`、`sysupdate`、`networkservice`)全面扫描 `/proc`。明确的名称会被无条件标记;模糊的名称(例如 `networkservice`)需要结合临时路径证据进行判断。权重:60。
- **SEC‑017 – 无文件恶意软件检测** – 检测磁盘上的可执行文件已被删除,或从未接触过磁盘的进程(`memfd_create`)。误报保护机制排除了系统路径删除的情况(例如 `apt upgrade`)。证据会区分“从……中删除”与“在内存中执行(memfd)”。权重:60。
- **SEC‑018 – 可疑的 cron 任务** – cron 条目在收集期间被划分为 `Ok`、`Warning`、`Critical` 三个等级。关键模式(如反弹 shell、下载操作)将触发安全发现。权重:20。JSON 导出包含每个 cron 任务的严重程度。
**评分与谓词强化**
- **CAP‑001 动态权重** – 当具有特权的非 root 进程监听通配符地址时,扣分从 8 升至 20,使其严重程度与 SEC‑013 保持一致。
- **统一的网络与路径谓词** – 将 `is_wildcard_bind`、`is_loopback_bind`(现已覆盖完整的 `127.0.0.0/8` 和 `::ffff:…`)以及 `is_ephemeral_exec_path`(包含 `/memfd:`)提取到了 `utils.rs` 中;所有模块共享同一事实来源。
- **暴露升级保护** – 对比逻辑现在能正确忽略已存在通配符的双栈配置,防止出现误报的漂移警报。
- **评分版本保护** – `SCORING_VERSION` 升级至 **7**,这样集群对比功能会将因谓词覆盖范围扩大而导致的分数变化标记为 `~ Changed`,而不会误报为性能下降。
**UI 与导出改进**
- **分类风险细分** – 审计发现被分列在不同的表格中(🛡 安全、⚙ 可靠性、🧹 基础维护),便于直观地进行快速分流。
- **动态表格宽度** – 所有包含大量内容的表格(Cron、Docker、Capabilities)均采用 `ContentArrangement::Dynamic` 并配有安全的回退机制;确保边框在管道传输的 SSH 会话中不会断裂。
- **UI 中的 Cron 任务分类** – 每个 cron 条目都会根据严重程度(OK / Review / Suspicious!)进行颜色标记。
- **非 root capability 表格** – 使用结构化表格替换了纯文本列表,显示进程、PID/EUID、capabilities 以及安全标记。
/comm`。
- N8-7:文件上传的进度条替换为动态 spinner(旧版)或实时进度显示。
### v0.5.6 (2026-07-08)
*(除了替换 SCP 和改进 abort_all 外,与 0.5.7 相同)*
### v0.5.5 (2026-07-07)
### 安全性
- R7-05:对 russh 主机密钥实现 TOFU + HMAC-SHA1 验证。将新接受的密钥存储在 `~/.owlzops/known_hosts` 中。检测密钥更改(`HostKeyChanged`)。
- R7-09:在 russh 客户端配置中启用 keepalive,防止长时间扫描导致超时。
- PIVOT-1:净化终端输出,防止转义序列注入。
- PIVOT-2:通过在以 `=`、`+`、`-`、`@` 开头的字符串前添加 `'` 前缀,防止 XLSX 公式注入。
- 强化子进程环境:清除环境变量(`env_clear`),固定 `PATH`,将工具解析为绝对路径,以阻止 `LD_PRELOAD`/`PATH` 劫持。
### 稳定性
- 对 `/proc`、`/proc/*/environ` 以及子进程的 stdout/stderr 的读取设置上限,以防止在不受信任的输入上发生 OOM。截断事件将作为扫描警告进行报告。
- Docker 扫描器:将同步的 `fs::metadata` 从异步运行时中移至 `spawn_blocking`,以避免阻塞 Tokio 执行器。
## v0.5.4 亮点(生产级可靠性)
- **恢复扫描器隔离性** – 移除了 `panic = "abort"`;单个扫描器的 panic 现在会优雅降级,而不会导致整个扫描中止。
- **检测 UDP 监听器** – 修复了 `/proc/net` 解析器;UDP 端口现在会出现在 `listening_ports` 中。
- **干净的机器可读输出** – tracing 日志现在输出到 stderr;stdout 始终包含有效的 JSON。
- **流式集群漂移对比** – `compare --multi-host` 现在可以读取集群扫描生成的 JSONL 文件。
- **russh 的输入验证** – 主机、用户和远程路径在使用前均会进行验证。
- **杂项强化** – 统一超时预算,在 russh 中加入 keepalive,无 panic 的路径处理,确定性的进程归属。
## v0.5. 3 亮点(IAM、进程归属、DLP)
- **IAM 与访问权限对齐** – 审计 SSH 密钥的算法、密钥长度和策略合规性;在 sudoers 中检测 `NOPASSWD: ALL`。这两项发现均包含 CIS 参考。
- **进程归属(零配置)** – 使用直接的 `/proc/net` 解析替换了 `ss` 工具;每个监听端口现在都会显示确切的二进制路径和 PID。可疑的监听器(影子 IT)会被标记为严重级别。
- **DLP / 机密信息卫生** – 扫描进程内存(`/proc/*/environ`、`cmdline`)查找暴露的凭证(AWS 密钥、GitHub token、数据库 URL)。检测到的泄露在报告时不会保存机密信息原文。
- **集群编排** – `--max-concurrent` 控制并行度;全局单主机超时可防止任务卡住而阻塞队列;可选的 JSONL 流式输出支持大规模集群扫描且不会导致内存膨胀。
- **集群模式下的本地主机** – localhost 现在已包含在多主机的终端、XLSX 和 JSONL 报告中。
## v0.5.2 亮点(异步 SSH + Docker 审计)
- **异步 SSH 引擎 (`russh`)** – 集群扫描现在支持 `--ask-sudo-pass`,通过密码进行身份验证,无需在每个主机上预先配置 `NOPASSWD`。包含警告提示的已知主机 TOFU 验证。
- **`--copy-binary` 的进度条** – 二进制文件上传显示带有文件大小和预计到达时间的实时进度条,适用于旧版和异步 SSH 路径。
- **Docker 可靠性发现** – OOM 杀死的容器、重启循环以及状态异常的健康检查现在会被检测到,并在可靠性类别(`DOCK‑007…DOCK‑009`)下进行评分。
- **敏感挂载检测** – 挂载了 Docker socket、主机 root 或可写敏感目录的容器会被标记为高风险(`DOCK‑005`、`DOCK‑006`),并提供 CIS 参考。
- **评分版本保护** – 由公式更新引起的 `risk_score` 差异现在会被标记为 `Changed`,而不是错误的改进或退化,从而在 `compare` 中保持漂移度的准确性。
- **对比功能 v2** – 包含主机名、时间戳、二进制版本和时间跨度的元数据头;确定性的差异顺序;带有添加/移除/已对比状态的多主机摘要。
- **用户体验优化** – `--keep-binary` 标志可在远程扫描后跳过清理;当 stdout 被管道重定向时,会自动禁用表情符号和 ANSI 颜色;`--max-concurrent` 控制集群并行度;自动提升文件描述符限制。
## v0.5.1 亮点(对比功能 v2)
- **丰富的差异元数据** – 终端和 Excel 差异报告现在会显示主机名、时间戳、二进制版本以及快照之间的时间跨度。
- **评分版本保护** – 不同评分引擎版本间的 `risk_score` 变更会被标记为 `Changed`,防止误报漂移。
- **确定性的差异顺序** – 对于相同的快照生成字节完全一致的报告,可安全用于版本控制。
- **多主机摘要** – 集群差异显示摘要行和状态标签(`[+ added]`、`[− removed]`)。
- **扩展的 SSL 跟踪** – 可检测警告级别的证书过期以及新增的证书。
- **端口差异优化** – 零拷贝 O(n) 复杂度对比。
## v0.5.0 亮点
- **上下文感知评分** – 在 Docker/kubelet 主机上或 systemd-coredump 处于活动状态时,不再标记 `ip_forward` 和 `suid_dumpable`。
- **阶梯式权重** – SSH `PermitRootLogin` 对 `prohibit-password` 进行区分;安全更新分层级处理;sudo `NOPASSWD` 区分 `ALL` 与受限命令。
- **Docker 安全发现** – 缺少内存/CPU 限制、特权模式以及危险 capabilities 的容器现在会直接影响风险评分。
- **CIS Benchmark 参考** – 每一项发现都包含一个 CIS 参考(例如 `CIS 5.2.10`),便于即时进行审计合规性映射。
- **子评分** – 安全性、可靠性和基础维护现在都有各自的分数上限(60/30/10),防止分数饱和并实现漂移可视化。
- **透明细分** – 终端仪表板现在会显示确切处于激活状态的发现及其权重和 CIS 标签。
## 用法
### 本地审计
```
# Terminal dashboard (默认,完全离线)
sudo ./owlzops-mapper audit
# 导出到 Excel (以 Executive Summary 作为第一个工作表)
sudo ./owlzops-mapper audit --format excel --output report.xlsx
```

```
# 用于程序化使用的 JSON
sudo ./owlzops-mapper audit --format json > snapshot.json
# 检测外部 IP (可选的出站请求)
sudo ./owlzops-mapper audit --external-ip
# 在检查更新前刷新 package cache
sudo ./owlzops-mapper audit --refresh-packages
# Air-gapped / 受限网络 — 保证零出站调用
sudo ./owlzops-mapper audit --offline
```
### 远程审计(通过 SSH)
```
# 扫描单个远程主机 (二进制文件必须存在于 /tmp/owlzops-mapper;
# 远程用户需要对该二进制文件路径拥有免密 sudo 权限)。
sudo ./owlzops-mapper audit --host 192.168.1.10 --ssh-user operator
```

```
# 扫描多个以逗号分隔的主机
sudo ./owlzops-mapper audit --host 192.168.1.10,192.168.1.11 --ssh-user operator
# 首先自动将本地静态二进制文件复制到远程主机。
# Release 二进制文件是静态的 (musl),因此 --copy-binary 开箱即用。
sudo ./owlzops-mapper audit --host 192.168.1.10 --ssh-user operator --copy-binary
# 如果你构建了自己的二进制文件 (例如 debug build),请指向 musl 版本:
sudo ./owlzops-mapper audit --host 192.168.1.10 --ssh-user operator --copy-binary \
--local-binary target/x86_64-unknown-linux-musl/release/owlzops-mapper
# 从文件扫描多个主机 (每行一个)
sudo ./owlzops-mapper audit --hosts hosts.txt --ssh-user operator --copy-binary
# 多主机 Excel 报告,每个主机一个工作表
sudo ./owlzops-mapper audit --hosts hosts.txt --ssh-user operator --format excel --output fleet-audit.xlsx
```
### 集群扫描:一条命令扫描 20+ VPS
1. 创建一个 `hosts.txt` 文件(每行一个主机):
10.0.0.1
10.0.0.2
...
10.0.0.20
2. **身份验证 – 选择适合您环境的方法:**
**选项 A(免密,传统方式)**
在每个主机的 cloud-init / Terraform 中嵌入此行:
echo "ubuntu ALL=(ALL) NOPASSWD: /tmp/owlzops-mapper" | sudo tee /etc/sudoers.d/owlzops
然后运行集群扫描,**不带** `‑‑ask‑sudo‑pass`。
**选项 B(交互式密码,v0.5.2 新增)**
无需更改 sudoers —— 您只需要常规的 `sudo` 访问权限。
mapper 会要求输入一次密码,并通过 SSH 通道安全地转发
(`sudo -S`)。只需在下方命令中
添加 `‑‑ask‑sudo‑pass` 即可。
3. 从您的本地机器运行审计 —— 二进制文件会自行复制,
并行扫描所有 20 台服务器,并自动清理:
sudo ./owlzops-mapper audit \
--hosts hosts.txt \
--ssh-user ubuntu \
--copy-binary \
--ask-sudo-pass \
--format excel \
--output fleet-report.xlsx
在底层,`owlzops-mapper` 通过 SSH 连接到每台服务器,
将自身上传至 `/tmp/owlzops-mapper`,执行审计,收集
JSON 结果,从每台主机上删除该二进制文件,最终生成
一份包含多个工作表的 Excel 报告。无需安装 agent,除 SSH 外
无需开放其他端口。
### 快照与漂移监控
```
# 保存带时间戳的 JSON 快照 (默认目录:~/.owlzops/snapshots//)
sudo ./owlzops-mapper snapshot
# 指定自定义输出目录
sudo ./owlzops-mapper snapshot --output-dir /var/lib/owlzops
# 比较某个主机的两个最近快照
./owlzops-mapper dir-compare ~/.owlzops/snapshots/ubuntu
# 将该比较导出到 Excel
./owlzops-mapper dir-compare --format excel --output drift.xlsx ~/.owlzops/snapshots/ubuntu
```
### 对比快照

*演示:包含主机、时间戳、二进制版本和时间跨度的元数据头的前后对比。*
```
# 在终端中比较两个 JSON 快照 (彩色表格)
./owlzops-mapper compare before.json after.json
# 输出包含元数据头部:
# host: owl1.owlzops.com
# before: 2026-07-05 17:41 UTC (v0.5.0, risk 55)
# after: 2026-07-05 17:42 UTC (v0.5.0, risk 45)
# span: 1m
# 将 diff 导出为 JSON
./owlzops-mapper compare before.json after.json --format json > diff.json
# 将 diff 导出为 Excel (颜色标记:绿色=改善,红色=降级,黄色=已更改)
./owlzops-mapper compare before.json after.json --format excel --output diff.xlsx
# 多主机比较:两个文件都必须是主机报告数组 (例如,来自 fleet scan)
./owlzops-mapper compare --multi-host fleet_before.json fleet_after.json
```
## 命令行选项
| 标志 | 描述 |
|------|-------------|
| `-f, --format` | 输出格式:`text`(默认)、`json`、`xlsx`(或 `excel`) |
| `-o, --output` | Excel 报告的输出文件(默认:`owlzops-report--YYYY-MM-DD_HH-MM-SS.xlsx`) |
| `--external-ip` | 通过出站请求获取公网 IP(默认关闭) |
| `--refresh-packages` | 扫描前更新软件包缓存(默认关闭) |
| `--offline` | 禁用**所有**网络请求。若与其他标志组合使用,此项优先级最高 |
| `--host ` | 用于远程扫描的单个主机名/IP(或逗号分隔的列表) |
| `--hosts ` | 包含用于远程扫描的主机名/IP(每行一个)的文件 |
| `--ssh-user ` | 用于远程连接的 SSH 用户(默认:`root`;建议使用具备免密 sudo 权限的非 root 用户) |
| `--ssh-key ` | SSH 私钥路径(默认:`~/.ssh/id_rsa`) |
| `--copy-binary` | 在扫描前将本地二进制文件复制到远程主机。该二进制文件**必须**是静态链接的。GitHub 发布的二进制文件均为静态文件,您可以放心使用此标志。 |
| `--local-binary ` | 当使用 `--copy-binary` 时,指定要复制的本地静态二进制文件的路径,而不是当前正在运行的文件。适用于您本地运行的是 debug 构建版本,但希望对远程主机使用 release 构建版本的情况。 |
| `--remote-path ` | 二进制文件在远程主机上的放置路径(默认:`/tmp/owlzops-mapper`) |
| `--remote-timeout-secs ` | 等待远程扫描完成的最长时间(默认:120 秒) |
| `--ask-sudo-pass` | 提示输入 sudo 密码,并通过 SSH 通道安全地转发(免除了对 NOPASSWD 的要求) |
| `--keep-binary` | 跳过清理 —— 在扫描完成后将二进制文件保留在远程主机上 |
| `--max-concurrent ` | 同时进行的 SSH 会话的最大数量(默认:50) |
| `-h, --help` | 打印帮助信息 |
| `-V, --version` | 打印版本信息 |
### 子命令
| 命令 | 描述 |
|---------|-------------|
| `audit` | 运行审计扫描(本地或远程) |
| `snapshot` | 运行审计并将 JSON 快照保存到磁盘 |
| `compare ` | 比较两个 JSON 快照并显示漂移情况 |
| `dir-compare ` | 比较目录中最近生成的两个快照 |
## 退出代码
| 代码 | 单主机 | 多主机(集群) |
|------|-------------|---------------------|
| `0` |发现严重问题 | 所有主机正常 |
| `1` | 出现一项或多项严重发现(防火墙被禁用、允许 SSH root 登录、有待处理的安全更新、SSL 证书即将过期、服务启动失败、缺少备份、NTP 未同步、存在 sudo NOPASSWD 条目、sysctl 问题 ≥ 3) | 任一主机存在严重问题 |
| `2` | 未以 root 身份运行、存在扫描警告,**或集群扫描未生成任何报告** | 任一主机未以 root 身份运行,**或所有远程主机均失败** |
您可以直接在 CI/CD 流水线中使用这些代码:
```
sudo ./owlzops-mapper audit || echo "Security scan failed – check the report"
```
## 风险评分
仪表板和 Excel 报告包含基于实际审计发现计算出的 **风险评分(0–100)**。该评分分为三个子评分:
| 类别 | 上限 | 示例 |
|---|---|---|
| **安全性** | 60 | 防火墙、SSH 配置、安全更新、Docker 风险、sysctl 加固、恶意软件与入侵检测 |
| **可靠性** | 30 | 失败的服务、缺少备份、OOM 杀死进程、容器健康状况 |
| **基础维护** | 10 | NTP 同步状态 |
分数越低越好。每项发现都尽可能附带了相应的 CIS Benchmark 参考。
颜色图例:**绿色** < 40,**黄色** 40–69,**红色** ≥ 70。
| 发现项 | 扣分 |
|---|---|
| 防火墙未启用 | +30 |
| 允许 SSH root 登录 | +25(`prohibit-password` 会减轻权重) |
| 待处理的安全更新 | +20(阶梯式:根据数量扣 10/15/20) |
| SSL 证书将在 7 天内过期 | +15(最高) |
| 失败的 systemd 服务 | +10 |
| 启用了 SSH 密码身份验证 | +10 |
| 存在 OOM 杀死记录 | +10 |
| 未检测到备份工具 | +20 |
| NTP 未同步 | +10 |
| 发现 Sudo NOPASSWD 条目 | +5(受限命令)/ +15(ALL) |
| sudoers 权限不是 0440 | +5 |
| sysctl 安全问题 | 每个问题 +5(视上下文而定) |
| Docker:缺少内存限制的容器 | +5 |
| Docker:缺少 CPU 限制的容器 | +3 |
| Docker:特权容器 | +10 |
| Docker:危险的 capabilities | +10 |
| root 使用密码登录(组合情况) | +5 |
| 容器挂载了 Docker socket 或主机 root | +15 |
| 容器挂载了敏感的主机路径(可写) | +10 |
| Docker:被 OOM 杀死的容器 | +10 |
| Docker:处于重启循环的容器 | +5 |
| Docker:状态异常的容器(健康检查失败) | +10 |
| **SEC‑015 – 网络上的特权非 root 植入** | **+60** |
| **SEC‑016 – 已知的恶意进程(按名称)** | **+60** |
| **SEC‑017 – 无文件恶意软件(已删除的可执行文件 / memfd)** | **+60** |
| **SEC‑018 – 可疑的 cron 任务(持久化)** | **+20** |
| **CAP‑001(动态) – 具有关键 capabilities 的非 root 进程** | **+8(环回地址)/ +20(通配符暴露)** |
## 扫描内容
| 类别 | 详情 |
|---|---|
| 系统 | 操作系统、内核、运行时间、CPU、RAM、负载平均值、LSM 模块 |
| 安全性 | SSH 配置(有效配置与回退配置)、root 登录、密码身份验证、用户、授权密钥、登录历史、fail2ban 与 auditd 存在性、**sudo NOPASSWD 条目、sudoers 权限、sysctl 安全审计、恶意软件/入侵检测** |
| 网络 | 带有绑定地址的监听端口(红色 = 暴露在 0.0.0.0/::)、防火墙(ufw、firewalld、nftables、iptables)、DNS、带有过期时间的 SSL 证书 |
| 存储 | 磁盘使用情况、每个挂载点的 inode 使用情况 |
| Docker | 镜像、悬空层、容器、挂载、日志大小、特权标志、内存/CPU 限制、危险 capabilities、**敏感主机挂载、OOM 杀死进程、重启循环、健康状态** |
| 软件包 | 已安装数量、可升级数量、安全更新 |
| 数据库 | PostgreSQL、MySQL、Redis、MongoDB — 版本和数据大小 |
| 内部组件 | cron 任务(带严重性分类)、systemd 定时器、/etc/hosts 覆盖配置、内核错误、失败的 systemd 单元 |
| 备份 | 检测 restic、borg、duplicati、cron 中的 rsync/备份 |
| NTP | 时间同步状态和偏差值 |
| **恶意软件与入侵** | **全面扫描 /proc 以查找已知的恶意进程名,检测已删除(无文件)的可执行文件和基于 memfd 的植入物,将临时路径上具有特权的进程与网络监听器进行交叉关联** |
## 这些发现意味着什么?
Owlzops 提供固定价格的工程服务包,专门用于修复此扫描器发现的架构问题。
| 发现 | 意味着什么 | 建议的后续步骤 |
|---------|---------------|-----------------------|
| **风险评分 ≥ 70** | 基础架构在多个维度存在系统性风险。您需要进行一次全面审查。 | [基础架构健康检查](https://owlzops.com/?utm_source=github&utm_medium=readme&utm_campaign=mapper_table#services:~:text=Infrastructure%20Healthcheck) |
| **无备份工具** | 未检测到自动备份或灾难恢复策略。数据丢失只是时间问题。 | [生产可靠性冲刺](https://owlzops.com/?utm_source=github&utm_medium=readme&utm_campaign=mapper_table#services:~:text=Production%20Reliability%20Sprint) |
| **systemd 失败 / OOM 杀死进程** | 生产稳定性已受影响。服务正在崩溃或资源严重匮乏。 | [生产可靠性冲刺](https://owlzops.com/?utm_source=github&utm_medium=readme&utm_campaign=mapper_table#services:~:text=Production%20Reliability%20Sprint) |
| **有待处理的安全更新** | 系统正在累积技术债务和未修补的漏洞。 | [可靠性维护服务](https://owlzops.com/?utm_source=github&utm_medium=readme&utm_campaign=mapper_table#services:~:text=Reliability%20Retainer) |
| **防火墙禁用 / SSH root 登录** | 关键身份验证薄弱。主机直接暴露在公共互联网中。 | [免费 Mapper 咨询](https://owlzops.com/contact?utm_source=github&utm_medium=readme&utm_campaign=mapper_table) |
| **检测到活跃入侵 (SEC‑015…018)** | 扫描器发现了潜在 rootkit、后门或无文件恶意软件的证据。需要立即进行事件响应。 | [紧急分流处理](https://owlzops.com/contact?utm_source=github&utm_medium=readme&utm_campaign=mapper_table) |
如果 owlzops-mapper 标记了严重问题,我们可以审查您的 JSON 报告并提供具体的补救计划。
→ [预约一次免费的 30 分钟基础架构审查](https://owlzops.com/contact?utm_source=github&utm_medium=readme&utm_campaign=mapper_table)
我们会在通话前查看您的扫描结果。没有推销 - 只有事实。
## 为什么选择 Rust?
单一静态二进制文件。没有运行时,没有 Python,无需在目标服务器上安装任何
依赖。复制过去,运行,搞定。
## 从源码构建
```
git clone https://github.com/OWLZOPS/owlzops-mapper
cd owlzops-mapper
cargo build --release
sudo ./target/release/owlzops-mapper audit
```
如需进行静态 musl 构建(推荐用于远程扫描):
```
rustup target add x86_64-unknown-linux-musl
cargo build --release --target x86_64-unknown-linux-musl
```
要求:Rust 1.85+,Linux 目标平台。
我们的 CI 流水线通过 commit SHA 锁定所有 GitHub Actions,包含 `cargo audit`、`cargo deny`,并在每次发布时生成 SBOM —— 详情请参阅[工作流](.github/workflows)。
## 验证发布版本
所有发布产物均经过 GPG 签名,并发布了 SHA256 校验和。
项目公钥为 [`gpg-public-key.asc`](gpg-public-key.asc)。
验证方法:
```
gpg --import gpg-public-key.asc
gpg --verify owlzops-mapper-linux-x86_64.tar.gz.asc owlzops-mapper-linux-x86_64.tar.gz
```
如果系统中存在 `gpg`,安装脚本 (`install.sh`) 现在会自动执行 GPG 验证。
## 许可证
**Apache-2.0 with Commons Clause** - 免费使用,不得转售。
**我的公司可以免费使用吗?**
是的。您可以 100% 免费将 owlzops-mapper 用于商业目的、企业基础架构审计和内部安全检查。
Commons Clause 仅用于阻止第三方获取此代码库并直接将其作为自己的商业软件或 SaaS 产品进行转售。
详情请参阅 [LICENSE](LICENSE)。
以前的版本 (v0.5.10, v0.5.9, v0.5.8, v0.5.7, v0.5.6, v0.5.5, v0.5.4, v0.5.3, v0.5.2, v0.5.1, v0.5.0)
### v0.5.10 (2026-07-09) **可观测性与准确性** - 覆盖率警告(被截断的文件、无法访问的 /proc 条目)现在会同时显示在终端和 Excel 报告中。 - 由权限错误导致的端口归属失败现在会被汇总并作为覆盖率警告报告。 - 通过 russh 通道上传二进制文件时,现在会等待远程命令完成并检查其退出状态。失败情况(如磁盘已满、权限问题)将作为 `UploadFailed` 错误抛出。 **集群编排** - JSONL 写入器仅在关闭期间使用条件性的 2 秒超时。 - `SIGINT` / `SIGTERM` 现在通过 `tokio::sync::Notify` + `JoinSet::abort_all()` 立即中止正在进行的 SSH 会话。通过从 `notify_waiters` 切换到 `notify_one` 修复了丢失信号的边缘情况。 **安全性与平台支持** - sudoers 文件过滤现在严格遵循 `sudoers(5)` 规则(包含 `.` 或以 `~` 结尾的文件会被忽略)。读取错误会被记录为覆盖率警告。 - 当未设置 `$HOME` 时,TOFU 信任存储将安全关闭(不回退到 `/tmp`)。 - 旧版 SSH 路径(`run_remote_scan`)现在使用 `split_host_port` 并将端口显式传递给 `ssh`/`scp`。IPv6 地址在 SCP 命令中会被正确加上方括号。 **用户体验改进** - DNS 上游:当检测到 `systemd-resolved` stub 时,会在 stub 旁边显示真实的上游服务器。 - 重启原因:列出了触发重启请求的具体软件包。 - DLP 上下文:机密泄露发现现在包含了 PID 和进程名称。 - Cron 任务:重命名为“System & Custom Cronjobs”;突出显示可疑条目,不再将普通的系统 cron 标记为危险。 - 风险评分:切换为扣分表示法(例如 `Security −60`)并附带文字健康度标签(Healthy / At Risk / Critical)。 **Docker 指标迁移** - 可回收空间:使用 `docker system df`(bollard `df()`)报告真实的可回收空间,而不是简单累加虚拟大小。 - 镜像大小:总大小现在使用 `df.layers_size`(真实磁盘使用量),悬空镜像显示其虚拟大小作为参考,容器大小包含了 `SizeRw`(可写层)。 - UI/Excel:表头更新为“Real Disk Size (Images)”和“Dangling Virtual Size (GB)”。 **容器运行时与编排器检测** - 在主机扫描中增加了对 `dockerd`、`containerd` 以及 Kubernetes 相关进程的识别。 ### v0.5.9 (2026-07-08) **可观测性** - 覆盖率警告(被截断的文件、无法访问的 /proc 条目)现在会同时显示在终端和 Excel 报告中。 - 由权限错误导致的端口归属失败现在会被汇总并作为覆盖率警告报告。 **可靠性与兼容性** - 通过从 `notify_waiters` 切换到 `notify_one`,修复了在优雅关闭时丢失信号的边缘情况。 - 将输出文件路径上的 `unwrap()` 替换为 `to_string_lossy()`,以防止在非 UTF-8 路径上发生 panic。 - `PackageManager` 反序列化现在将未知的未来变体映射为 `Unknown`,以保证向前兼容性。 **代码维护** - 从 release profile 中移除了无效的 `debug = "limited"`。 - 统一了超时时间预算计算(`host_budget_secs`),供集群编排器和 russh 引擎共享使用。 ### v0.5.8 (2026-07-08) **可观测性与准确性** - R9-01:覆盖率警告(被截断的文件、无法访问的 /proc 条目)现在会在审计输出中报告(`coverage_warnings` 字段)。 - R9-02:通过 russh 通道上传二进制文件时,现在会等待远程命令完成并检查其退出状态。失败情况(如磁盘已满、权限问题)将作为 `UploadFailed` 错误抛出。 - R9-05:sudoers 文件过滤现在严格遵循 `sudoers(5)` 规则(包含 `.` 或以 `~` 结尾的文件会被忽略)。读取错误会被记录为覆盖率警告。 **集群编排** - R9-03:JSONL 写入器在成功时不再受 2 秒硬超时的限制;它会完全排干缓冲区。超时仅在优雅关闭时应用。 - R9-04:`SIGINT` / `SIGTERM` 现在通过 `tokio::sync::Notify` 和 `JoinSet::abort_all()` 立即中止正在进行的 SSH 会话,而不是等待任务完成。 **安全性与平台支持** - R9-06:旧版 SSH 路径(`run_remote_scan`)现在使用 `split_host_port` 并将端口显式传递给 `ssh`/`scp`。IPv6 地址在 SCP 命令中会被正确加上方括号。 - R9-07:当未设置 `$HOME` 时,TOFU 信任存储不再回退到 `/tmp`。mapper 会报出清晰的错误,而不是使用一个全局可写的目录。 - DLP 扫描器现在重用单个 `String` 缓冲区来构建路径,减少了每个进程的内存分配。 ### v0.5.7 (2026-07-08) **安全性** - R8-01:在 russh 路径中对远程 stdout/stderr 设置上限,以防止来自不受信任主机的 OOM 攻击。 - R8-02:修复了当 `known_hosts` 中存在多个密钥类型时错误触发 `HostKeyChanged` 的问题。 - R8-05:在主机密钥错误消息中包含确切的 `known_hosts` 文件路径。 - R8-07:在子进程上设置 `stdin(Stdio::null())` 以防止终端被劫持。 - R8-08:处理 SIGTERM 并改进 SIGINT 实现优雅关闭,立即中止活动的 SSH 会话。 **稳定性与兼容性** - R8-03:在旧版 SSH 路径中将子进程的 stderr 限制在 1 MiB 以内。 - R8-04:在 `split_host_port` 中支持 IPv6 地址(纯地址和 `[::1]:port`)。 - R8-06:在 `HostInfo` 中添加 `#[serde(default)]`,以兼容旧版本的快照。 **性能与代码维护** - 使用内部 russh 通道替换外部 SCPSSH 上传——提供实时进度条,无需依赖系统 `scp`。 - N8-1:避免在 `read_file_capped` 中进行额外的 UTF-8 内存分配。 - N8-2:使用迭代器替换 `/proc/net` 解析器中的 `Vec<&str>` 集合。 - N8-3:使用 `HashSet` 对监听端口进行去重。 - N8-5:在 `RemoteError::Ssh` 错误中包含准确的主机名。 - N8-6:在 DLP 扫描器中使用 `safe_io` 读取 `/proc/标签:API接口, EDR, Rust, Web报告查看器, 可视化界面, 基础设施扫描, 无代理, 无线安全, 系统运维, 网络流量审计, 脆弱性评估, 通知系统, 配置漂移检测