kpcyrd/rebuilderd

GitHub: kpcyrd/rebuilderd

独立的二进制包验证系统,通过从源代码重新构建并比对来确保软件供应链安全。

Stars: 419 | Forks: 32

# rebuilderd(1) [![crates.io](https://img.shields.io/crates/v/rebuilderd.svg)][crates] [![cncf slack](https://img.shields.io/badge/cncf-%23rebuilderd-blue.svg)][cncf] [![irc.libera.chat:6697/#archlinux-reproducible](https://img.shields.io/badge/libera-%23archlinux--reproducible-blue.svg)][irc] 二进制包的独立验证系统。 ![rebuildctl pkgs ls 示例输出](https://raw.githubusercontent.com/kpcyrd/rebuilderd/main/.github/assets/Vx35qrG.png) - [在浏览器中访问 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 实例 Packaging status 也可以通过脚本方式查询和管理 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 实例 ![rebuilderd-worker 的 journalctl 输出](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/452dd5100d130515.png) “我从源代码编译所有内容”——如今,相当数量的现实世界二进制 包已经可以被重现。运行 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抓取, 上游代理, 二进制验证, 包管理, 可信计算, 可复现构建, 可视化界面, 后端服务, 完整性校验, 文档安全, 源码审计, 编译验证, 网络流量审计, 脚本检测, 请求拦截, 软件安全, 通知系统, 通知系统, 防篡改