NemoClawのsafe installerとポリシーboilerplateを用意した

March 30, 2026

NemoClawの公式インストーラーをそのまま使うにはいくつか懸念があったため、改修したインストーラーとポリシー・推論プロファイルの boilerplate を構成リポジトリとしてまとめた。セットアップ中に踏んだ罠もあわせて備忘。

NemoClaw / OpenShell ともに2026年3月時点でAlpha段階のため今後仕様が変わる可能性あり。

NemoClaw / OpenShell / OpenClaw の関係

コンポーネント 役割
OpenClaw 言わずとしれた Agent FW
OpenShell NVIDIA製サンドボックスランタイム(Rust実装)。network/filesystem/processのポリシーを強制
NemoClaw OpenClawをOpenShell内で安全に動かすための統合レイヤー

NemoClawはOpenClawをOpenShellの中に閉じ込め、すべての外部通信をポリシーで制御する。

推論リクエストは Agent → OpenShell Gateway → NVIDIA NIM APIintegrate.api.nvidia.com)の経路。

構成

nemoclaw-install-safe.sh          # インストーラー (後述)
Makefile                          # ライフサイクル管理
blueprint.yaml                    # 推論プロファイル + サンドボックスイメージ
sandboxes.json                    # サンドボックス登録状態 (参照専用)
policies/
  openclaw-sandbox.yaml           # ベースポリシー
  presets/                        # 外部サービス別プリセット (9種)
    discord.yaml / telegram.yaml / slack.yaml
    npm.yaml / pypi.yaml / docker.yaml
    huggingface.yaml / jira.yaml / outlook.yaml
scripts/
  apply.sh                        # ポリシー適用ヘルパー

NemoClawのソースツリー(~/.nemoclaw/source)とは分離しておき、make sync で設定をソースツリーにコピーする設計に変更。これにより構成をGit管理しつつ、本体の更新とは独立して設定を変更させる。

Installer

