technical openshell security kernel ebpf

OpenShell: NemoClaw를 뒷받침하는 보안 런타임

Eric Ericsson

Eric Ericsson

@eericsson

March 21, 2026

11 분

OpenShell: NemoClaw를 뒷받침하는 보안 런타임

OpenShell: NemoClaw를 뒷받침하는 보안 런타임

NemoClaw가 보안 스택이라면, OpenShell은 그 기반이다. NVIDIA의 보안 엔지니어링 팀이 지난 18개월간 개발한 OpenShell은 AI 에이전트 실행을 위한 커널 수준의 샌드박싱을 제공한다 — 완전히 침해된 에이전트라도 정의된 보안 경계 밖의 리소스에 접근할 수 없도록 보장한다.

이 글은 OpenShell의 아키텍처, 격리 메커니즘, 그리고 최소한의 성능 오버헤드로 보안 정책을 적용하는 방법에 대한 기술적 심층 분석이다.

왜 커널 수준의 격리인가?

전통적인 애플리케이션 샌드박싱 — 컨테이너, VM, 프로세스 수준 격리 — 은 예측 가능하게 동작하는 소프트웨어를 위해 설계되었다. AI 에이전트는 근본적으로 다르다. 런타임에 자체 실행 계획을 생성하고, 외부 시스템과 상호작용하는 도구 호출을 수행하며, 어떤 테스트 스위트도 예상하지 못한 새로운 동작을 만들어낼 수 있다.

이 예측 불가능성은 가능한 가장 낮은 수준인 커널에서 작동하는 보안 모델을 요구한다. OpenShell은 에이전트 프로세스가 수행하는 모든 시스템 콜을 가로채고, 활성 보안 정책에 따라 분류하며, 콜이 커널에 도달하기 전에 허용/거부 결정을 내린다.

Agent Process
     │
     ▼
OpenShell eBPF Layer  ←── Policy Engine
     │
     ├── ALLOW → System Call → Kernel
     │
     ├── DENY → Error returned to agent
     │
     └── ESCALATE → Human approval queue

eBPF: OpenShell을 뒷받침하는 기술

OpenShell은 eBPF(extended Berkeley Packet Filter) 위에 구축되어 있다. 이는 커널 자체를 수정하지 않고도 커널 공간에서 커스텀 프로그램을 실행할 수 있게 해주는 Linux 커널 기술이다. NVIDIA 팀은 AI 에이전트 워크로드에 특화되어 최적화된 eBPF 프로그램 스위트를 작성했다:

Syscall 인터셉터

syscall 인터셉터는 sys_enter 트레이스포인트에 연결되어 모든 시스템 콜을 활성 정책에 대해 평가한다:

c
// Simplified OpenShell eBPF syscall interceptor
SEC("tracepoint/raw_syscalls/sys_enter")
int openshell_syscall_enter(struct trace_event_raw_sys_enter *ctx) {
    u32 pid = bpf_get_current_pid_tgid() >> 32;
    struct sandbox_policy *policy = bpf_map_lookup_elem(&sandbox_policies, &pid);

    if (!policy)
        return 0;  // Not a sandboxed process

    long syscall_nr = ctx->id;
    int decision = evaluate_policy(policy, syscall_nr, ctx->args);

    if (decision == DENY) {
        // Send event to userspace audit log
        emit_security_event(pid, syscall_nr, DENY);
        // Override return value to -EPERM
        bpf_override_return(ctx, -EPERM);
    } else if (decision == ESCALATE) {
        // Pause the process and notify approval queue
        emit_approval_request(pid, syscall_nr, ctx->args);
        send_signal(pid, SIGSTOP);
    }

    return 0;
}

파일 시스템 가드

파일 시스템 가드는 에이전트가 접근할 수 있는 파일과 디렉토리를 제한한다. VFS(가상 파일 시스템) 작업에서 동작하며, open, read, write, unlink, rename 호출을 가로챈다:

yaml
# Filesystem policy for a customer support agent
filesystem:
  # Agent can read its own configuration
  - path: "/etc/nemoclaw/agent.yaml"
    permissions: [read]

  # Agent can read/write to its workspace
  - path: "/var/nemoclaw/workspace/**"
    permissions: [read, write, create]

  # Agent can read shared data
  - path: "/var/nemoclaw/shared/**"
    permissions: [read]

  # Everything else is denied by default
  defaultAction: deny

네트워크 센트리

네트워크 센트리는 소켓 작업에 후킹하여 연결 수준에서 에이전트 네트워크 접근을 제어한다:

c
SEC("cgroup/connect4")
int openshell_connect4(struct bpf_sock_addr *ctx) {
    u32 pid = bpf_get_current_pid_tgid() >> 32;
    struct network_policy *policy = bpf_map_lookup_elem(&net_policies, &pid);

    if (!policy)
        return 1;  // Allow non-sandboxed processes

    __be32 dst_ip = ctx->user_ip4;
    __be16 dst_port = ctx->user_port;

    if (!is_allowed_destination(policy, dst_ip, dst_port)) {
        emit_security_event(pid, NETWORK_BLOCKED, dst_ip, dst_port);
        return 0;  // Block connection
    }

    return 1;  // Allow connection
}

정책 적용 아키텍처

OpenShell 정책은 최대 적용 속도를 위해 eBPF 바이트코드로 컴파일된다. 컴파일 파이프라인은 다음과 같이 작동한다:

  1. 1.YAML 정책 파일이 보안 팀에 의해 사람이 읽을 수 있는 형식으로 작성된다
  2. 2.정책 컴파일러가 YAML을 중간 표현(IR)으로 변환한다
  3. 3.Nemotron 정책 검증기가 IR의 논리적 일관성과 충돌을 검사한다
  4. 4.eBPF 컴파일러가 검증된 바이트코드를 생성하여 커널에 로드한다
  5. 5.런타임 검증기가 eBPF 프로그램이 종료하고 메모리 안전한지 확인한다

