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(仮想ファイルシステム)操作で動作し、openreadwriteunlinkrenameコールをインターセプトする:

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の最も特徴的な機能の1つは、組み込みのオペレーター承認システムである。エージェントが高リスクに分類されるアクションを試みると、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 のリリース、セキュリティアドバイザリ、エコシステムのニュースをお届けします。スパムなし、いつでも解除 OK。