tweag/genealogos
GitHub: tweag/genealogos
一个基于 Rust 的 Nix SBOM 生成工具,将 Nix 评估结果转换为标准化的物料清单。
Stars: 53 | Forks: 1
## 关于该项目
`。
完整选项列表请参见:
```
genealogos --help
```
### `genealogos-api`
Genealogos 也可以作为 API 服务器运行,使用 `genealogos-api` 二进制文件。
`genealogos-api` 提供两类端点。
一类是阻塞端点,另一类是基于作业的端点。
#### 阻塞端点
目前只有一个阻塞端点:`/api/analyze?installable=`。
默认情况下,`genealogos-api` 绑定在 `localhost:8000`。
例如,使用 curl 调用 API:
```
curl "http://localhost:8000/api/analyze?installable=nixpkgs%23hello"
```
注意 `nixpkgs#hello` 中的 `#` 已被 URL 编码。
此外,可以提供可选的 `bom_format` 查询参数来指定要使用的 BOM 格式。
示例:
```
curl "http://localhost:8000/api/analyze?installable=nixpkgs%23hello&cyclonedx_version=v1_4"
```
当前支持 `[cyclonedx_1.3_json, cyclonedx_1.3_xml, cyclonedx_1.4_json, cyclonedx_1.4_xml]`,默认值为 `cyclonedx_1.4_json`。
#### 作业
基于作业的 API 包含三个端点:`/api/jobs/create`、`/api/jobs/status` 和 `/api/jobs/result`。
创建作业的方式与阻塞 API 类似:
```
curl "http://localhost:8000/api/jobs/create?installable=nixpkgs%23hello"
```
此端点也支持 `bom_format` 查询参数。
该 API 调用的响应是一个 `job_id`,需要将其传递给后续调用以标识所需作业。
获取作业状态如下:
```
curl "http://localhost:8000/api/jobs/status/0"
```
其中 0 是上一个调用提供的 `job_id`。
该 API 可能返回 `stopped`、`running` 或 `done`。
最后,获取结果使用 `result` 端点:
```
curl "http://localhost:8000/api/jobs/result/0"
```
#### 配置
`genealogos-api` 可通过 [Rocket](https://rocket.rs) 的配置机制进行配置。
它使用 Rocket 定义的[默认提供者](https://rocket.rs/guide/v0.5/configuration/#default-provider)。
[默认选项](https://rocket.rs/guide/v0.5/configuration/#overview)包含所有与 Web 服务器相关的配置。
除了这些默认配置选项外,Genealogos 还扩展了 Rocket 的配置,新增两个键:
| key | kind | description | debug/release default |
|------------------|--------------------|--------------------------------------------------------------------|-----------------------|
| `gc_interval` | `u64` (in seconds) | 两轮垃圾回收之间的间隔时间 | `10` |
| `gc_stale_after` | `u64` (in seconds) | 最后一次被访问后多久认为作业已过期 | `60 * 10` |
### `genealogos-frontend`
Genealogos 附带一个纯 HTML/JavaScript 的 Web 前端。
默认情况下,该前端使用 `127.0.0.1` 连接到 `genealogos-api`。
可通过页面顶部的设置按钮更改此默认值。
Web UI 目前仅支持从 flake ref 和属性路径进行分析,尚未支持分析跟踪文件。
可以通过在喜爱的浏览器中打开 `index.html` 文件来打开前端。
另外,如果 `genealogos-api` 使用 `frontend` 功能标志构建,前端也可在 API 托管的根路径访问(例如 `http://localhost:8000/`)。
### NixOS 模块
该项目提供的 Flake 包含一个用于部署 Genealogos 的 NixOS 模块。
将模块添加到 NixOS 配置后,可通过以下方式启用 Genealogos:
```
services.genealogos.enable = true;
```
更多选项请参见 `./nix/genealogos-module.nix`。
## 贡献
贡献是使开源社区成为学习、启发和创造美好之地的重要因素。你所做的任何贡献都 **非常受赞赏**。
如果你有改进建议,请 fork 本仓库并创建 Pull Request,也可以直接打开 Issue。
## 测试
Genealogos 针对 `genealogos/tests/fixtures/nixtract/success/` 中的测试用例进行测试。
每个 `.in` 文件包含 `nixtract` 输出,每个 `.out` 文件包含对应的预期 `genealogos` 输出。
这些测试用例会在 `nix build` 时自动执行,也可手动使用 `cargo test` 运行。
通常,`genealogos` 的输出是非确定性的(UUID 是随机的,列表元素的顺序也是随机的),这使得测试略显复杂。
为了克服这一障碍,在运行 `cargo test` 或设置 `GENEALOGOS_DETERMINISTIC` 环境变量时,`genealogos` 的输出会被设为确定性模式。
这通过将 UUID 设为全零,并对 `dependsOn` 列表进行排序来实现。
为了更方便地处理这些测试用例,`nix develop .#scripts` 提供的 devShell 包含两个脚本:
`verify-fixture-files`,它使用 `cyclonedx-cli` 工具验证 `.out` 文件,确保 `genealogos` 生成有效的 CycloneDX。
以及 `update-fixture-files`,应在 `genealogos` 输出变更时运行。
注意第二个脚本要求 `genealogos-cli`必须可构建。
## 已知问题和限制
目前,Genealogos(通过 nixtract)会尝试查找所有作为输入派生物的属性。
这意味着某些输入可能会被遗漏,尤其是字符串上下文中的内容。
此外,Genealogos(通过 nixtract)为每个 SBOM 组件都会重启 nix。
当你的派生评估耗时较长时,这将导致 SBOM 生成非常缓慢。
### 安全注意事项
由于 Genealogos API 的本质,它会评估用户提供的任意 Nix 代码。
如果你计划将其作为公共服务运行,请务必妥善保护进程并设置适当的服务管理措施,考虑以下方面:
- 被任何用户发起的拒绝服务攻击风险,尤其是:
* 无限制的内存使用,
* 无限制的存储使用,
* 无限制的 CPU 时间使用
- 对 Nix Flake 评估完全封闭且纯净、并因此安全的假设的依赖
- 对 Nix 沙箱的依赖以确保其安全且不泄露
因此,我们建议在任何公共部署的 Genealogos 实例中使用容器化环境(例如通过提供的 [Docker 镜像](#Running_as_a_Docker_image)),并为容器适当限制资源。
## 许可证
根据 MIT 许可证分发。更多信息请参见 `LICENSE`。
## 资金支持
该项目通过 [NGI0 Entrust](https://nlnet.nl/entrust) 获得资助,
该基金由 [NLnet](https://nlnet.nl) 建立,并得到
欧洲委员会的 [下一代互联网](https://ngi.eu) 计划的支持。更多详情请访问 [NLnet 项目页面](https://nlnet.nl/project/Genealogos)。
[
](https://nlnet.nl)
[
](https://nlnet.nl/entrust)
## 联系
[][tweag-url]
GitHub: [https://github.com/tweag/genealogos](https://github.com/tweag/genealogos)
](https://nlnet.nl)
[标签:API服务, BOM生成, cargo, CycloneDX, Docker容器, GPT, LLM防护, Nix, Nix flakes, Rust, SBOM, Triage, WebSocket, 依赖分析, 前端, 可视化界面, 攻击面发现, 漏洞管理, 生成器, 硬件无关, 网络流量审计, 跌倒检测, 软件供应链, 软件物料清单, 软件组成分析, 通知系统