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トレースポイントにアタッチし、すべてのシステムコールをアクティブなポリシーに対して評価する:
// 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コールをインターセプトする:
# 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
ネットワークセントリー
ネットワークセントリーはソケット操作にフックし、接続レベルでエージェントのネットワークアクセスを制御する:
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.YAMLポリシーファイルがセキュリティチームによって人間が読める形式で作成される
- 2.ポリシーコンパイラがYAMLを中間表現(IR)に変換する
- 3.NemotronポリシーバリデーターがIRの論理的な整合性と競合をチェックする
- 4.eBPFコンパイラが検証済みのバイトコードを生成し、カーネルにロードする
- 5.ランタイムベリファイアーがeBPFプログラムが終了し、メモリ安全であることを確認する
コンパイルパイプライン全体は一般的なポリシーセットで2秒未満で実行され、エージェントを再起動せずにポリシーをホットリロードできる。
# 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.エージェントが高リスクのsyscallを試みる(例:保護されたファイルへの書き込み、未承認のエンドポイントへの接続)
- 2.OpenShellのeBPFプログラムがエージェントプロセスにSIGSTOPを送信する
- 3.承認リクエストが生成され、設定されたチャネル(Slack、Teams、PagerDuty、メール)で送信される
- 4.オペレーターがリクエストのコンテキストを確認し、承認または拒否する
- 5.承認された場合、OpenShellがSIGCONTを送信してエージェントを再開する。拒否された場合、EPERMを返す
承認リクエストには完全なコンテキストが含まれる:
{
"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"
}
承認タイムアウトとデフォルトアクション
承認がタイムアウトした場合の動作をオペレーターが設定できる:
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のオーバーヘッドはエージェントワークロードの文脈では無視できるレベルである。
既存のサンドボックスとの比較
| 機能 | OpenShell | Docker/OCI | gVisor | Firecracker |
|---|---|---|---|---|
| 分離レベル | カーネル(eBPF) | 名前空間 | ユーザー空間カーネル | microVM |
| Syscallフィルタリング | ポリシー単位、ホットリロード | 静的seccomp | 完全インターポジション | 完全分離 |
| ネットワークポリシー | エージェント単位、L7対応 | iptables | iptables | iptables |
| 人間の承認 | 組み込み | なし | なし | なし |
| AI対応ポリシー | あり(Nemotron) | なし | なし | なし |
| オーバーヘッド | 約10マイクロ秒 | 約5マイクロ秒 | 約50マイクロ秒 | 約100ms起動 |
| GPUパススルー | ネイティブ | NVIDIA CTK | 限定的 | 限定的 |
OpenShellの主な差別化要因は、自然言語ポリシー、人間の承認ワークフロー、GPUアクセラレーテッドポリシー評価の組み込みサポートを備えた、AIエージェントワークロード向けにゼロから設計されていることである。
OpenShellを始める
OpenShellはNemoClawスタックの他の部分なしで、スタンドアロンで使用できる:
# 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スタックの実際のエンタープライズデプロイメントシナリオを紹介する。