kpcyrd/rebuilderd
GitHub: kpcyrd/rebuilderd
独立的二进制包验证系统,通过从源代码重新构建并比对来确保软件供应链安全。
Stars: 419 | Forks: 32
# rebuilderd(1) [][crates] [][cncf] [][irc]
二进制包的独立验证系统。

- [在浏览器中访问 rebuilderd 实例](#accessing-a-rebuilderd-instance-in-your-browser)
- [通过脚本访问 rebuilderd 实例](#scripting-access-to-a-rebuilderd-instance)
- [自行运行 rebuilderd 实例](#running-a-rebuilderd-instance-yourself)
- [重建 Arch Linux](#rebuilding-arch-linux) (已支持)
- [重建 Tails](docs/setup-tails.md)
- [开发](#development)
- [依赖项](#dependencies)
- [资助](#funding)
- [许可证](#license)
rebuilderd 监控 Linux 发行版的软件包仓库,并使用
[archlinux-repro][1] 等 rebuilder 后端来验证提供的二进制
包是否可以从给定的源代码重现。
它跟踪已成功验证的包的状态,并可选择使用 [diffoscope][2] 生成
差异报告以供调试。请注意,由于此技术尚处于早期阶段,重建失败更可能是因为
不确定的构建过程,而不是供应链遭到破坏,但如果
您信任的多个 rebuilder 都报告您使用的软件包集是 100% 可重现的,
您就可以确信系统上的二进制文件没有
被篡改。如果负担得起,鼓励人们运行自己的 rebuilder。
## 状态
| | 状态 | Docker | 不需要 --privileged | 不需要 /dev/kvm | 后端 |
| --- | --- | --- | --- | --- | --- |
| **Arch Linux** | ✔️ 已支持 | ❌ | - | ✔️ | [archlinux-repro](https://github.com/archlinux/archlinux-repro) |
| **Debian** | ✔️ 已支持 | ✔️ (尚不可用) | ❌ | ✔️ | [debrebuild](https://salsa.debian.org/debian/devscripts/-/blob/main/scripts/debrebuild.pl) |
| **Tails** | 🚀 实验性 | ❌ | - | ❌ | [文档](https://tails.boum.org/contribute/build/) ([脚本](worker/rebuilder-tails.sh)) |
| **Alpine** | ✨ 计划中 | - | - | - | - |
| **Fedora** | 🚀 实验性 | ❌ | ❌ | ✔️ | [fedora-repro-build](https://github.com/keszybz/fedora-repro-build/) |
**Docker**:此仓库中有一个 docker-compose 示例设置,但并非
所有 rebuilder 后端都支持在 docker 容器内运行(例如,
因为它本身会创建容器)。
**不需要 --privileged**:某些 rebuilder 后端以一种
允许在 docker 容器内工作的方式创建容器,前提是它们被授予所需的
内核权限。这可能会对在该系统上运行的
其他容器产生安全隐患,或者容器内运行的代码可能会
重新配置 docker 容器外部的系统。
**不需要 /dev/kvm**:某些构建工具可能需要启动虚拟机
并依赖可用的 /dev/kvm。这是对
托管环境的特殊要求,您要么需要具有 **嵌套 KVM (Nested KVM)** 的 VPS,要么
需要专用的非虚拟化硬件。
# 在浏览器中访问 rebuilderd 实例
许多实例运行 Web 前端以显示其结果。[rebuilderd-website]
是一个非常好的选择,也是支持 Arch Linux rebuilderd
实例的软件:
https://reproducible.archlinux.org/
加载所有软件包的索引可能需要一小段时间。
# 通过脚本访问 rebuilderd 实例
也可以通过脚本方式查询和管理 rebuilderd 实例。建议安装 `rebuildctl` 命令行工具来执行此操作
(您系统的说明可能有所不同,请参阅右侧的打包状态):
```
pacman -S rebuilderd-tools
```
然后您可以查询 rebuilderd 实例以获取特定包的状态:
```
rebuildctl -H https://reproducible.archlinux.org pkgs ls --name rebuilderd
```
您必须指定要查询的实例,因为没有
绝对的真理™。不过您可以询问多个实例,包括您自己
运营的实例。
如果 rebuilder 似乎有过时的数据或将包列为未知,
更新可能仍在构建队列中。您可以像这样查询实例的
构建队列:
```
rebuildctl -H https://reproducible.archlinux.org queue ls --head
```
如果没有输出,则表示构建队列为空。
如果您是此实例的管理员,您还可以运行如下命令:
```
rebuildctl status
```
或者立即重试所有失败的重建尝试(默认情况下会自动重试):
```
rebuildctl pkgs requeue --status BAD --reset
```
# 自行运行 rebuilderd 实例

“我从源代码编译所有内容”——如今,相当数量的现实世界二进制
包已经可以被重现。运行 rebuilder 的人越多,
就越难全部攻陷它们。
在项目的当前阶段,我们对每一个 rebuilder 都
感兴趣!大多数 rebuilderd 讨论目前发生在 libera 上的
#archlinux-reproducible 中,如果您正在运行实例或正在考虑
建立一个实例,欢迎顺便看看。有一些不可重现的包是正常的(即使
比官方 rebuilder 稍微多一点),但让更多人
确认成功的重建非常有帮助。
## 重建 Arch Linux
请参阅 [Arch Linux Wiki](https://wiki.archlinux.org/index.php/Rebuilderd) 中的设置说明。
# 使用 docker 进行开发
仓库中有一个 docker-compose 设置,要启动基本堆栈,只需
克隆仓库并运行:
```
docker compose up
```
初始构建将花费一些时间。
要重新编译您的更改(您可以选择指定要构建的特定镜像):
```
docker compose build
```
auth cookie 具有严格的权限,对于开发,只需使用以下命令更改它们:
```
sudo chmod 0644 secret/auth
```
检查您是否可以成功运行管理任务,使用此命令编译并运行 `rebuildctl` 二进制文件:
```
REBUILDERD_COOKIE_PATH=secret/auth cargo run -p rebuildctl -- -v status
```
数据库中还没有包,我们可以加载一个示例配置文件 (profile)。它只包含一个轻量级包,并且应该在我们的 docker-compose 设置中开箱即用地成功重建。
```
REBUILDERD_COOKIE_PATH=secret/auth cargo run -p rebuildctl -- pkgs sync-profile --sync-config contrib/confs/rebuilderd-sync.conf debian-anarchism
```
检查包是否已成功添加到数据库且状态为 `UNKWN`:
```
REBUILDERD_COOKIE_PATH=secret/auth cargo run -p rebuildctl -- pkgs ls
```
您可以使用此命令显示构建队列,它还将为当前正在进行的工作显示一个计时器:
```
REBUILDERD_COOKIE_PATH=secret/auth cargo run -p rebuildctl -- queue ls --head
```
您可以结合使用上述命令来监控您的 rebuilder。包最终应该在 `rebuildctl pkgs ls` 中显示为 `GOOD`。
# 开发
如果您想从源代码构建,或者您想运行基于
特定提交构建的 rebuilderd,本节包含相关说明。
一个 rebuilder 由 `rebuilderd` 守护进程和 >= 1 个 worker 组成:
首先我们切换到 `daemon/` 文件夹并运行我们的 rebuilderd 守护进程:
```
cd daemon; cargo run
```
这需要一点时间,但 API 现在应该可以在
`http://127.0.0.1:8484/api/v0/dashboard` 访问。
这个守护进程需要在后台运行,所以我们启动一个新的终端来
继续下一步。
接下来我们要构建 `rebuildctl binary` 并确认它能够
连接到 API。如果我们没有收到错误消息,这意味着它正在工作。
```
cd tools; cargo run -- status
```
我们还没有连接任何 worker,所以此输出为空。
接下来我们要连接一个 rebuilder。rebuilderd 只为您
进行调度,因此您需要在此处安装额外的软件(称为 rebuilder
后端):
- **Arch Linux**: `pacman -S archlinux-repro` 或 `git clone
https://github.com/archlinux/archlinux-repro && cd archlinux-repro/ && make &&
sudo make install`。请注意,在 debian buster 上,您需要从
buster-backports 安装 systemd。
安装了 rebuilder 后端后,我们现在要运行我们的第一个 worker:
```
cd worker; cargo run -- connect http://127.0.0.1:8484
```
这个 rebuilder 现在应该出现在我们的 `rebuildctl status` 输出中:
```
cd tools; cargo run -- status
```
接下来我们要导入一些包:
```
cd tools; cargo run -- pkgs sync archlinux community \
'https://ftp.halifax.rwth-aachen.de/archlinux/$repo/os/$arch' \
--architecture x86_64 --maintainer kpcyrd
```
`--maintainer` 选项是可选的,允许您仅重建特定维护者的包。
要显示我们导入的包的当前状态,请运行:
```
cd tools; cargo run -- pkgs ls
```
要监控您的 worker 是否正在接收任务:
```
cd tools; cargo build && CLICOLOR_FORCE=1 watch -c ../target/debug/rebuildctl status
```
要检查队列,请运行:
```
cd tools; cargo run -- queue ls
```
测试包导入的一种简单方法是使用如下命令:
```
cargo watch -- cargo run --bin rebuildctl -- pkgs sync-profile --print-json --sync-config contrib/confs/rebuilderd-sync.conf tails
```
直接构建包:
```
cargo run --bin rebuilderd-worker -- \
build debian 'http://deb.debian.org/debian/pool/main/a/anarchism/anarchism_15.3-3_all.deb' \
--input-url 'https://buildinfos.debian.net/buildinfo-pool/a/anarchism/anarchism_15.3-3_all.buildinfo' \
--backend 'debian=./rebuilder-debian.sh'
```
## 依赖项
Debian: pkg-config liblzma-dev libsqlite3-dev libzstd-dev
# 资助
Rebuilderd 开发目前由以下方资助:
- ~~kpcyrd 的储蓄账户~~
- ~~Google 和 The Linux Foundation~~
- [github sponsors](https://github.com/sponsors/kpcyrd) 上像你我一样的人
# 许可证
`GPL-3.0-or-later`
标签:Arch Linux, Debian, DevSecOps, diffoscope, DNS 反向解析, Python脚本, rebuilderd, Rust, TLS抓取, 上游代理, 二进制验证, 包管理, 可信计算, 可复现构建, 可视化界面, 后端服务, 完整性校验, 文档安全, 源码审计, 编译验证, 网络流量审计, 脚本检测, 请求拦截, 软件安全, 通知系统, 通知系统, 防篡改