smolvm으로 신뢰할 수 없는 Python 코드를 격리하는 법
AI 에이전트나 온라인 실행기가 사용자가 작성한 Python·JavaScript 코드를 실행하려면 프로세스뿐 아니라 파일, 네트워크, CPU, 메모리, 실행 시간까지 통제해야 한다. smolvm은 이 실행 경계를 워크로드별 하드웨어 가상화 VM으로 제공하는 CLI 도구다.
워크로드마다 별도의 게스트 커널
smolvm은 각 작업을 별도의 Linux 게스트 커널에서 실행한다. macOS에서는 Hypervisor.framework, Linux에서는 KVM, Windows에서는 Windows Hypervisor Platform을 사용하며, VMM은 libkrun, 게스트 커널은 libkrunfw가 제공한다.1
호스트 커널을 공유하는 컨테이너와 달리 각 워크로드가 자체 게스트 커널을 사용한다는 점이 핵심이다. VMM이 라이브러리 형태로 바이너리에 연결되므로 별도 데몬도 필요하지 않다.2 또한 Docker와 같은 OCI 이미지 형식을 사용해 Docker 데몬 없이 레지스트리 이미지를 부팅할 수 있다.1
격리 수준은 권한 설정이 결정한다
VM을 사용한다고 해서 모든 접근이 자동으로 안전해지는 것은 아니다. smolvm의 기본 네트워크는 비활성화돼 있으며, 필요한 경우에만 --net으로 활성화할 수 있다. 네트워크를 열더라도 --allow-host로 통신 대상 호스트를 제한할 수 있다.1
파일 접근 역시 명시적으로 설계해야 한다. 입력 디렉터리는 읽기 전용으로, 결과 디렉터리는 쓰기 가능으로 분리하면 게스트가 변경할 수 있는 범위를 줄일 수 있다. 호스트 디렉터리를 마운트하면 지정한 권한만큼 해당 경로가 게스트에 노출되므로, 필요한 디렉터리만 최소 권한으로 제공해야 한다.1
smolvm 1.8.3을 사용한 신뢰할 수 없는 Python·JavaScript 코드 실행 테스트에서는 다음 기능이 작동했다.3
기본 네트워크 차단
CPU·RAM 제한
실행 시간 제한
저장공간 할당량
읽기 전용 입력 마운트와 쓰기 가능 출력 마운트
--unprivileged옵션
이 테스트에서 콜드 스타트는 약 0.6~1.5초, 준비된 VM의 반복 실행은 약 50ms였다. 측정은 /dev/kvm을 제공하는 GitHub Actions Ubuntu 러너에서 수행됐으므로, 실제 지연 시간은 배포 환경에 따라 별도로 확인해야 한다.3
VM 밖의 신뢰 범위도 확인해야 한다
smolvm의 보안 경계는 게스트 VM만으로 완성되지 않는다. 호출한 호스트 사용자 계정과 호스트 OS, 하이퍼바이저 백엔드, libkrun, smolvm 자체가 모두 신뢰 기반에 포함된다.1
자격 증명 전달도 주의해야 한다. SSH 에이전트 전달은 개인 키를 게스트에 복사하지 않지만, VM이 실행되는 동안 게스트가 호스트 에이전트에 서명을 요청할 수 있게 한다. 따라서 마운트와 자격 증명은 편의 기능이 아니라 보안 권한으로 취급해야 한다.1
적용할 때의 판단 기준
격리 구성을 설계할 때는 다음 순서로 검토하는 것이 실용적이다.
네트워크는 기본적으로 닫고, 필요할 때만 대상 호스트를 제한해 연다.
입력과 출력을 분리하고, 호스트 마운트 범위를 최소화한다.
CPU, RAM, 실행 시간, 저장공간 제한을 함께 적용한다.
권한이 필요하지 않은 작업에는
--unprivileged를 사용한다.콜드 스타트와 웜 실행 시간을 실제 운영 환경에서 측정한다.
SSH 에이전트와 호스트 계정까지 포함해 전체 신뢰 범위를 점검한다.
요약: smolvm은 신뢰할 수 없는 Python 실행을 워크로드별 Linux VM으로 격리하면서 OCI 이미지와 실용적인 시작 속도를 활용할 수 있게 한다. 다만 실제 안전성은 네트워크, 마운트, 자원 제한, 자격 증명을 얼마나 최소 권한으로 설계하느냐에 달려 있다.
1GitHub - smol-machines/smolvm: Portable, lightweight, self-contained virtual machine.
2smol machines -- the same smol machine on your laptop, in the cloud, or self-hosted
3smolmachines / smolvm as a sandbox for untrusted Python & JavaScript
이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.
