Nucleus: 一款安全性強化且 Nix 原生的容器執行環境

Nucleus 是一款專為 Linux 與 NixOS 設計的輕量級、安全性強化的容器執行環境。與傳統的容器執行環境不同,Nucleus 專注於完全宣告式的模型,由 Nix 建置根檔案系統,並由 NixOS 模組宣告服務,從而實現可重現且可稽核的執行環境。

高性能隔離與基準測試

Nucleus 提供接近裸機的效能,且啟動時間明顯快於傳統執行環境。在冷啟動基準測試中,Nucleus 的啟動時間達到 12 ms,而 Docker 約為 500 ms。

對於資料庫工作負載的穩態效能表現依舊出色。在 PostgreSQL 18 基準測試 (pgbench) 中,Nucleus 的隔離機制顯示出與裸機相比並無顯著的效能下降,部分結果顯示,在讀取密集型與讀寫混合型工作負載中,平均 TPS (Transactions Per Second) 與延遲數據與裸機效能高度一致,甚至略微超越。

宣告式架構與 Nix 整合

Nucleus 旨在成為 Nix 原生,利用 Nix 生態系統來實現可重現性與穩定性。

NixOS 模組支援

Nucleus 提供一等公民等級的 NixOS 模組,允許將容器管理為 systemd 服務。每個容器被定義為一個 nucleus-<name>.service 單元,其中包含:

  • 自動重啟:配置為 on-failure 並帶有 5s 的退避時間 (backoff)。
  • 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, 以及選用的 time 隔離。
  • cgroups v2:針對 CPU, memory, PIDs, 與 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 代理工作負載 | 失敗即關閉的短暫工作負載 | 長期運行的 NixOS 服務 | | 安全態勢 | 盡力而為 | 禁止降級安全性 | 嚴格的不變量;失敗即關閉 | | Rootfs | 主機綁定掛載 | 主機綁定掛載 / Rootfs | 預建的 Nix closure | | 網路 | 選用的主機/橋接 | 禁止原生主機存取 | 禁止原生主機存取 | | Cgroup 限制 | 選用 | 必要 | 必要 | | PID 1 Init | Direct exec | Direct exec | 用於回收殭屍程序的 Mini-init |

與 Docker 的比較

Nucleus 並非 Docker 的直接替代品;它是一款具備單主機編排能力的、更接近 runcgVisor 的強化沙盒執行環境。

  • 無映像檔:Nucleus 不使用 OCI 映像檔、層級或登錄檔。它使用 Nix closures 或 tmpfs 目錄。
  • 無守護程序 (Daemon):它是一個單一二進位檔,使用直接 fork/exec;分離的容器被管理為 systemd transient units。
  • 主權安全性:雖然 Docker 提供捆綁的預設值,但 Nucleus 使用外部化的、經 SHA-256 固定鎖定的 seccomp, capability, 與 Landlock 策略。

多容器拓撲結構

Nucleus 包含一個 nucleus compose 指令,使用 TOML 配置來管理多容器堆疊。這允許定義網路、磁碟卷 (volumes) 與服務,並具備依賴關係的 DAG (有向無環圖),確保服務能根據健康檢查依序啟動與拆除。

形式化驗證

為了確保可靠性,Nucleus 採用了規格驅動開發。狀態機透過 TLA+Apalache 模型檢查器進行形式化驗證,並在 Rust 中使用基於模型的測試,以驗證 TLA+ 規格與實際實作之間的符合性。

Sources