전체 컴파일 파이프라인은 일반적인 정책 세트에 대해 2초 미만으로 실행되며, 에이전트를 재시작하지 않고도 정책을 핫 리로드할 수 있다.

bash
# Compile and load a policy
nemoclaw policy compile policies/customer-support.yaml
nemoclaw policy load customer-support

# Hot-reload a modified policy (no agent restart required)
nemoclaw policy reload customer-support

# Verify policy is active
nemoclaw policy status
# Output:
# POLICY              STATUS    LOADED AT            RULES
# customer-support    active    2026-03-19 14:30:01  47
# network-default     active    2026-03-19 14:30:01  12
# filesystem-strict   active    2026-03-19 14:30:01  23

운영자 승인 워크플로

OpenShell의 가장 독특한 기능 중 하나는 내장된 운영자 승인 시스템이다. 에이전트가 고위험으로 분류된 동작을 시도하면, OpenShell은 에이전트 실행을 일시 정지하고 승인 요청을 사람 운영자에게 라우팅한다.

승인 작동 방식

  1. 1.에이전트가 고위험 syscall을 시도한다 (예: 보호된 파일에 쓰기, 미승인 엔드포인트에 연결)
  2. 2.OpenShell의 eBPF 프로그램이 에이전트 프로세스에 SIGSTOP을 보낸다
  3. 3.승인 요청이 생성되어 구성된 채널(Slack, Teams, PagerDuty, 이메일)을 통해 전송된다
  4. 4.운영자가 요청 컨텍스트를 검토하고 승인 또는 거부한다
  5. 5.승인되면 OpenShell이 SIGCONT를 보내 에이전트를 재개한다; 거부되면 EPERM을 반환한다

승인 요청에는 전체 컨텍스트가 포함된다:

json
{
  "request_id": "apr-2026031914-00042",
  "agent": "customer-support-agent-01",
  "action": "email.send",
  "target": "[email protected]",
  "context": {
    "ticket_id": "TKT-12345",
    "customer_name": "[REDACTED]",
    "reason": "Agent wants to send a follow-up email to the customer regarding their refund request",
    "email_preview": "Dear Customer, your refund of $250 has been processed..."
  },
  "risk_level": "medium",
  "policy_rule": "external-communication-requires-approval",
  "timestamp": "2026-03-19T14:30:42Z"
}

승인 타임아웃 및 기본 동작

승인이 타임아웃될 때의 동작을 운영자가 구성할 수 있다:

yaml
approvalConfig:
  timeout: 15m
  onTimeout: deny          # deny | allow | escalate
  onEscalate:
    target: security-team
    channel: pagerduty
  maxPendingApprovals: 10  # Queue limit per agent
  autoApprove:
    # Automatically approve if the same action was approved
    # 3 times in the past 24 hours for this agent
    repeatThreshold: 3
    repeatWindow: 24h

성능 특성

OpenShell은 레이턴시가 중요한 프로덕션 워크로드를 위해 설계되었다. 다음은 DGX Spark에서의 측정된 오버헤드이다:

작업오버헤드
Syscall 가로채기 (허용)8마이크로초
Syscall 가로채기 (거부)12마이크로초
파일 시스템 검사15마이크로초
네트워크 연결 검사20마이크로초
정책 핫 리로드500밀리초 미만
승인 왕복 (Slack)2~30초 (사람에 따라 다름)

비교하면, 일반적인 LLM 추론 호출은 500ms~5000ms가 걸리므로, OpenShell의 오버헤드는 에이전트 워크로드 맥락에서 무시할 수 있는 수준이다.

기존 샌드박싱과의 비교

기능OpenShellDocker/OCIgVisorFirecracker
격리 수준커널 (eBPF)네임스페이스사용자 공간 커널microVM
Syscall 필터링정책별, 핫 리로드정적 seccomp전체 인터포지션완전 격리
네트워크 정책에이전트별, L7 인식iptablesiptablesiptables
사람 승인내장없음없음없음
AI 인식 정책있음 (Nemotron)없음없음없음
오버헤드~10마이크로초~5마이크로초~50마이크로초~100ms 시작
GPU 패스스루네이티브NVIDIA CTK제한적제한적

OpenShell의 핵심 차별화 요소는 자연어 정책, 사람 승인 워크플로, GPU 가속 정책 평가를 위한 내장 지원을 갖추고 AI 에이전트 워크로드를 위해 처음부터 설계되었다는 것이다.

OpenShell 시작하기

OpenShell은 NemoClaw 스택의 나머지 부분 없이 독립적으로 사용할 수 있다:

bash
# Install OpenShell standalone
curl -fsSL https://github.com/NVIDIA/OpenShell | bash

# Create a minimal sandbox policy
cat > my-policy.yaml << 'EOF'
apiVersion: openshell.nvidia.com/v1
kind: SandboxPolicy
metadata:
  name: my-first-sandbox
spec:
  isolation:
    network: restricted
    filesystem: workspace-only
    syscalls: minimal
EOF

# Run any process inside the sandbox
openshell run --policy my-policy.yaml -- python my_agent.py

OpenShell은 Apache 2.0 라이선스의 오픈소스이며 GitHub의 nvidia/openshell에서 확인할 수 있다. 다음 글에서는 전체 NemoClaw 스택의 실제 엔터프라이즈 배포 시나리오를 살펴본다.

소식 받기

NemoClaw 새 버전, 보안 공지, 에코시스템 소식을 전해드립니다. 스팸 없고 언제든 구독 취소 가능.