公式インストーラー(curl -fsSL https://www.nvidia.com/nemoclaw.sh | bash)は手軽だが色々気になったため nemoclaw-install-safe.sh として改修。

元の挙動 変更点
Node.js / Ollama を自動install 削除。事前にPATHに用意する前提
npm link でグローバルにリンク npm install --global --prefix ~/.nemoclaw/prefix に変更
クリーンアップなし trap ベースのクリーンアップ追加
アンinstall手段なし --uninstall フラグ追加
プレビュー手段なし --dry-run フラグ追加
cloneのコミット記録なし .install-commit にハッシュ記録
tarball検証なし SHA-256計算、実行ファイル・パストラバーサル・シンボリックリンク検査を追加
同時実行保護なし ロックファイルによる排他制御
既存install上書き バックアップ→失敗時自動復元

defaultではすべてのファイルを ~/.nemoclaw 配下に押し込む、場所は NEMOCLAW_HOME で変更可。システムディレクトリ(/usr 等)が指定された場合は拒否。

installの流れ

graph LR
  A[1. Node.js バージョン確認<br>v20以上必須] --> B[2. NemoClaw clone<br>GitHub → ~/.nemoclaw/source]
  B --> C[3. npm install --ignore-scripts<br>+ OpenClaw tarball検証]
  C --> D[4. CLI を ~/.nemoclaw/prefix に配置]
  D --> E[5. nemoclaw onboard<br>対話的セットアップ]

ライフサイクル管理

NemoClawの起動・停止・ポリシー適用を慣れた make で一元化。

コマンド 説明
make install safe installer 実行(clone → build → onboard)
make start Gatewayコンテナの状態を自動判定し起動。sync + nemoclaw start
make stop サービス停止 + Gatewayコンテナ停止(サンドボックスは保持)
make destroy サンドボックス + Gatewayコンテナ破棄
make apply 稼働中サンドボックスへの動的ポリシー適用(再起動不要)
make sync 設定をNemoClawソースツリーにコピー
make connect サンドボックスにシェル接続
make status / make logs 状態表示 / ログtail

make start は Gatewayコンテナの状態(running / exited / missing)を docker inspect で判定し、exited なら docker start → ready待ち → sync → nemoclaw start、running なら sync → nemoclaw start、missing ならエラー、の流れ。

あと今回はnvidia提供のサンドボックスイメージ ghcr.io/nvidia/openshell-community/sandboxes/openclaw:latest をそのまま使う。ここは特にかえる理由がないので。

ポリシー

ベースポリシー(openclaw-sandbox.yaml

deny by default で、明示的に許可したエンドポイントのみ到達可能。3つのセクションで構成される。

filesystemポリシー:

filesystem_policy:
  read_only:
    - /usr
    - /sandbox/.openclaw      # gateway設定の改ざん防止 (creation-locked)
  read_write:
    - /sandbox
    - /sandbox/.openclaw-data # エージェントが書き込む状態ファイル

read_only はサンドボックス作成時に固定される(creation-locked)。ライブサンドボックスでは追加のみ可能で削除はできない。

networkポリシー:

ポリシー名 用途 許可ホスト binaries制限
claude_code Claude API api.anthropic.com, statsig.anthropic.com, sentry.io /usr/local/bin/claude のみ
nvidia NVIDIA推論API integrate.api.nvidia.com, inference-api.nvidia.com claude, openclaw
github GitHub github.com, api.github.com gh, git, openclaw, curl, node
clawhub ClawHubスキルレジストリ clawhub.com openclaw のみ
openclaw_api OpenClaw認証 openclaw.ai openclaw のみ
openclaw_docs OpenClawドキュメント docs.openclaw.ai(GET only) openclaw のみ
npm_registry npmレジストリ registry.npmjs.org openclaw, npm
telegram Telegram Bot api.telegram.org(/bot*/** 制限なし
discord Discord discord.com, gateway.discord.gg, cdn.discordapp.com 制限なし

binaries フィールドが重要で、省略するとすべてのprocessがアクセス可能になるが、指定するとリストされたバイナリパスからのリクエストのみ許可される。OpenClawのWeb Fetchは内部で /usr/bin/curl を子processとして呼び出すため、エージェントからアクセスさせるには curlnodebinaries に含める必要がある。

プリセット

外部サービスごとのnetworkポリシーを policies/presets/ に分離してある。nemoclaw onboard 時に選択し有効化。

プリセット 対象サービス 許可ホスト
discord Discord Bot API discord.com, gateway.discord.gg, cdn.discordapp.com
telegram Telegram Bot API api.telegram.org(/bot*/** のみ)
slack Slack API slack.com, api.slack.com, hooks.slack.com
npm npm / Yarnレジストリ registry.npmjs.org, registry.yarnpkg.com
pypi Pythonパッケージ pypi.org, files.pythonhosted.org
docker Docker Hub / NVIDIA NGC registry-1.docker.io, auth.docker.io, nvcr.io, authn.nvidia.com
huggingface HF Hub / LFS / Inference huggingface.co, cdn-lfs.huggingface.co, api-inference.huggingface.co
jira Atlassian Jira *.atlassian.net, auth.atlassian.com, api.atlassian.com
outlook Microsoft Graph / Outlook graph.microsoft.com, login.microsoftonline.com, outlook.office365.com

プリセットの構造:

preset:
  name: telegram
  description: "Telegram Bot API access"

network_policies:
  telegram_bot:
    name: telegram_bot
    endpoints:
      - host: api.telegram.org
        port: 443
        protocol: rest
        enforcement: enforce
        tls: terminate
        rules:
          - allow: { method: GET, path: "/bot*/**" }
          - allow: { method: POST, path: "/bot*/**" }

推論プロファイル(blueprint.yaml

とりあえず nvidia に乗っかればOK。

プロファイル プロバイダー エンドポイント モデル
default nvidia integrate.api.nvidia.com/v1 nemotron-3-super-120b-a12b
ncp nvidia(動的解決) 動的 nemotron-3-super-120b-a12b
nim-local openai互換 nim-service.local:8000/v1 nemotron-3-super-120b-a12b
vllm openai互換 localhost:8000/v1 nemotron-3-nano-30b-a3b

default はNVIDIA API Keyでクラウドを使用、nim-local / vllm はローカル推論用。

モデルIDが割り振られるのだが命名規則があり {auth_provider}/{namespace}/{model} のような感じ。onboard で inference を選ぶとフルIDは inference/nvidia/nemotron-3-super-120b-a12bとなる。モデルの動的変更はこのIDを使って openshell inference update --model ...

セットアップ

make installopenclaw onboard が走る。設定はnemoclawなら一本道

設定 選択 理由
Model/auth provider inference OpenShellゲートウェイ経由でNVIDIA NIMにルーティング
Default model Keep current 前述の通り inference/nvidia/nemotron-3-super-120b-a12b

細かい仕様

networkアクセスの調整

policies/openclaw-sandbox.yaml でバイナリごとにpath指定する。

github:
  binaries:
    - { path: /usr/bin/gh }
    - { path: /usr/bin/git }
    - { path: /usr/local/bin/openclaw }  # 追加
    - { path: /usr/bin/curl }            # 追加
    - { path: /usr/local/bin/node }      # 追加

ログを見てブロック原因を特定するなら

openshell logs <name> --source sandbox --level debug --since 5m

ログの action=deny エントリに拒否理由とバイナリパスが記録されてる。binaries はリクエストを実際に発行するprocessのパスを指定する必要がある。

readonly制約

/sandbox/.openclawread_only(creation-locked)なので以下は通常はブロック

  • openclaw config set(一時ファイルを書けない)
  • MEMORY.md へのエージェント書き込み
  • ワークスペースファイルの更新

エラーは filesystem read_only path cannot be removed on a live sandbox などと出る。/sandbox/.openclawread_write に移す以外にライブで可能にする方法はない。

NemoClawの設計思想はエージェントが自身の設定や権限を変更できないようにする方向性らしい。MEMORY.mdくらいはできていいと思うのだが。。

スキルは手で入れる

openclaw skills list の結果は 3/51 ready で weatherとかしかない。

skillに要るCLIのinstall方法は

  • A. 実行中サンドボックスに直接install(make connect 後に npm install -g 等)。一時的なので destroy すると当然消える
  • B. サンドボックスイメージをカスタマイズ(Dockerfile)。

設定反映リファレンス

ファイル ホットリロード 反映方法
openclaw-sandbox.yaml できる make apply
blueprint.yaml できない make destroymake install
sandboxes.json 対象外 手動編集しない(参照専用)

make apply は内部で openshell policy set を呼び出す。サンドボックスの再起動は不要で、次のリクエストから新しいポリシーが適用される。モデル変更だけなら前述の openshell inference update --model ... で可能。

おわり

欲しい機能はほぼ揃ってるので事故を起こさないように少しずつ権限を与えていく(=育てていく)感じだが、仕組みちゃんとわかってないと使いこなすのほぼ無理では?ROI見合わない人が大半かも。

参考

GitHub:

  • OpenClaw – AIエージェントフレームワーク本体
  • NemoClaw – OpenShell統合レイヤー
  • OpenShell – サンドボックスランタイム
  • ClawHub – スキルレジストリ

ドキュメント:

関連Issue:

#llm #nvidia #sandbox #security #sre