Nucleus: 보안이 강화된 Nix-Native 컨테이너 런타임

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-native 방식으로 구축되었습니다.

NixOS 모듈 지원

Nucleus는 컨테이너를 systemd 서비스로 관리할 수 있게 해주는 일급 NixOS 모듈을 제공합니다. 각 컨테이너는 다음과 같은 요소를 포함하는 nucleus-<name>.service 유닛으로 정의됩니다:

  • 자동 재시작: on-failure 및 5s 백오프(backoff)로 구성됩니다.
  • Journald 통합: 표준 출력 및 에러가 journald로 직접 캡처됩니다.
  • 워크로드 정체성(Workload Identity): 런타임은 설정 시 root로 시작되지만, 워크로드를 실행하기 전에 구성된 사용자/그룹으로 권한을 낮춥니다.
  • 보안 강화(Hardening): ProtectSystem=strictProtectHome=true와 같은 systemd 수준의 보호 기능을 포함합니다.

재현 가능한 루트 파일시스템

nucleus.lib.mkRootfs 헬퍼를 사용하여 개발자는 필요한 패키지만 포함하는 최소한의 재현 가능한 루트 파일시스템을 빌드할 수 있습니다. 이는 프로덕션 환경에서 가변적인 호스트 바인드 마운트의 필요성을 대체하며, 루트 파일시스템 인증(시작 시 .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가 폴백(fallback)으로만 사용 가능합니다.
  • Landlock LSM: 경로 기반 파일시스템 액세스 제어(Linux 5.13+).
  • seccomp: 트레이스 기반 프로필 생성을 통한 syscall 필터링.

gVisor 통합

보안 강화를 위해 Nucleus는 워크로드와 호스트 커널 사이의 강력한 경계를 제공하기 위해 syscall을 가로채는 애플리케이션 커널인 gVisor (runsc)와 일급 통합을 제공합니다.

송출 정책(Egress Policy) 강제화

프로덕션 브리지 모드에서 Nucleus는 기본적으로 모든 외부 송출을 차단하는 deny-all 정책을 사용합니다. 액세스는 CIDR 또는 특정 DNS 도메인에 대한 명시적인 허용 목록(allow-lists)을 통해서만 허용되며, 이는 시작 시 해결(resolve)되어 컨테이너의 네트워크 네임스페이스 내 iptables 규칙을 통해 강제화됩니다.

서비스 모드

Nucleus는 유연성과 보안의 균형을 맞추기 위해 세 가지 별도의 모드를드로 운영합니다:

Feature Agent Mode Strict Agent Mode Production Mode
Primary Use Case Ephemeral AI agent workloads Fail-closed ephemeral workloads Long-running NixOS services
Security Posture Best-effort Forbidden degraded security Strict invariants; fail-closed
Rootfs Host bind mounts Host bind mounts / Rootfs Pre-built Nix closure
Networking Optional host/bridge Native host forbidden Native host forbidden
Cgroup Limits Required Required Required
PID 1 Init Direct exec Direct exec Mini-init for zombie reaping

Docker와의 비교

Nucleus is not a drop-in replacement for Docker; it is a hardened sandbox runtime with single-host orchestration capabilities, closer to runc or gVisor에 가깝습니다.

  • No Images: Nucleus는 OCI 이미지를, 레이어, 또는 레 registries을 사용하지 않습니다. 대신 Nix closures 또는 tmpfs 디렉토리를 사용합니다.
  • No Daemon: 단일 바이너리로 direct fork/exec를 사용하며, 분리된 컨테이너는 systemd transient units로 관리됩니다.
  • Sovereign Security: Docker가 번들링된 기본값을 제공하는 반면, Nucleus는 외부화된, SHA-256 핀(pinned)된 seccomp, capability, 그리고 Landlock 정책을 사용합니다.

멀티 컨테이너 토폴로지

Nucleus는 TOML 구성을 사용하여 멀티 컨테이너 스택을 관리하는 nucleus compose 명령어를 포함합니다. 이를 통해 네트워크, 볼륨, 서비스를 의존성 DAG(Directed Acyclic Graph)로 정의할 수 있으며, 헬스 체크를 기반으로 서비스가 올바른 순서대로 시작되고 종료되도록 보장합니다.

형식 검증(Formal Verification)

신뢰성을 보장하기 위해 Nucleus는 사양(spec)-driven development를 채택합니다. 상태 머신은 **TLA+**와 Apalache 모델 체커를 사용하여 형식적으로 검증되었으며, Rust에서 모델 기반 테스트를 통해 TLA+ 사양을 실제 구현과 비교 검증합니다.

Sources