Gondolin
네트워크와 비밀값을 호스트가 통제하는 로컬 마이크로VM
npx @earendil-works/gondolin bash에이전트가 만든 코드를 로컬 리눅스 마이크로VM 안에서 돌리면서 네트워크와 파일시스템 접근을 호스트 쪽 정책으로 묶어 두는 도구입니다. 기본은 QEMU 이고 실험적인 다른 백엔드를 고를 수 있으며 정책 계층을 자바스크립트로 직접 씁니다. 핵심은 비밀값 처리입니다. 게스트는 자리표시자 토큰만 보고, 진짜 값은 허용한 목적지로 나갈 때만 호스트가 끼워 넣습니다. 그래서 생성된 코드가 자격 증명을 다른 곳으로 흘리지 못합니다. 세션을 목록으로 보고 붙었다 떼거나 스냅숏으로 멈췄다 다시 이어 갈 수 있습니다.
판단
이럴 때 씁니다
- 에이전트가 만든 코드에 네트워크와 자격 증명을 줘야 할 때
- 생성된 코드가 비밀값을 밖으로 흘리지 못하게 막아야 할 때
- 실행 환경을 스냅숏으로 되돌리며 반복 시도해야 할 때
이럴 땐 쓰지 마세요
- 윈도우는 지원 대상이 아닙니다
- 가상화 계층이 들어가므로 단순 명령 실행에는 무겁습니다
- x86_64 리눅스보다 ARM64 쪽이 더 많이 검증돼 있습니다
차별점
- 비밀값을 게스트에 아예 노출하지 않고 호스트가 목적지별로 주입합니다.
- 네트워크와 파일시스템 정책을 자바스크립트로 직접 작성합니다.
- 디스크 스냅숏과 재개, 셸 붙이기, SSH 를 모두 지원합니다.
워크플로
- 01CLI 로 마이크로VM 셸을 띄워 동작을 확인합니다.
- 02SDK 에서 허용할 호스트 목록과 비밀값을 선언합니다.
- 03VM 을 만들고 그 안에서 명령을 실행합니다.
- 04필요하면 스냅숏을 찍고 나중에 이어서 씁니다.
- 05게스트의 HTTP 서비스를 호스트로 노출할 때는 인그레스를 켭니다.
주요 명령
| 명령 | 설명 |
|---|---|
npx @earendil-works/gondolin bash | 마이크로VM 안에서 셸을 띄웁니다. |
VM.create({ httpHooks, env }) | 정책과 비밀값을 붙여 VM 을 만듭니다. |
vm.exec("<command>") | 게스트 안에서 명령을 실행하고 종료 코드와 출력을 받습니다. |
함정
설치 전에 확인하세요
- 게스트는 자리표시자 토큰만 봅니다. 진짜 값은 허용한 목적지로 나가는 요청에만 호스트가 끼워 넣으므로, 게스트 안에서 토큰을 출력해 봐야 실제 값이 아닙니다.
- krun 백엔드는 실험적이고 부팅 자산이 따로 필요합니다. 리눅스에서 러너를 빌드하려면 Rust 최신 툴체인과 Zig 를 포함해 준비물이 여럿입니다.
- 맥에서는 하이퍼바이저 권한으로 러너에 즉석 서명을 붙여야 동작합니다. 빌드 과정이 이를 대신 해 줍니다.
- DNS 동작과 루트 파일시스템 모드가 각각 세 가지입니다. 기본값이 무엇인지 확인하지 않으면 격리 수준을 잘못 짐작하게 됩니다.
비교
컨테이너 격리는 커널을 공유하고 네트워크 정책도 대체로 통과 여부까지만 정합니다. 이쪽은 마이크로VM 으로 커널을 분리하고, 요청과 응답 단위로 후크를 걸어 비밀값 주입까지 호스트가 쥡니다. 대신 부팅 자산을 받아야 하고 가상화 비용을 감수해야 합니다.
최근 변경
0.12.0 에서 krun 백엔드용 헬퍼 바이너리 빌드가 정리됐습니다. libkrun 을 전역 설치 없이 캐시에 두고 러너를 빌드하며, 맥에서는 하이퍼바이저 권한 서명까지 붙습니다.