Nucleus: 一个经过安全加固的、Nix 原生的容器运行时

Nucleus 是一个轻量级、经过安全加固的容器运行时,专为 Linux 和 NixOS 设计。与传统的容器运行时不同,Nucleus 专注于完全声明式的模型,其中 Nix 构建根文件系统,而 NixOS 模块声明服务,从而实现了一个可重现且可审计的执行环境。

高性能隔离与基准测试

Nucleus 提供接近裸机(bare-metal)的性能,且启动时间明显快于传统运行时。在冷启动基准测试中,Nucleus 的启动时间达到了 12 ms,而 Docker 约为 500 ms。

对于数据库工作负载,其稳态性能保持在较高水平。在 PostgreSQL 18 基准测试(pgbench)中,Nucleus 的隔离表现出与裸机相比没有显著的性能下降,部分结果显示,在读密集型和读写混合型工作负载下,其平均 TPS(每秒事务数)和延迟数据与裸机性能高度一致或略有超出。

声明式架构与 Nix 集成

Nucleus 旨在成为 Nix 原生的,利用 Nix 生态系统来实现可重现性和稳定性。

NixOS 模块支持

Nucleus 提供了一流的 NixOS 模块,允许将容器作为 systemd 服务进行管理。每个容器被定义为一个 nucleus-<name>.service 单元,其中包含:

  • 自动重启:配置为 on-failure 并带有 5s 的退避时间。
  • Journald 集成:标准输出和错误直接捕获到 journald。
  • 工作负载身份:运行时以 root 身份启动进行设置,但在执行工作负载之前会降权到配置的用户/组。
  • 加固措施:包括 systemd 级别的保护,例如 ProtectSystem=strictProtectHome=true

可重现的根文件系统

通过使用 nucleus.lib.mkRootfs 助手函数,开发人员可以构建仅包含必要软件包的最小化、可重现的根文件系统。这取代了在生产环境中对可变宿主机绑定挂载(bind mounts)的需求,确保了运行时状态是稳定的,并且可以通过根文件系统证明(rootfs attestation)进行审计(在启动时验证 .nucleus-rootfs-sha256 清单)。

安全模型与加固

Nucleus 实施了“故障关闭”(fail-closed)的安全态势,特别是在其生产模式和严格代理模式下。

内核级隔离原语

Nucleus 利用了一套完整的 Linux 内核原语来实现隔离:

  • Namespaces:PID、mount、network、UTS、IPC、user、cgroup 以及可选的时间隔离。
  • cgroups v2:对 CPU、内存、PID 和 I/O 进行严格的资源限制。
  • pivot_root:用于文件系统隔离,chroot 仅作为基础代理模式下的回退方案。
  • Landlock LSM:基于路径的文件系统访问控制(Linux 5.13+)。
  • seccomp:带有基于追踪的配置文件生成的系统调用白名单过滤。

gVisor 集成

为了增强安全性,Nucleus 提供了与 gVisor (runsc) 的一流集成,gVisor 是一个应用内核,通过拦截系统调用在工作负载与宿主机内核之间提供更强的边界。

出站策略强制执行

在生产桥接模式下,Nucleus 默认采用“拒绝所有”的出站策略。只有通过对 CIDR 或特定 DNS 域名的显式允许列表进行授权,才能获得访问权限,这些域名在启动时解析,并通过容器网络命名空间内的 iptables 规则进行强制执行。

服务模式

Nucleus 通过三种不同的模式运行,以平衡灵活性与安全性:

特性 Agent Mode Strict Agent Mode Production Mode
主要用例 临时性 AI agent 工作负载 故障关闭的临时性工作负载 长运行的 NixOS 服务
安全态势 尽力而为 禁止降级安全性 严格的不变量;故障关闭
Rootfs 宿主机绑定挂载 宿主机绑定挂载 / Rootfs 预构建的 Nix closure
网络 可选的宿主机/桥接 禁止原生宿主机网络 禁止原生宿主机网络
Cgroup 限制 可选 必须 必须
PID 1 Init Direct exec Direct exec 用于回收僵尸进程的 Mini-init

与 Docker 的比较

Nucleus 并非 Docker 的即插即用替代品;它是一个经过加固的沙箱运行时,更接近 runcgVisor,并具备单机编排能力。

  • 无镜像:Nucleus 不使用 OCI 镜像、层或注册表。它使用 Nix closures 或 tmpfs 目录。
  • 无守护进程:它是一个单二进制文件,使用直接的 fork/exec;分离的容器被管理为 systemd transient 单元。
  • 主权安全:虽然 Docker 提供捆绑的默认设置,但 Nucleus 使用外部化的、使用 SHA-256 钉选的 seccomp、capability 和 Landlock 策略。

多容器拓扑结构

Nucleus 包含一个 nucleus compose 命令,使用 TOML 配置来管理多容器堆栈。这允许定义网络、卷和带有依赖 DAG(有向无环图)的服务,确保服务能够根据健康检查以正确的顺序启动和拆除。

形式化验证

为了确保可靠性,Nucleus 采用了规范驱动开发。状态机使用 TLA+Apalache 模型检查器进行形式化验证,并使用 Rust 中的基于模型的测试来验证 TLA+ 规范与实际实现的一致性。

Sources