Gateway

セキュリティ

まずスコープ: 個人アシスタントのセキュリティモデル

OpenClaw のセキュリティガイダンスは、個人アシスタントのデプロイを前提としています。つまり、1 つの信頼されたオペレーター境界に、複数のエージェントが存在し得るモデルです。

  • サポートされるセキュリティ姿勢: Gateway ごとに 1 つのユーザー/信頼境界(境界ごとに 1 つの OS ユーザー/ホスト/VPS が望ましい)。
  • サポートされるセキュリティ境界ではないもの: 相互に信頼していない、または敵対的なユーザーが使用する 1 つの共有 Gateway/エージェント。
  • 敵対的ユーザーの分離が必要な場合は、信頼境界ごとに分割してください(別々の Gateway + 認証情報、理想的には別々の OS ユーザー/ホスト)。
  • 複数の信頼できないユーザーが 1 つのツール有効化済みエージェントにメッセージを送れる場合、その全員がそのエージェントの同じ委任済みツール権限を共有しているものとして扱ってください。

このページでは、そのモデル内での強化について説明します。1 つの共有 Gateway 上で敵対的マルチテナント分離が実現されるとは主張しません。

クイックチェック: openclaw security audit

関連項目: 形式検証(セキュリティモデル)

定期的に実行してください(特に設定を変更した後やネットワーク面を公開した後):

openclaw security audit
openclaw security audit --deep
openclaw security audit --fix
openclaw security audit --json

security audit --fix は意図的に範囲を狭く保っています。一般的な開放グループ ポリシーを許可リストに切り替え、logging.redactSensitive: "tools" を復元し、 state/config/include-file の権限を厳格化し、Windows 上で実行されている場合は POSIX chmod の代わりに Windows ACL リセットを使用します。

一般的な問題(Gateway 認証の露出、ブラウザー制御の露出、昇格許可リスト、ファイルシステム権限、緩い exec 承認、オープンチャンネルでのツール露出)を検出します。

OpenClaw は製品であると同時に実験でもあります。フロンティアモデルの振る舞いを、実際のメッセージング面や実際のツールに接続するものです。「完全に安全」な構成は存在しません。 目標は、次の点を意識的に扱うことです。

  • 誰がボットと会話できるか
  • ボットがどこで動作を許可されているか
  • ボットが何に触れられるか

まずは動作する最小のアクセス権から始め、確信が高まるにつれて広げてください。

デプロイとホストの信頼

OpenClaw は、ホストと設定境界が信頼されていることを前提とします。

  • 誰かが Gateway ホストの state/config(openclaw.json を含む ~/.openclaw)を変更できる場合、その人は信頼されたオペレーターとして扱ってください。
  • 相互に信頼していない、または敵対的な複数のオペレーターに対して 1 つの Gateway を実行することは、推奨される構成ではありません
  • 信頼が混在するチームでは、別々の Gateway(または最低限、別々の OS ユーザー/ホスト)で信頼境界を分割してください。
  • 推奨されるデフォルト: マシン/ホスト(または VPS)ごとに 1 ユーザー、そのユーザー用に 1 つの Gateway、その Gateway 内に 1 つ以上のエージェント。
  • 1 つの Gateway インスタンス内では、認証済みオペレーターアクセスは信頼された制御プレーンのロールであり、ユーザーごとのテナントロールではありません。
  • セッション識別子(sessionKey、セッション ID、ラベル)はルーティングセレクターであり、認可トークンではありません。
  • 複数の人が 1 つのツール有効化済みエージェントにメッセージを送れる場合、その全員が同じ権限セットを操作できます。ユーザーごとのセッション/メモリ分離はプライバシーには役立ちますが、共有エージェントをユーザーごとのホスト認可に変換するものではありません。

安全なファイル操作

OpenClaw は、ルート境界付きファイルアクセス、アトミック書き込み、アーカイブ展開、一時ワークスペース、シークレットファイルヘルパーに @openclaw/fs-safe を使用します。OpenClaw は fs-safe のオプション POSIX Python ヘルパーをデフォルトでオフにしています。追加の fd 相対ミューテーション強化が必要で、Python ランタイムをサポートできる場合にのみ、OPENCLAW_FS_SAFE_PYTHON_MODE=auto または require を設定してください。

詳細: 安全なファイル操作

共有 Slack ワークスペース: 実際のリスク

「Slack の全員がボットにメッセージを送れる」場合、中核的なリスクは委任済みツール権限です。

  • 許可された送信者は誰でも、エージェントのポリシー内でツール呼び出し(exec、ブラウザー、ネットワーク/ファイルツール)を誘発できます。
  • ある送信者からのプロンプト/コンテンツインジェクションにより、共有 state、デバイス、出力に影響するアクションが発生する可能性があります。
  • 1 つの共有エージェントが機密の認証情報/ファイルを持っている場合、許可された送信者は誰でもツール使用を通じて流出を引き起こせる可能性があります。

チームワークフローには、最小限のツールを持つ別々のエージェント/Gateway を使用してください。個人データを扱うエージェントは非公開に保ってください。

会社共有エージェント: 許容されるパターン

これは、そのエージェントを使用する全員が同じ信頼境界内にあり(たとえば 1 つの会社チーム)、エージェントの範囲が厳密に業務に限定されている場合に許容されます。

  • 専用のマシン/VM/コンテナーで実行する。
  • そのランタイム用に専用の OS ユーザー + 専用のブラウザー/プロファイル/アカウントを使用する。
  • そのランタイムを個人の Apple/Google アカウントや、個人のパスワードマネージャー/ブラウザープロファイルにサインインさせない。

同じランタイム上で個人 ID と会社 ID を混在させると、分離が崩れ、個人データ露出のリスクが高まります。

Gateway と Node の信頼概念

Gateway と Node は、役割が異なる 1 つのオペレーター信頼ドメインとして扱ってください。

  • Gateway は制御プレーンでありポリシー面です(gateway.auth、ツールポリシー、ルーティング)。
  • Node は、その Gateway にペアリングされたリモート実行面です(コマンド、デバイスアクション、ホストローカル機能)。
  • Gateway に認証された呼び出し元は、Gateway スコープで信頼されます。ペアリング後、Node のアクションはその Node 上の信頼されたオペレーターアクションになります。
  • オペレータースコープレベルと承認時チェックは、 オペレータースコープ にまとめられています。
  • 共有 gateway トークン/パスワードで認証された直接のループバックバックエンドクライアントは、 ユーザーデバイス ID を提示せずに内部制御プレーン RPC を実行できます。これはリモートまたはブラウザーペアリングのバイパスではありません。ネットワーク クライアント、Node クライアント、デバイストークンクライアント、明示的なデバイス ID は、 引き続きペアリングとスコープアップグレードの強制を通過します。
  • sessionKey はルーティング/コンテキスト選択であり、ユーザーごとの認証ではありません。
  • Exec 承認(許可リスト + 確認)はオペレーター意図のガードレールであり、敵対的マルチテナント分離ではありません。
  • 信頼された単一オペレーター構成における OpenClaw の製品デフォルトでは、gateway/node 上のホスト exec は承認プロンプトなしで許可されます(厳格化しない限り security="full"ask="off")。そのデフォルトは意図的な UX であり、それ自体が脆弱性ではありません。
  • Exec 承認は、正確なリクエストコンテキストとベストエフォートの直接ローカルファイルオペランドに結び付けられます。すべてのランタイム/インタープリターローダーパスを意味論的にモデル化するものではありません。強い境界にはサンドボックス化とホスト分離を使用してください。

敵対的ユーザーの分離が必要な場合は、OS ユーザー/ホストごとに信頼境界を分割し、別々の Gateway を実行してください。

信頼境界マトリクス

リスクをトリアージするときのクイックモデルとして使用してください。

境界または制御 意味 よくある誤読
gateway.auth(token/password/trusted-proxy/device auth) Gateway API への呼び出し元を認証する 「安全にするにはすべてのフレームにメッセージごとの署名が必要」
sessionKey コンテキスト/セッション選択用のルーティングキー 「セッションキーはユーザー認証境界である」
プロンプト/コンテンツのガードレール モデル悪用リスクを低減する 「プロンプトインジェクションだけで認証バイパスが証明される」
canvas.eval / ブラウザー evaluate 有効化された場合の意図的なオペレーター機能 「あらゆる JS eval プリミティブはこの信頼モデルでは自動的に脆弱性である」
ローカル TUI ! シェル 明示的にオペレーターがトリガーするローカル実行 「ローカルシェルの便利コマンドはリモートインジェクションである」
Node ペアリングと Node コマンド ペアリング済みデバイス上のオペレーターレベルのリモート実行 「リモートデバイス制御はデフォルトで信頼できないユーザーアクセスとして扱うべき」
gateway.nodes.pairing.autoApproveCidrs オプトインの信頼済みネットワーク Node 登録ポリシー 「デフォルト無効の許可リストは自動ペアリング脆弱性である」

設計上、脆弱性ではないもの

スコープ外となる一般的な報告

これらのパターンはよく報告されますが、実際の境界バイパスが示されない限り、 通常は対応不要としてクローズされます。

  • ポリシー、認証、またはサンドボックスのバイパスを伴わない、プロンプトインジェクションのみの連鎖。
  • 1 つの共有ホストまたは config 上で敵対的マルチテナント運用を想定する主張。
  • 通常のオペレーター読み取りパスアクセス(たとえば sessions.list / sessions.preview / chat.history)を、共有 Gateway 構成における IDOR と分類する主張。
  • localhost のみのデプロイに関する報告(たとえばループバックのみの Gateway に対する HSTS)。
  • この repo に存在しないインバウンドパスに対する Discord インバウンド Webhook 署名の報告。
  • system.run に対して、Node ペアリングメタデータを隠れた第 2 のコマンドごとの 承認レイヤーとして扱う報告。実際の実行境界は、依然として Gateway のグローバル Node コマンドポリシーと Node 自身の exec 承認です。
  • 設定済みの gateway.nodes.pairing.autoApproveCidrs を、それ自体で 脆弱性として扱う報告。この設定はデフォルトで無効であり、 明示的な CIDR/IP エントリーが必要で、要求されたスコープがない初回の role: node ペアリングにのみ適用されます。また、operator/browser/Control UI、 WebChat、ロールアップグレード、スコープアップグレード、メタデータ変更、公開鍵変更、 または同一ホストのループバック trusted-proxy ヘッダーパスを自動承認しません。ただし、ループバック trusted-proxy auth が明示的に有効化されている場合を除きます。
  • sessionKey を認証トークンとして扱う「ユーザーごとの認可の欠如」に関する報告。

60 秒でできる強化ベースライン

まずこのベースラインを使用し、その後、信頼済みエージェントごとに必要なツールを選択的に再有効化してください。

{
  gateway: {
    mode: "local",
    bind: "loopback",
    auth: { mode: "token", token: "replace-with-long-random-token" },
  },
  session: {
    dmScope: "per-channel-peer",
  },
  tools: {
    profile: "messaging",
    deny: ["group:automation", "group:runtime", "group:fs", "sessions_spawn", "sessions_send"],
    fs: { workspaceOnly: true },
    exec: { security: "deny", ask: "always" },
    elevated: { enabled: false },
  },
  channels: {
    whatsapp: { dmPolicy: "pairing", groups: { "*": { requireMention: true } } },
  },
}

これにより Gateway はローカル専用に保たれ、DM は分離され、制御プレーン/ランタイムツールはデフォルトで無効化されます。

共有受信箱のクイックルール

複数の人がボットに DM できる場合:

  • session.dmScope: "per-channel-peer"(またはマルチアカウントチャンネルでは "per-account-channel-peer")を設定します。
  • dmPolicy: "pairing" または厳格な許可リストを維持します。
  • 共有 DM と広範なツールアクセスを絶対に組み合わせないでください。
  • これは協力的な共有受信箱を強化しますが、ユーザーがホスト/config 書き込みアクセスを共有する場合の敵対的共同テナント分離として設計されたものではありません。

コンテキスト可視性モデル

OpenClaw は 2 つの概念を分離します。

  • トリガー認可: 誰がエージェントをトリガーできるか(dmPolicygroupPolicy、許可リスト、メンションゲート)。
  • コンテキスト可視性: モデル入力に注入される補足コンテキスト(返信本文、引用テキスト、スレッド履歴、転送メタデータ)。

許可リストはトリガーとコマンド認可をゲートします。contextVisibility 設定は、補足コンテキスト(引用返信、スレッドルート、取得された履歴)をどのようにフィルターするかを制御します。

  • contextVisibility: "all" (デフォルト) は、受信した補足コンテキストをそのまま保持します。
  • contextVisibility: "allowlist" は、有効な許可リストチェックで許可された送信者に補足コンテキストを絞り込んで送信します。
  • contextVisibility: "allowlist_quote"allowlist と同様に動作しますが、明示的に引用された返信を1件だけ保持します。

contextVisibility はチャネル単位またはルーム/会話単位で設定します。設定の詳細は グループチャット を参照してください。

アドバイザリートリアージのガイダンス:

  • 「モデルが許可リストにない送信者からの引用または履歴テキストを見られる」ことだけを示す主張は、contextVisibility で対処できる強化項目であり、それ自体では認証やサンドボックス境界のバイパスではありません。
  • セキュリティ上の影響があるとみなすには、レポートで引き続き信頼境界のバイパス (認証、ポリシー、サンドボックス、承認、または別の文書化された境界) を実証する必要があります。

監査で確認する内容 (概要)

  • 受信アクセス (DM ポリシー、グループポリシー、許可リスト): 見知らぬ相手が bot を起動できるか?
  • ツールの影響範囲 (昇格ツール + 開放ルーム): プロンプトインジェクションがシェル/ファイル/ネットワーク操作につながる可能性があるか?
  • 実行承認のドリフト (security=fullautoAllowSkillsstrictInlineEval なしのインタープリター許可リスト): ホスト実行のガードレールは、想定どおりに機能し続けているか?
    • security="full" は広範な姿勢の警告であり、バグの証明ではありません。これは信頼済みの個人アシスタント構成向けに選ばれたデフォルトです。脅威モデルで承認や許可リストのガードレールが必要な場合にのみ厳格化してください。
  • ネットワーク露出 (Gateway のバインド/認証、Tailscale Serve/Funnel、弱い/短い認証トークン)。
  • ブラウザー制御の露出 (リモートノード、リレーポート、リモート CDP エンドポイント)。
  • ローカルディスクの衛生状態 (権限、シンボリックリンク、設定の include、「同期フォルダー」パス)。
  • Plugins (plugins が明示的な許可リストなしで読み込まれる)。
  • ポリシードリフト/誤設定 (サンドボックス Docker 設定が構成されているがサンドボックスモードがオフ、マッチングが厳密なコマンド名のみ (例: system.run) でシェルテキストを検査しないため gateway.nodes.denyCommands パターンが無効、危険な gateway.nodes.allowCommands エントリ、グローバルな tools.profile="minimal" がエージェント単位のプロファイルで上書きされている、plugin 所有ツールが緩いツールポリシーの下で到達可能)。
  • ランタイム期待値のドリフト (たとえば tools.exec.host のデフォルトが現在 auto なのに暗黙の exec がまだ sandbox を意味すると仮定している、またはサンドボックスモードがオフなのに tools.exec.host="sandbox" を明示的に設定している)。
  • モデルの衛生状態 (設定済みモデルがレガシーに見える場合に警告。強制ブロックではない)。

--deep を実行すると、OpenClaw はベストエフォートのライブ Gateway プローブも試行します。

認証情報ストレージマップ

アクセスを監査する場合やバックアップ対象を判断する場合に使用してください:

  • WhatsApp: ~/.openclaw/credentials/whatsapp/<accountId>/creds.json
  • Telegram bot トークン: config/env または channels.telegram.tokenFile (通常ファイルのみ。シンボリックリンクは拒否)
  • Discord bot トークン: config/env または SecretRef (env/file/exec プロバイダー)
  • Slack トークン: config/env (channels.slack.*)
  • ペアリング許可リスト:
    • ~/.openclaw/credentials/<channel>-allowFrom.json (デフォルトアカウント)
    • ~/.openclaw/credentials/<channel>-<accountId>-allowFrom.json (非デフォルトアカウント)
  • モデル認証プロファイル: ~/.openclaw/agents/<agentId>/agent/auth-profiles.json
  • Codex ランタイム状態: ~/.openclaw/agents/<agentId>/agent/codex-home/
  • ファイル裏付けの secrets ペイロード (任意): ~/.openclaw/secrets.json
  • レガシー OAuth インポート: ~/.openclaw/credentials/oauth.json

セキュリティ監査チェックリスト

監査で検出結果が出力されたら、次の優先順位として扱ってください:

  1. 「開放」状態 + ツール有効: まず DM/グループをロックダウン (ペアリング/許可リスト) し、その後ツールポリシー/サンドボックスを厳格化します。
  2. 公開ネットワーク露出 (LAN バインド、Funnel、認証なし): 直ちに修正します。
  3. ブラウザー制御のリモート露出: オペレーターアクセスと同様に扱います (tailnet のみ、ノードを意図的にペアリング、公開露出を避ける)。
  4. 権限: state/config/credentials/auth がグループ/全ユーザー読み取り可能になっていないことを確認します。
  5. Plugins: 明示的に信頼するものだけを読み込みます。
  6. モデル選択: ツール付き bot には、現代的で指示に対して強化されたモデルを優先します。

セキュリティ監査用語集

各監査検出結果は、構造化された checkId (例: gateway.bind_no_auth または tools.exec.security_full_configured) でキー付けされます。一般的な critical 重大度クラス:

  • fs.* - state、config、credentials、auth プロファイルのファイルシステム権限。
  • gateway.* - バインドモード、認証、Tailscale、Control UI、信頼済みプロキシ設定。
  • hooks.*browser.*sandbox.*tools.exec.* - サーフェス単位の強化。
  • plugins.*skills.* - plugin/skill サプライチェーンおよびスキャン検出結果。
  • security.exposure.* - アクセスポリシーとツールの影響範囲が交差する横断的チェック。

重大度レベル、修正キー、自動修正対応を含む完全なカタログは セキュリティ監査チェック を参照してください。

HTTP 経由の Control UI

Control UI がデバイス ID を生成するには セキュアコンテキスト (HTTPS または localhost) が必要です。 gateway.controlUi.allowInsecureAuth はローカル互換性用のトグルです:

  • localhost では、ページが非セキュアな HTTP 経由で読み込まれた場合に、デバイス ID なしで Control UI 認証を許可します。
  • ペアリングチェックをバイパスしません。
  • リモート (非 localhost) のデバイス ID 要件を緩和しません。

HTTPS (Tailscale Serve) を優先するか、127.0.0.1 で UI を開いてください。

ブレークグラスシナリオ専用として、gateway.controlUi.dangerouslyDisableDeviceAuth はデバイス ID チェックを完全に無効化します。これは重大なセキュリティ低下です。 積極的にデバッグ中で、すぐに戻せる場合を除き、オフのままにしてください。

これらの危険なフラグとは別に、gateway.auth.mode: "trusted-proxy" が成功すると、 デバイス ID なしで オペレーター の Control UI セッションを許可できます。これは 意図された認証モードの動作であり、allowInsecureAuth の近道ではありません。また、 ノードロールの Control UI セッションには引き続き拡張されません。

この設定が有効な場合、openclaw security audit は警告します。

非セキュアまたは危険なフラグの概要

openclaw security audit は、既知の非セキュア/危険なデバッグスイッチが有効になっている場合に config.insecure_or_dangerous_flags を出します。production ではこれらを未設定のままにしてください。

Flags tracked by the audit today
  • gateway.controlUi.allowInsecureAuth=true
  • gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true
  • gateway.controlUi.dangerouslyDisableDeviceAuth=true
  • hooks.gmail.allowUnsafeExternalContent=true
  • hooks.mappings[<index>].allowUnsafeExternalContent=true
  • tools.exec.applyPatch.workspaceOnly=false
  • plugins.entries.acpx.config.permissionMode=approve-all
All `dangerous*` / `dangerously*` keys in the config schema

Control UI とブラウザー:

  • gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback
  • gateway.controlUi.dangerouslyDisableDeviceAuth
  • browser.ssrfPolicy.dangerouslyAllowPrivateNetwork

チャネル名マッチング (同梱および plugin チャネル。該当する場合は accounts.<accountId> ごとにも利用可能):

  • channels.discord.dangerouslyAllowNameMatching
  • channels.slack.dangerouslyAllowNameMatching
  • channels.googlechat.dangerouslyAllowNameMatching
  • channels.msteams.dangerouslyAllowNameMatching
  • channels.synology-chat.dangerouslyAllowNameMatching (plugin チャネル)
  • channels.synology-chat.dangerouslyAllowInheritedWebhookPath (plugin チャネル)
  • channels.zalouser.dangerouslyAllowNameMatching (plugin チャネル)
  • channels.irc.dangerouslyAllowNameMatching (plugin チャネル)
  • channels.mattermost.dangerouslyAllowNameMatching (plugin チャネル)

ネットワーク露出:

  • channels.telegram.network.dangerouslyAllowPrivateNetwork (アカウントごとにも適用)

サンドボックス Docker (デフォルト + エージェント単位):

  • agents.defaults.sandbox.docker.dangerouslyAllowReservedContainerTargets
  • agents.defaults.sandbox.docker.dangerouslyAllowExternalBindSources
  • agents.defaults.sandbox.docker.dangerouslyAllowContainerNamespaceJoin

リバースプロキシ設定

Gateway をリバースプロキシ (nginx、Caddy、Traefik など) の背後で実行する場合は、 転送されたクライアント IP を正しく扱うために gateway.trustedProxies を設定します。

Gateway が trustedProxies含まれていない アドレスからのプロキシヘッダーを検出した場合、その接続をローカルクライアントとして扱いません。gateway 認証が無効な場合、それらの接続は拒否されます。これにより、プロキシされた接続が localhost から来たように見えて自動的に信頼される認証バイパスを防ぎます。

gateway.trustedProxiesgateway.auth.mode: "trusted-proxy" にも供給されますが、この認証モードはより厳格です:

  • trusted-proxy 認証は ループバック送信元プロキシに対してデフォルトでフェイルクローズ します
  • 同一ホストのループバックリバースプロキシは、ローカルクライアント検出と転送 IP 処理に gateway.trustedProxies を使用できます
  • 同一ホストのループバックリバースプロキシが gateway.auth.mode: "trusted-proxy" を満たせるのは、gateway.auth.trustedProxy.allowLoopback = true の場合だけです。それ以外の場合はトークン/パスワード認証を使用してください
gateway:
  trustedProxies:
    - "10.0.0.1" # reverse proxy IP
  # Optional. Default false.
  # Only enable if your proxy cannot provide X-Forwarded-For.
  allowRealIpFallback: false
  auth:
    mode: password
    password: ${OPENCLAW_GATEWAY_PASSWORD}

trustedProxies が設定されている場合、Gateway は X-Forwarded-For を使用してクライアント IP を判定します。gateway.allowRealIpFallback: true が明示的に設定されていない限り、X-Real-IP はデフォルトで無視されます。

信頼済みプロキシヘッダーによって、ノードデバイスのペアリングが自動的に信頼されるわけではありません。 gateway.nodes.pairing.autoApproveCidrs は、デフォルトで無効な別個の オペレーターポリシーです。有効な場合でも、ループバック送信元の trusted-proxy ヘッダーパスは、 ローカル呼び出し元がそれらのヘッダーを偽造できるため、ノード自動承認から除外されます。 これには、ループバック trusted-proxy 認証が明示的に有効化されている場合も含まれます。

望ましいリバースプロキシ動作 (受信した転送ヘッダーを上書き):

proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Real-IP $remote_addr;

望ましくないリバースプロキシ動作 (信頼されていない転送ヘッダーを追加/保持):

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

HSTS とオリジンに関する注意

  • OpenClaw gateway はローカル/local loopback 優先です。リバースプロキシで TLS を終端する場合は、そこでプロキシ向け HTTPS ドメインに HSTS を設定してください。
  • gateway 自体が HTTPS を終端する場合は、gateway.http.securityHeaders.strictTransportSecurity を設定して OpenClaw レスポンスから HSTS ヘッダーを出力できます。
  • 詳細なデプロイガイダンスは 信頼済みプロキシ認証 にあります。
  • 非ループバックの Control UI デプロイでは、gateway.controlUi.allowedOrigins がデフォルトで必要です。
  • gateway.controlUi.allowedOrigins: ["*"] は明示的な全許可のブラウザーオリジンポリシーであり、強化されたデフォルトではありません。厳密に管理されたローカルテスト以外では避けてください。
  • ループバック上のブラウザーオリジン認証失敗は、一般的なループバック例外が有効な場合でも引き続きレート制限されますが、ロックアウトキーは共有 localhost バケットではなく、正規化された Origin 値ごとにスコープされます。
  • gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true は Host ヘッダーのオリジンフォールバックモードを有効にします。危険な、オペレーター選択のポリシーとして扱ってください。
  • DNS リバインディングとプロキシ Host ヘッダーの動作は、デプロイ強化上の懸念事項として扱ってください。trustedProxies は厳密に保ち、gateway を公開インターネットへ直接公開しないでください。

ローカルセッションログはディスク上にあります

OpenClaw はセッショントランスクリプトを ~/.openclaw/agents/<agentId>/sessions/*.jsonl の下のディスク上に保存します。 これはセッションの継続性と、任意でセッションメモリのインデックス作成に必要ですが、同時に ファイルシステムにアクセスできるあらゆるプロセス/ユーザーがそれらのログを読めることも意味します。ディスクアクセスを信頼境界として扱い、 ~/.openclaw の権限を制限してください(下の監査セクションを参照)。エージェント間で より強い分離が必要な場合は、別々の OS ユーザーまたは別々のホストで実行してください。

Node 実行 (system.run)

macOS Node がペアリングされている場合、Gateway はその Node 上で system.run を呼び出せます。これは Mac 上での リモートコード実行です。

  • Node ペアリング(承認 + トークン)が必要です。
  • Gateway の Node ペアリングは、コマンドごとの承認サーフェスではありません。Node の ID/信頼とトークン発行を確立します。
  • Gateway は gateway.nodes.allowCommands / denyCommands により、大まかなグローバル Node コマンドポリシーを適用します。
  • Mac では 設定 → 実行承認(セキュリティ + 確認 + 許可リスト)で制御します。
  • Node ごとの system.run ポリシーは、その Node 自身の実行承認ファイル(exec.approvals.node.*)です。これは Gateway のグローバルなコマンド ID ポリシーより厳しくも緩くもできます。
  • security="full" かつ ask="off" で実行されている Node は、デフォルトの信頼済みオペレーターモデルに従っています。デプロイでより厳しい承認または許可リスト方針を明示的に要求していない限り、それを想定どおりの動作として扱ってください。
  • 承認モードは正確なリクエストコンテキストと、可能な場合は具体的なローカルスクリプト/ファイルオペランド 1 つに結び付けられます。OpenClaw がインタープリター/ランタイムコマンドに対して直接のローカルファイルを正確に 1 つ識別できない場合、承認に基づく実行は、完全な意味的カバレッジを約束するのではなく拒否されます。
  • host=node の場合、承認に基づく実行では正規化された準備済みの systemRunPlan も保存されます。その後の承認済み転送は保存済みプランを再利用し、Gateway の 検証は、承認リクエストの作成後に呼び出し元が command/cwd/session コンテキストを編集することを拒否します。
  • リモート実行を望まない場合は、セキュリティを deny に設定し、その Mac の Node ペアリングを削除してください。

この区別はトリアージで重要です。

  • 再接続したペアリング済み Node が別のコマンドリストを広告しても、Gateway のグローバルポリシーと Node のローカル実行承認が実際の実行境界を依然として強制しているなら、それ自体は脆弱性ではありません。
  • Node ペアリングメタデータを 2 つ目の隠れたコマンドごとの承認レイヤーとして扱う報告は、通常はセキュリティ境界のバイパスではなく、ポリシー/UX の混同です。

動的 Skills(ウォッチャー / リモート Node)

OpenClaw はセッション中に Skills リストを更新できます。

  • Skills ウォッチャー: SKILL.md への変更により、次のエージェントターンで Skills スナップショットを更新できます。
  • リモート Node: macOS Node を接続すると、macOS 専用 Skills が対象になり得ます(bin プローブに基づく)。

Skill フォルダーは 信頼済みコードとして扱い、変更できる人を制限してください。

脅威モデル

AI アシスタントは次のことができます。

  • 任意のシェルコマンドを実行する
  • ファイルを読み書きする
  • ネットワークサービスにアクセスする
  • 誰にでもメッセージを送る(WhatsApp アクセスを与えた場合)

あなたにメッセージを送る人は次のことができます。

  • AI をだまして悪いことをさせようとする
  • あなたのデータへのアクセスをソーシャルエンジニアリングする
  • インフラストラクチャの詳細を探る

中核概念: 知能より前にアクセス制御

ここでの失敗の多くは高度なエクスプロイトではありません。「誰かがボットにメッセージを送り、ボットが頼まれたことを実行した」というものです。

OpenClaw の方針:

  • まず ID: 誰がボットと話せるかを決めます(DM ペアリング / 許可リスト / 明示的な「open」)。
  • 次にスコープ: ボットがどこで行動できるかを決めます(グループ許可リスト + メンションゲート、ツール、サンドボックス化、デバイス権限)。
  • 最後にモデル: モデルは操作され得ると想定し、操作されても影響範囲が限定されるよう設計します。

コマンド認可モデル

スラッシュコマンドとディレクティブは 認可済み送信者 に対してのみ尊重されます。認可は チャネル許可リスト/ペアリングと commands.useAccessGroups から導出されます(構成 および スラッシュコマンド を参照)。チャネル許可リストが空、または "*" を含む場合、 そのチャネルではコマンドが実質的に open になります。

/exec は認可済みオペレーター向けのセッション内限定の便利機能です。構成を書き込んだり、 他のセッションを変更したりすることは ありません

コントロールプレーンツールのリスク

2 つの組み込みツールは、永続的なコントロールプレーン変更を行えます。

  • gatewayconfig.schema.lookup / config.get で構成を検査でき、config.applyconfig.patchupdate.run で永続的な変更を行えます。
  • cron は、元のチャット/タスクの終了後も実行され続けるスケジュール済みジョブを作成できます。

所有者専用の gateway ランタイムツールは引き続き tools.exec.ask または tools.exec.security の書き換えを拒否します。従来の tools.bash.* エイリアスは、 書き込み前に同じ保護対象の exec パスへ正規化されます。 エージェント駆動の gateway config.apply および gateway config.patch 編集は デフォルトでフェイルクローズです。エージェントが調整できるのは、プロンプト、モデル、メンションゲートに関する 狭い範囲のパスだけです。したがって、新しい機密構成ツリーは、 意図的に許可リストへ追加されない限り保護されます。

信頼できないコンテンツを扱うエージェント/サーフェスでは、デフォルトでこれらを拒否してください。

{
  tools: {
    deny: ["gateway", "cron", "sessions_spawn", "sessions_send"],
  },
}

commands.restart=false は再起動アクションだけをブロックします。gateway の構成/更新アクションは無効化しません。

Plugins

Plugins は Gateway と 同一プロセス内で実行されます。信頼済みコードとして扱ってください。

  • 信頼できるソースからのみ Plugins をインストールしてください。
  • 明示的な plugins.allow 許可リストを推奨します。
  • 有効化する前に Plugin 構成を確認してください。
  • Plugin 変更後は Gateway を再起動してください。
  • Plugins をインストールまたは更新する場合(openclaw plugins install <package>openclaw plugins update <id>)、信頼できないコードを実行するのと同様に扱ってください。
    • インストールパスは、アクティブな Plugin インストールルート配下の Plugin ごとのディレクトリです。
    • OpenClaw はインストール/更新前に組み込みの危険コードスキャンを実行します。critical の検出結果はデフォルトでブロックします。
    • npm および git Plugin インストールでは、明示的なインストール/更新フロー中にのみ、パッケージマネージャーによる依存関係の収束を実行します。ローカルパスとアーカイブは自己完結型の Plugin パッケージとして扱われます。OpenClaw は npm install を実行せずにそれらをコピー/参照します。
    • 固定された正確なバージョン(@scope/[email protected])を推奨し、有効化前にディスク上に展開されたコードを検査してください。
    • --dangerously-force-unsafe-install は、Plugin インストール/更新フローにおける組み込みスキャンの誤検知に対する緊急時専用です。Plugin の before_install フックポリシーブロックはバイパスせず、スキャン失敗もバイパスしません。
    • Gateway を介した Skill 依存関係のインストールは、同じ危険/疑わしいの分割に従います。組み込みの critical 検出結果は、呼び出し元が dangerouslyForceUnsafeInstall を明示的に設定しない限りブロックされます。一方で疑わしい検出結果は警告のみのままです。openclaw skills install は引き続き別個の ClawHub Skill ダウンロード/インストールフローです。

詳細: Plugins

DM アクセスモデル: ペアリング、許可リスト、open、無効

現在の DM 対応チャネルはすべて、メッセージが処理される に受信 DM をゲートする DM ポリシー(dmPolicy または *.dm.policy)をサポートしています。

  • pairing(デフォルト): 不明な送信者は短いペアリングコードを受け取り、承認されるまでボットはそのメッセージを無視します。コードは 1 時間後に期限切れになります。繰り返し DM しても、新しいリクエストが作成されるまでコードは再送されません。保留中のリクエストはデフォルトで チャネルごとに 3 件 に制限されます。
  • allowlist: 不明な送信者はブロックされます(ペアリングハンドシェイクなし)。
  • open: 誰でも DM できます(公開)。チャネル許可リストに "*" を含める必要があります(明示的なオプトイン)。
  • disabled: 受信 DM を完全に無視します。

CLI で承認します。

openclaw pairing list <channel>
openclaw pairing approve <channel> <code>

詳細 + ディスク上のファイル: ペアリング

DM セッション分離(マルチユーザーモード)

デフォルトでは、OpenClaw は すべての DM をメインセッションへルーティング するため、アシスタントはデバイスとチャネルをまたいだ継続性を持ちます。複数の人 がボットに DM できる場合(open DM または複数人の許可リスト)は、DM セッションの分離を検討してください。

{
  session: { dmScope: "per-channel-peer" },
}

これにより、グループチャットは分離したまま、ユーザー間のコンテキスト漏えいを防げます。

これはメッセージングコンテキストの境界であり、ホスト管理者の境界ではありません。ユーザー同士が相互に敵対的で、同じ Gateway ホスト/構成を共有している場合は、信頼境界ごとに別々の Gateway を実行してください。

セキュア DM モード(推奨)

上のスニペットを セキュア DM モード として扱ってください。

  • デフォルト: session.dmScope: "main"(継続性のため、すべての DM が 1 つのセッションを共有)。
  • ローカル CLI オンボーディングのデフォルト: 未設定の場合に session.dmScope: "per-channel-peer" を書き込みます(既存の明示値は維持)。
  • セキュア DM モード: session.dmScope: "per-channel-peer"(各チャネル+送信者ペアが分離された DM コンテキストを取得)。
  • チャネル横断のピア分離: session.dmScope: "per-peer"(各送信者が、同じ種類のすべてのチャネルをまたいで 1 つのセッションを取得)。

同じチャネルで複数のアカウントを実行する場合は、代わりに per-account-channel-peer を使用してください。同じ人物が複数のチャネルで連絡してくる場合は、session.identityLinks を使用してそれらの DM セッションを 1 つの正規 ID にまとめてください。セッション管理構成 を参照してください。

DM とグループの許可リスト

OpenClaw には、「誰が自分をトリガーできるか?」に関する 2 つの別個のレイヤーがあります。

  • DM 許可リストallowFrom / channels.discord.allowFrom / channels.slack.allowFrom; 従来: channels.discord.dm.allowFrom, channels.slack.dm.allowFrom): ダイレクトメッセージでボットと話すことを許可される人。
    • dmPolicy="pairing" の場合、承認は ~/.openclaw/credentials/ 配下のアカウントスコープのペアリング許可リストストア(デフォルトアカウントでは <channel>-allowFrom.json、非デフォルトアカウントでは <channel>-<accountId>-allowFrom.json)へ書き込まれ、構成の許可リストとマージされます。
  • グループ許可リスト(チャネル固有): ボットがそもそもメッセージを受け付けるグループ/チャネル/ギルド。
    • 一般的なパターン:
      • channels.whatsapp.groupschannels.telegram.groupschannels.imessage.groups: requireMention のようなグループごとのデフォルト。設定されている場合、グループ許可リストとしても機能します(すべて許可する動作を維持するには "*" を含めます)。
      • groupPolicy="allowlist" + groupAllowFrom: グループセッション でボットをトリガーできる人を制限します(WhatsApp/Telegram/Signal/iMessage/Microsoft Teams)。
      • channels.discord.guilds / channels.slack.channels: サーフェスごとの許可リスト + メンションのデフォルト。
    • グループチェックはこの順序で実行されます: groupPolicy/グループ許可リストが先、メンション/返信による有効化が次。
    • ボットメッセージへの返信(暗黙のメンション)は、groupAllowFrom のような送信者許可リストをバイパス しません
    • セキュリティメモ: dmPolicy="open"groupPolicy="open" は最後の手段の設定として扱ってください。ほとんど使うべきではありません。部屋の全メンバーを完全に信頼できる場合を除き、ペアリング + 許可リストを推奨します。

詳細: 構成グループ

プロンプトインジェクション(それは何か、なぜ重要か)

プロンプトインジェクションとは、攻撃者がモデルを操作して危険なことをさせるメッセージを作ることです(「指示を無視して」、「ファイルシステムをダンプして」、「このリンクをたどってコマンドを実行して」など)。

強力なシステムプロンプトがあっても、プロンプトインジェクションは解決済みではありません。システムプロンプトのガードレールはソフトなガイダンスにすぎません。強制力はツールポリシー、実行承認、サンドボックス化、チャネル許可リストから来ます(そしてオペレーターは設計上これらを無効化できます)。実際に役立つもの:

  • 受信 DM は厳しく制限する(ペアリング/許可リスト)。
  • グループではメンションによるゲートを優先し、公開ルームで「常時稼働」のボットは避ける。
  • リンク、添付ファイル、貼り付けられた指示は、デフォルトで敵対的なものとして扱う。
  • 機密性の高いツール実行はサンドボックス内で実行し、シークレットをエージェントが到達可能なファイルシステムから出す。
  • 注: サンドボックス化はオプトイン。サンドボックスモードがオフの場合、暗黙の host=auto は gateway ホストに解決される。明示的な host=sandbox は、利用可能なサンドボックスランタイムがないため、引き続きフェイルクローズする。その挙動を設定内で明示したい場合は、host=gateway を設定する。
  • 高リスクのツール(execbrowserweb_fetchweb_search)は、信頼済みエージェントまたは明示的な許可リストに限定する。
  • インタープリター(pythonnoderubyperlphpluaosascript)を許可リストに入れる場合は、インライン eval 形式にも明示的な承認が必要になるように tools.exec.strictInlineEval を有効にする。
  • Shell 承認分析は、クォートされていない heredoc 内の POSIX パラメーター展開形式($VAR$?$$$1$@${…})も拒否するため、許可リストに入った heredoc 本文が、プレーンテキストとしての許可リスト審査をすり抜けて Shell 展開を忍び込ませることはできない。リテラルな本文セマンティクスを選ぶには、heredoc 終端子をクォートする(例: <<'EOF')。変数が展開されるはずだったクォートなし heredoc は拒否される。
  • モデルの選択は重要: 古い/小さい/レガシーモデルは、プロンプトインジェクションやツール誤用への堅牢性が大幅に低い。ツール有効エージェントには、利用可能な中で最も強力な最新世代かつ命令強化済みのモデルを使用する。

信頼できないものとして扱うべき危険信号:

  • 「このファイル/URL を読み、その内容どおりに実行して。」
  • 「システムプロンプトまたは安全ルールを無視して。」
  • 「隠された指示またはツール出力を開示して。」
  • ~/.openclaw またはログの全内容を貼り付けて。」

外部コンテンツの特殊トークンサニタイズ

OpenClaw は、ラップされた外部コンテンツとメタデータがモデルに到達する前に、一般的なセルフホスト LLM チャットテンプレートの特殊トークンリテラルを除去する。対象のマーカーファミリーには、Qwen/ChatML、Llama、Gemma、Mistral、Phi、GPT-OSS のロール/ターントークンが含まれる。

理由:

  • セルフホストモデルの前段にある OpenAI 互換バックエンドは、ユーザーテキスト内に出現する特殊トークンをマスクせず、そのまま保持することがある。受信外部コンテンツ(取得したページ、メール本文、ファイル内容ツール出力)に書き込める攻撃者は、そうでなければ合成された assistant または system ロール境界を注入し、ラップ済みコンテンツのガードレールを脱出できる可能性がある。
  • サニタイズは外部コンテンツのラップ層で行われるため、プロバイダーごとではなく、取得/読み取りツールおよび受信チャネルコンテンツ全体に一貫して適用される。
  • 送信モデル応答には、漏洩した <tool_call><function_calls><system-reminder><previous_response>、および類似の内部ランタイム足場を、最終チャネル配信境界でユーザーに見える返信から除去する別のサニタイザーがすでにある。外部コンテンツサニタイザーは、その受信側の対応物である。

これは、このページの他の強化策(dmPolicy、許可リスト、exec 承認、サンドボックス化、contextVisibility)を置き換えるものではない。主な防御は引き続きそれらが担う。これは、特殊トークンをそのまま含むユーザーテキストを転送するセルフホストスタックに対する、特定のトークナイザー層バイパスを一つ閉じる。

安全でない外部コンテンツのバイパスフラグ

OpenClaw には、外部コンテンツの安全ラップを無効化する明示的なバイパスフラグが含まれる:

  • hooks.mappings[].allowUnsafeExternalContent
  • hooks.gmail.allowUnsafeExternalContent
  • Cron ペイロードフィールド allowUnsafeExternalContent

ガイダンス:

  • 本番環境では、これらを未設定/false のままにする。
  • 厳密にスコープを絞ったデバッグのためにのみ、一時的に有効化する。
  • 有効化する場合は、そのエージェントを隔離する(サンドボックス + 最小限のツール + 専用セッション名前空間)。

フックのリスクに関する注記:

  • フックペイロードは、配信元が自分で管理するシステムであっても、信頼できないコンテンツである(メール/ドキュメント/Web コンテンツはプロンプトインジェクションを運ぶ可能性がある)。
  • 弱いモデル層はこのリスクを高める。フック駆動の自動化では、強力な現代的モデル層を優先し、ツールポリシーを厳格に保つ(tools.profile: "messaging" またはそれ以上に厳格)、可能であればサンドボックス化も行う。

プロンプトインジェクションに公開 DM は不要

自分だけがボットにメッセージを送れる場合でも、ボットが読む 任意の信頼できないコンテンツ(Web 検索/取得結果、ブラウザページ、 メール、ドキュメント、添付ファイル、貼り付けられたログ/コード)を介して、 プロンプトインジェクションはなお発生しうる。言い換えると、送信者だけが 脅威面なのではなく、コンテンツ自体が敵対的な指示を運ぶ可能性がある。

ツールが有効な場合、典型的なリスクはコンテキストの流出または ツール呼び出しの誘発である。影響範囲を小さくするには:

  • 読み取り専用またはツール無効のリーダーエージェントを使用して信頼できないコンテンツを要約し、 その要約をメインエージェントに渡す。
  • 必要な場合を除き、ツール有効エージェントでは web_search / web_fetch / browser をオフにしておく。
  • OpenResponses URL 入力(input_file / input_image)では、 gateway.http.endpoints.responses.files.urlAllowlistgateway.http.endpoints.responses.images.urlAllowlist を厳格に設定し、maxUrlParts を低く保つ。 空の許可リストは未設定として扱われる。URL 取得を完全に無効化したい場合は、files.allowUrl: false / images.allowUrl: false を使用する。
  • OpenResponses ファイル入力では、デコードされた input_file テキストは引き続き 信頼できない外部コンテンツとして注入される。Gateway がローカルでデコードしたからといって、 ファイルテキストを信頼できるものとして扱ってはならない。注入されるブロックには、明示的な <<&lt;EXTERNAL_UNTRUSTED_CONTENT ...&gt;>> 境界マーカーと Source: External メタデータが引き続き含まれる。ただし、この経路では長い SECURITY NOTICE: バナーは省略される。
  • メディア理解が添付ドキュメントからテキストを抽出し、そのテキストをメディアプロンプトに追加する場合にも、同じマーカーベースのラップが適用される。
  • 信頼できない入力に触れるすべてのエージェントで、サンドボックス化と厳格なツール許可リストを有効にする。
  • シークレットをプロンプトに含めない。代わりに gateway ホスト上の env/config 経由で渡す。

セルフホスト LLM バックエンド

vLLM、SGLang、TGI、LM Studio、 またはカスタム Hugging Face トークナイザースタックなどの OpenAI 互換セルフホストバックエンドは、 チャットテンプレートの特殊トークンの扱いがホスト型プロバイダーと異なる場合がある。バックエンドが <|im_start|><|start_header_id|><start_of_turn> などのリテラル文字列を ユーザーコンテンツ内で構造的なチャットテンプレートトークンとしてトークン化する場合、信頼できないテキストは トークナイザー層でロール境界を偽造しようとする可能性がある。

OpenClaw は、モデルに送信する前に、ラップされた 外部コンテンツから一般的なモデルファミリーの特殊トークンリテラルを除去する。外部コンテンツの ラップは有効のままにし、利用可能な場合は、ユーザー提供コンテンツ内の特殊 トークンを分割またはエスケープするバックエンド設定を優先する。OpenAI や Anthropic などのホスト型プロバイダーは、すでに独自のリクエスト側サニタイズを適用している。

モデル強度(セキュリティ注記)

プロンプトインジェクション耐性は、モデル層間で一様ではない。小さい/安価なモデルは、特に敵対的プロンプト下で、一般にツール誤用や指示ハイジャックの影響を受けやすい。

推奨事項:

  • ツールを実行できる、またはファイル/ネットワークに触れるボットには、最新世代かつ最上位層のモデルを使用する。
  • ツール有効エージェントや信頼できない受信箱には、古い/弱い/小さい層を使用しない。プロンプトインジェクションリスクが高すぎる。
  • 小さいモデルを使わざるを得ない場合は、影響範囲を小さくする(読み取り専用ツール、強力なサンドボックス化、最小限のファイルシステムアクセス、厳格な許可リスト)。
  • 小さいモデルを実行する場合は、すべてのセッションでサンドボックス化を有効にし、入力が厳密に管理されている場合を除き、web_search/web_fetch/browser を無効化する
  • 信頼済み入力かつツールなしのチャット専用パーソナルアシスタントでは、小さいモデルでも通常は問題ない。

グループでの推論と詳細出力

/reasoning/verbose/trace は、内部推論、ツール 出力、または Plugin 診断を公開する可能性があり、 それらは公開チャネル向けではない。グループ設定では、これらをデバッグ 専用として扱い、明示的に必要な場合を除きオフにしておく。

ガイダンス:

  • 公開ルームでは /reasoning/verbose/trace を無効のままにする。
  • 有効化する場合は、信頼済み DM または厳密に管理されたルームでのみ行う。
  • 注意: 詳細出力やトレース出力には、ツール引数、URL、Plugin 診断、モデルが見たデータが含まれることがある。

設定強化の例

ファイル権限

gateway ホスト上の config + state を非公開に保つ:

  • ~/.openclaw/openclaw.json: 600(ユーザーの読み取り/書き込みのみ)
  • ~/.openclaw: 700(ユーザーのみ)

openclaw doctor は、これらの権限について警告し、厳格化を提案できる。

ネットワーク公開(bind、port、firewall)

Gateway は単一ポート上で WebSocket + HTTP を多重化する:

  • デフォルト: 18789
  • 設定/フラグ/env: gateway.port--portOPENCLAW_GATEWAY_PORT

この HTTP サーフェスには Control UI と canvas ホストが含まれる:

  • Control UI(SPA アセット)(デフォルトのベースパス /
  • Canvas ホスト: /__openclaw__/canvas//__openclaw__/a2ui/(任意の HTML/JS。信頼できないコンテンツとして扱う)

通常のブラウザで canvas コンテンツを読み込む場合は、他の信頼できない Web ページと同様に扱う:

  • canvas ホストを信頼できないネットワーク/ユーザーに公開しない。
  • 影響を完全に理解していない限り、canvas コンテンツが特権を持つ Web サーフェスと同一オリジンを共有しないようにする。

bind モードは Gateway が待ち受ける場所を制御する:

  • gateway.bind: "loopback"(デフォルト): ローカルクライアントのみ接続できる。
  • 非 loopback bind("lan""tailnet""custom")は攻撃対象領域を広げる。gateway 認証(共有トークン/パスワードまたは正しく設定された信頼済みプロキシ)と実際のファイアウォールがある場合にのみ使用する。

経験則:

  • LAN bind より Tailscale Serve を優先する(Serve は Gateway を loopback 上に保ち、Tailscale がアクセスを処理する)。
  • LAN に bind する必要がある場合は、ポートを送信元 IP の厳密な許可リストにファイアウォールで制限する。広範にポートフォワードしない。
  • Gateway を 0.0.0.0 で認証なしに公開してはならない。

UFW での Docker ポート公開

VPS 上で Docker を使って OpenClaw を実行する場合、公開されたコンテナポート (-p HOST:CONTAINER または Compose の ports:)は、ホストの INPUT ルールだけでなく、 Docker の転送チェーンを通じてルーティングされることを忘れないこと。

Docker トラフィックをファイアウォールポリシーと一致させるには、 DOCKER-USER でルールを適用する(このチェーンは Docker 独自の accept ルールより前に評価される)。 多くの現代的なディストリビューションでは、iptables/ip6tablesiptables-nft フロントエンドを使用し、 それでもこれらのルールを nftables バックエンドに適用する。

最小限の許可リスト例(IPv4):

# /etc/ufw/after.rules (append as its own *filter section)
*filter
:DOCKER-USER - [0:0]
-A DOCKER-USER -m conntrack --ctstate ESTABLISHED,RELATED -j RETURN
-A DOCKER-USER -s 127.0.0.0/8 -j RETURN
-A DOCKER-USER -s 10.0.0.0/8 -j RETURN
-A DOCKER-USER -s 172.16.0.0/12 -j RETURN
-A DOCKER-USER -s 192.168.0.0/16 -j RETURN
-A DOCKER-USER -s 100.64.0.0/10 -j RETURN
-A DOCKER-USER -p tcp --dport 80 -j RETURN
-A DOCKER-USER -p tcp --dport 443 -j RETURN
-A DOCKER-USER -m conntrack --ctstate NEW -j DROP
-A DOCKER-USER -j RETURN
COMMIT

IPv6 には別のテーブルがある。 Docker IPv6 が有効な場合は、/etc/ufw/after6.rules に対応するポリシーを追加する。

ドキュメントのスニペットで eth0 のようなインターフェイス名をハードコードすることは避ける。インターフェイス名は VPS イメージによって異なり(ens3enp* など)、不一致があると意図せず deny ルールがスキップされる可能性がある。

リロード後のクイック検証:

ufw reload
iptables -S DOCKER-USER
ip6tables -S DOCKER-USER
nmap -sT -p 1-65535 <public-ip> --open

期待される外部ポートは、意図的に公開したものだけであるべきだ(ほとんどの セットアップでは、SSH + リバースプロキシのポート)。

mDNS/Bonjour ディスカバリー

バンドルされた bonjour Plugin が有効な場合、Gateway はローカルデバイス検出のため、mDNS(ポート 5353 上の _openclaw-gw._tcp)で自身の存在をブロードキャストする。full モードでは、運用上の詳細を公開しうる TXT レコードが含まれる:

  • cliPath: CLI バイナリへの完全なファイルシステムパス(ユーザー名とインストール場所を明かします)
  • sshPort: ホスト上で SSH が利用可能であることを通知します
  • displayName, lanHost: ホスト名情報

運用上のセキュリティ考慮事項: インフラストラクチャの詳細をブロードキャストすると、ローカルネットワーク上の誰でも偵察しやすくなります。ファイルシステムパスや SSH の利用可否のような「無害」な情報であっても、攻撃者が環境を把握する助けになります。

推奨事項:

  1. LAN 検出が必要でない限り、Bonjour は無効のままにしてください。 Bonjour は macOS ホストでは自動起動し、それ以外ではオプトインです。直接の Gateway URL、Tailnet、SSH、または広域 DNS-SD を使えば、ローカルマルチキャストを避けられます。

  2. 最小モード(Bonjour 有効時のデフォルト、公開 Gateway に推奨): mDNS ブロードキャストから機密フィールドを省略します。

    {
      discovery: {
        mdns: { mode: "minimal" },
      },
    }
    
  3. Plugin を有効にしたままローカルデバイス検出を抑止したい場合は、mDNS モードを無効化します。

    {
      discovery: {
        mdns: { mode: "off" },
      },
    }
    
  4. 完全モード(オプトイン): TXT レコードに cliPath + sshPort を含めます。

    {
      discovery: {
        mdns: { mode: "full" },
      },
    }
    
  5. 環境変数(代替手段): 構成を変更せずに mDNS を無効化するには、OPENCLAW_DISABLE_BONJOUR=1 を設定します。

Bonjour が最小モードで有効な場合、Gateway はデバイス検出に十分な情報(rolegatewayPorttransport)をブロードキャストしますが、cliPathsshPort は省略します。CLI パス情報が必要なアプリは、代わりに認証済み WebSocket 接続経由で取得できます。

Gateway WebSocket をロックダウンする(ローカル認証)

Gateway 認証はデフォルトで必須です。有効な gateway 認証パスが構成されていない場合、 Gateway は WebSocket 接続を拒否します(フェイルクローズ)。

オンボーディングではデフォルトでトークンが生成されるため(ループバックの場合も同様)、 ローカルクライアントは認証する必要があります。

すべての WS クライアントに認証を必須にするには、トークンを設定します。

{
  gateway: {
    auth: { mode: "token", token: "your-token" },
  },
}

Doctor で生成できます: openclaw doctor --generate-gateway-token

任意: wss:// を使用する場合は、gateway.remote.tlsFingerprint でリモート TLS をピン留めします。 平文の ws:// はデフォルトでループバック専用です。信頼済みプライベートネットワークの パスでは、緊急回避としてクライアントプロセスに OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 を設定します。 これは意図的にプロセス環境のみであり、 openclaw.json の構成キーではありません。 モバイルペアリングと Android の手動またはスキャン済み Gateway ルートはより厳格です。 クリアテキストはループバックでは受け入れられますが、プライベート LAN、リンクローカル、.local、および ドットを含まないホスト名では、信頼済みプライベートネットワークのクリアテキストパスに明示的にオプトインしない限り、TLS を使用する必要があります。

ローカルデバイスのペアリング:

  • 同一ホストのクライアントをスムーズに保つため、直接の local loopback 接続ではデバイスペアリングが自動承認されます。
  • OpenClaw には、信頼済み共有シークレットのヘルパーフロー向けに、範囲を限定したバックエンド/コンテナローカルの自己接続パスもあります。
  • 同一ホストの tailnet バインドを含む Tailnet および LAN 接続は、ペアリング上はリモートとして扱われ、引き続き承認が必要です。
  • ループバックリクエスト上の転送ヘッダー証拠は、ループバックのローカリティを失格にします。メタデータアップグレードの自動承認は狭くスコープされています。両方のルールについては Gateway ペアリング を参照してください。

認証モード:

  • gateway.auth.mode: "token": 共有ベアラートークン(ほとんどのセットアップで推奨)。
  • gateway.auth.mode: "password": パスワード認証(env 経由での設定を推奨: OPENCLAW_GATEWAY_PASSWORD)。
  • gateway.auth.mode: "trusted-proxy": ID 対応リバースプロキシがユーザーを認証し、ヘッダー経由で ID を渡すことを信頼します(信頼済みプロキシ認証 を参照)。

ローテーションチェックリスト(トークン/パスワード):

  1. 新しいシークレット(gateway.auth.token または OPENCLAW_GATEWAY_PASSWORD)を生成/設定します。
  2. Gateway を再起動します(macOS アプリが Gateway を監督している場合は macOS アプリを再起動します)。
  3. リモートクライアントを更新します(Gateway に呼び出すマシン上の gateway.remote.token / .password)。
  4. 古い認証情報では接続できなくなったことを確認します。

Tailscale Serve ID ヘッダー

gateway.auth.allowTailscaletrue の場合(Serve のデフォルト)、OpenClaw は Control UI/WebSocket 認証で Tailscale Serve ID ヘッダー(tailscale-user-login)を受け入れます。OpenClaw は ローカル Tailscale デーモン(tailscale whois)を通じて x-forwarded-for アドレスを解決し、それをヘッダーと照合することで ID を検証します。これは、リクエストがループバックに到達し、 Tailscale によって注入された x-forwarded-forx-forwarded-protox-forwarded-host を含む場合にのみトリガーされます。 この非同期 ID チェックパスでは、同じ {scope, ip} の失敗試行は、リミッターが失敗を記録する前に直列化されます。そのため、1 つの Serve クライアントからの並行した不正再試行は、2 つの単純な不一致として競合して通過するのではなく、2 回目の試行を即座にロックアウトできます。 HTTP API エンドポイント(たとえば /v1/*/tools/invoke/api/channels/*)は Tailscale ID ヘッダー認証を使用しません。これらは引き続き、Gateway に構成された HTTP 認証モードに従います。

重要な境界メモ:

  • Gateway HTTP ベアラー認証は、実質的に全か無かのオペレーターアクセスです。
  • /v1/chat/completions/v1/responses、または /api/channels/* を呼び出せる認証情報は、その Gateway のフルアクセスのオペレーターシークレットとして扱ってください。
  • OpenAI 互換 HTTP サーフェスでは、共有シークレットのベアラー認証により、完全なデフォルトのオペレータースコープ(operator.adminoperator.approvalsoperator.pairingoperator.readoperator.talk.secretsoperator.write)とエージェントターンの所有者セマンティクスが復元されます。より狭い x-openclaw-scopes 値は、その共有シークレットパスを縮小しません。
  • HTTP 上のリクエストごとのスコープセマンティクスは、信頼済みプロキシ認証やプライベート ingress 上の gateway.auth.mode="none" のような ID 付きモードからリクエストが来た場合にのみ適用されます。
  • これらの ID 付きモードで x-openclaw-scopes を省略すると、通常のオペレーターデフォルトスコープセットにフォールバックします。より狭いスコープセットにしたい場合は、ヘッダーを明示的に送信してください。
  • /tools/invoke も同じ共有シークレットルールに従います。トークン/パスワードのベアラー認証はそこでも完全なオペレーターアクセスとして扱われ、ID 付きモードでは引き続き宣言されたスコープが尊重されます。
  • これらの認証情報を信頼できない呼び出し元と共有しないでください。信頼境界ごとに別々の Gateway を使用することを推奨します。

信頼の前提: トークンなしの Serve 認証は、Gateway ホストが信頼されていることを前提としています。 これは、敵対的な同一ホストプロセスに対する保護として扱わないでください。信頼できない ローカルコードが Gateway ホスト上で実行される可能性がある場合は、gateway.auth.allowTailscale を無効にし、 gateway.auth.mode: "token" または "password" による明示的な共有シークレット認証を要求してください。

セキュリティルール: 自分のリバースプロキシからこれらのヘッダーを転送しないでください。Gateway の前段で TLS を終端する、またはプロキシする場合は、 gateway.auth.allowTailscale を無効にし、共有シークレット認証(gateway.auth.mode: "token" または "password")または 信頼済みプロキシ認証 を代わりに使用してください。

信頼済みプロキシ:

  • Gateway の前段で TLS を終端する場合は、gateway.trustedProxies をプロキシ IP に設定します。
  • OpenClaw は、それらの IP からの x-forwarded-for(または x-real-ip)を信頼し、ローカルペアリングチェックおよび HTTP 認証/ローカルチェックでクライアント IP を判定します。
  • プロキシが x-forwarded-for上書きし、Gateway ポートへの直接アクセスをブロックするようにしてください。

TailscaleWeb 概要 を参照してください。

node host 経由のブラウザー制御(推奨)

Gateway がリモートにあり、ブラウザーが別のマシンで実行されている場合は、ブラウザーマシン上で node host を実行し、Gateway にブラウザー操作をプロキシさせます(ブラウザーツール を参照)。 node ペアリングは管理者アクセスと同様に扱ってください。

推奨パターン:

  • Gateway と node host を同じ tailnet(Tailscale)上に置きます。
  • node を意図的にペアリングします。不要な場合はブラウザープロキシルーティングを無効にします。

避けること:

  • リレー/制御ポートを LAN または公開インターネットに公開すること。
  • ブラウザー制御エンドポイントに Tailscale Funnel を使用すること(公開露出)。

ディスク上のシークレット

~/.openclaw/(または $OPENCLAW_STATE_DIR/)配下のものはすべて、シークレットまたはプライベートデータを含む可能性があると想定してください。

  • openclaw.json: 構成にはトークン(Gateway、リモート Gateway)、プロバイダー設定、許可リストが含まれる場合があります。
  • credentials/**: チャンネル認証情報(例: WhatsApp 認証情報)、ペアリング許可リスト、レガシー OAuth インポート。
  • agents/<agentId>/agent/auth-profiles.json: API キー、トークンプロファイル、OAuth トークン、および任意の keyRef/tokenRef
  • agents/<agentId>/agent/codex-home/**: エージェントごとの Codex アプリサーバーアカウント、構成、Skills、plugins、ネイティブスレッド状態、診断情報。
  • secrets.json(任意): file SecretRef プロバイダー(secrets.providers)で使用されるファイルバックドのシークレットペイロード。
  • agents/<agentId>/agent/auth.json: レガシー互換ファイル。静的な api_key エントリは検出時にスクラブされます。
  • agents/<agentId>/sessions/**: セッション transcript(*.jsonl)+ ルーティングメタデータ(sessions.json)。プライベートメッセージやツール出力を含む可能性があります。
  • バンドルされた Plugin パッケージ: インストール済み plugins(およびそれらの node_modules/)。
  • sandboxes/**: ツールサンドボックスのワークスペース。サンドボックス内で読み書きしたファイルのコピーが蓄積される場合があります。

ハードニングのヒント:

  • 権限を厳密に保ちます(ディレクトリは 700、ファイルは 600)。
  • Gateway ホストでフルディスク暗号化を使用します。
  • ホストが共有されている場合は、Gateway 用に専用の OS ユーザーアカウントを使用することを推奨します。

ワークスペースの .env ファイル

OpenClaw はエージェントとツールのためにワークスペースローカルの .env ファイルを読み込みますが、それらのファイルが Gateway ランタイム制御を黙って上書きすることは決して許可しません。

  • OPENCLAW_* で始まるキーは、信頼されていないワークスペースの .env ファイルからはブロックされます。
  • Matrix、Mattermost、IRC、Synology Chat のチャンネルエンドポイント設定も、ワークスペースの .env からの上書きがブロックされます。そのため、クローンされたワークスペースが、ローカルエンドポイント構成を通じてバンドル済みコネクタのトラフィックをリダイレクトすることはできません。エンドポイント env キー(MATRIX_HOMESERVERMATTERMOST_URLIRC_HOSTSYNOLOGY_CHAT_INCOMING_URL など)は、ワークスペースから読み込まれた .env ではなく、Gateway プロセス環境または env.shellEnv から来る必要があります。
  • ブロックはフェイルクローズです。将来のリリースで新しいランタイム制御変数が追加されても、チェックイン済みまたは攻撃者提供の .env から継承されることはありません。そのキーは無視され、Gateway は自身の値を保持します。
  • 信頼済みのプロセス/OS 環境変数(Gateway 自身のシェル、launchd/systemd ユニット、アプリバンドル)は引き続き適用されます。これは .env ファイルの読み込みだけを制約します。

理由: ワークスペースの .env ファイルはエージェントコードの近くに置かれることが多く、誤ってコミットされたり、ツールによって書き込まれたりします。OPENCLAW_* プレフィックス全体をブロックすることで、後から新しい OPENCLAW_* フラグを追加しても、ワークスペース状態からの黙示的な継承に退行することはありません。

ログと transcript(リダクションと保持)

アクセス制御が正しくても、ログと transcript は機密情報を漏えいする可能性があります。

  • Gateway ログには、ツール要約、エラー、URL が含まれる場合があります。
  • セッション transcript には、貼り付けられたシークレット、ファイル内容、コマンド出力、リンクが含まれる場合があります。

推奨事項:

  • ログと transcript のリダクションを有効のままにします(logging.redactSensitive: "tools"、デフォルト)。
  • logging.redactPatterns 経由で環境に合わせたカスタムパターン(トークン、ホスト名、内部 URL)を追加します。
  • 診断情報を共有する場合は、生ログではなく openclaw status --all(貼り付け可能、シークレットはリダクト済み)を推奨します。
  • 長期保持が不要な場合は、古いセッション transcript とログファイルを削除します。

詳細: Logging

DM: デフォルトでペアリング

{
  channels: { whatsapp: { dmPolicy: "pairing" } },
}

グループ: すべての場所でメンションを要求する

{
  "channels": {
    "whatsapp": {
      "groups": {
        "*": { "requireMention": true }
      }
    }
  },
  "agents": {
    "list": [
      {
        "id": "main",
        "groupChat": { "mentionPatterns": ["@openclaw", "@mybot"] }
      }
    ]
  }
}

グループチャットでは、明示的にメンションされた場合にのみ応答します。

番号を分ける(WhatsApp、Signal、Telegram)

電話番号ベースのチャンネルでは、個人用の番号とは別の電話番号で AI を実行することを検討してください。

  • 個人用番号: 会話は非公開のままです
  • ボット用番号: AI が適切な境界でこれらを処理します

読み取り専用モード(サンドボックスとツール経由)

次を組み合わせることで、読み取り専用プロファイルを構築できます。

  • agents.defaults.sandbox.workspaceAccess: "ro"(ワークスペースアクセスをなくす場合は "none"
  • writeeditapply_patchexecprocess などをブロックするツールの許可/拒否リスト

追加の強化オプション:

  • tools.exec.applyPatch.workspaceOnly: true(デフォルト): サンドボックス化がオフでも、apply_patch がワークスペースディレクトリの外へ書き込み/削除できないようにします。apply_patch がワークスペース外のファイルに触れることを意図している場合にのみ false に設定してください。
  • tools.fs.workspaceOnly: true(任意): read/write/edit/apply_patch のパスとネイティブプロンプト画像の自動読み込みパスをワークスペースディレクトリに制限します(現在、絶対パスを許可していて、単一のガードレールが必要な場合に有用です)。
  • ファイルシステムルートは狭く保つ: エージェントワークスペース/サンドボックスワークスペースには、ホームディレクトリのような広いルートを避けてください。広いルートは、機密性の高いローカルファイル(例: ~/.openclaw 配下の状態/設定)をファイルシステムツールに公開する可能性があります。

セキュアなベースライン(コピー/貼り付け)

Gateway を非公開に保ち、DM ペアリングを必須にし、常時稼働のグループボットを避ける「安全なデフォルト」設定の一例です。

{
  gateway: {
    mode: "local",
    bind: "loopback",
    port: 18789,
    auth: { mode: "token", token: "your-long-random-token" },
  },
  channels: {
    whatsapp: {
      dmPolicy: "pairing",
      groups: { "*": { requireMention: true } },
    },
  },
}

ツール実行も「デフォルトでより安全」にしたい場合は、所有者以外のエージェントに対してサンドボックスを追加し、危険なツールを拒否してください(下の「エージェントごとのアクセスプロファイル」の例を参照)。

チャット駆動のエージェントターンに対する組み込みベースライン: 所有者以外の送信者は cron または gateway ツールを使用できません。

サンドボックス化(推奨)

専用ドキュメント: サンドボックス化

2 つの補完的なアプローチがあります。

  • Gateway 全体を Docker で実行する(コンテナ境界): Docker
  • ツールサンドボックスagents.defaults.sandbox、ホスト Gateway + サンドボックスで分離されたツール。Docker がデフォルトのバックエンド): サンドボックス化

サンドボックス内のエージェントワークスペースアクセスも検討してください。

  • agents.defaults.sandbox.workspaceAccess: "none"(デフォルト)はエージェントワークスペースをアクセス不可にし、ツールは ~/.openclaw/sandboxes 配下のサンドボックスワークスペースに対して実行されます
  • agents.defaults.sandbox.workspaceAccess: "ro" はエージェントワークスペースを /agent に読み取り専用でマウントします(write/edit/apply_patch を無効化)
  • agents.defaults.sandbox.workspaceAccess: "rw" はエージェントワークスペースを /workspace に読み書き可能でマウントします
  • 追加の sandbox.docker.binds は、正規化および canonicalize されたソースパスに対して検証されます。親シンボリックリンクの細工や canonical なホームエイリアスも、/etc/var/run、または OS ホーム配下の認証情報ディレクトリなどのブロック対象ルートに解決される場合はフェイルクローズします。

サブエージェント委譲のガードレール

セッションツールを許可する場合は、委譲されたサブエージェント実行も別の境界判断として扱ってください。

  • エージェントが本当に委譲を必要とする場合を除き、sessions_spawn を拒否します。
  • agents.defaults.subagents.allowAgents と、エージェントごとの agents.list[].subagents.allowAgents オーバーライドは、既知の安全な対象エージェントに制限してください。
  • サンドボックス化を維持する必要があるワークフローでは、sandbox: "require"sessions_spawn を呼び出します(デフォルトは inherit)。
  • sandbox: "require" は、対象の子ランタイムがサンドボックス化されていない場合に即座に失敗します。

ブラウザー制御のリスク

ブラウザー制御を有効にすると、モデルは実際のブラウザーを操作できるようになります。 そのブラウザープロファイルにログイン済みセッションがすでに含まれている場合、モデルは それらのアカウントとデータにアクセスできます。ブラウザープロファイルは機密状態として扱ってください。

  • エージェント専用のプロファイル(デフォルトの openclaw プロファイル)を優先してください。
  • エージェントに個人用の日常利用プロファイルを指定することは避けてください。
  • サンドボックス化されたエージェントでは、信頼している場合を除き、ホストブラウザー制御を無効にしておいてください。
  • スタンドアロンの loopback ブラウザー制御 API は共有シークレット認証 (Gateway トークン bearer 認証または Gateway パスワード)のみを尊重します。 trusted-proxy または Tailscale Serve の ID ヘッダーは使用しません。
  • ブラウザーのダウンロードは信頼できない入力として扱い、隔離されたダウンロードディレクトリを優先してください。
  • 可能であれば、エージェントプロファイルでブラウザー同期/パスワードマネージャーを無効にしてください(影響範囲を小さくします)。
  • リモート Gateway では、「ブラウザー制御」は、そのプロファイルが到達できるものに対する「オペレーターアクセス」と同等だと考えてください。
  • Gateway と node ホストは tailnet のみに保ち、ブラウザー制御ポートを LAN や公開インターネットに公開しないでください。
  • 必要がない場合は、ブラウザープロキシルーティングを無効にしてください(gateway.nodes.browser.mode="off")。
  • Chrome MCP の既存セッションモードは「より安全」ではありません。そのホストの Chrome プロファイルが到達できる場所で、あなたとして動作できます。

ブラウザー SSRF ポリシー(デフォルトで厳格)

OpenClaw のブラウザーナビゲーションポリシーは、デフォルトで厳格です。明示的にオプトインしない限り、プライベート/内部/特殊用途の宛先はブロックされたままです。

  • デフォルト: browser.ssrfPolicy.dangerouslyAllowPrivateNetwork は未設定のため、ブラウザーナビゲーションではプライベート/内部/特殊用途の宛先がブロックされたままです。
  • レガシーエイリアス: 互換性のため browser.ssrfPolicy.allowPrivateNetwork も引き続き受け付けられます。
  • オプトインモード: プライベート/内部/特殊用途の宛先を許可するには、browser.ssrfPolicy.dangerouslyAllowPrivateNetwork: true を設定します。
  • 厳格モードでは、明示的な例外として hostnameAllowlist*.example.com のようなパターン)と allowedHostnameslocalhost のようなブロック対象名を含む完全一致ホスト例外)を使用します。
  • リダイレクトベースのピボットを減らすため、ナビゲーション前にチェックされ、ナビゲーション後の最終的な http(s) URL でベストエフォートに再チェックされます。

厳格ポリシーの例:

{
  browser: {
    ssrfPolicy: {
      dangerouslyAllowPrivateNetwork: false,
      hostnameAllowlist: ["*.example.com", "example.com"],
      allowedHostnames: ["localhost"],
    },
  },
}

エージェントごとのアクセスプロファイル(マルチエージェント)

マルチエージェントルーティングでは、各エージェントが独自のサンドボックス + ツールポリシーを持つことができます。 これを使って、エージェントごとにフルアクセス読み取り専用、またはアクセスなしを付与します。 詳細と優先順位のルールについては、マルチエージェントのサンドボックスとツールを参照してください。

一般的なユースケース:

  • 個人用エージェント: フルアクセス、サンドボックスなし
  • 家族/仕事用エージェント: サンドボックス化 + 読み取り専用ツール
  • 公開エージェント: サンドボックス化 + ファイルシステム/シェルツールなし

例: フルアクセス(サンドボックスなし)

{
  agents: {
    list: [
      {
        id: "personal",
        workspace: "~/.openclaw/workspace-personal",
        sandbox: { mode: "off" },
      },
    ],
  },
}

例: 読み取り専用ツール + 読み取り専用ワークスペース

{
  agents: {
    list: [
      {
        id: "family",
        workspace: "~/.openclaw/workspace-family",
        sandbox: {
          mode: "all",
          scope: "agent",
          workspaceAccess: "ro",
        },
        tools: {
          allow: ["read"],
          deny: ["write", "edit", "apply_patch", "exec", "process", "browser"],
        },
      },
    ],
  },
}

例: ファイルシステム/シェルアクセスなし(プロバイダーメッセージングは許可)

{
  agents: {
    list: [
      {
        id: "public",
        workspace: "~/.openclaw/workspace-public",
        sandbox: {
          mode: "all",
          scope: "agent",
          workspaceAccess: "none",
        },
        // Session tools can reveal sensitive data from transcripts. By default OpenClaw limits these tools
        // to the current session + spawned subagent sessions, but you can clamp further if needed.
        // See `tools.sessions.visibility` in the configuration reference.
        tools: {
          sessions: { visibility: "tree" }, // self | tree | agent | all
          allow: [
            "sessions_list",
            "sessions_history",
            "sessions_send",
            "sessions_spawn",
            "session_status",
            "whatsapp",
            "telegram",
            "slack",
            "discord",
          ],
          deny: [
            "read",
            "write",
            "edit",
            "apply_patch",
            "exec",
            "process",
            "browser",
            "canvas",
            "nodes",
            "cron",
            "gateway",
            "image",
          ],
        },
      },
    ],
  },
}

インシデント対応

AI が望ましくない動作をした場合:

封じ込め

  1. 停止する: macOS アプリ(Gateway を監督している場合)を停止するか、openclaw gateway プロセスを終了します。
  2. 露出を閉じる: 何が起きたか理解するまで、gateway.bind: "loopback" を設定します(または Tailscale Funnel/Serve を無効化します)。
  3. アクセスを凍結する: リスクの高い DM/グループを dmPolicy: "disabled" に切り替える、またはメンションを必須にし、"*" の allow-all エントリがある場合は削除します。

ローテーション(シークレットが漏えいした場合は侵害を前提にする)

  1. Gateway 認証(gateway.auth.token / OPENCLAW_GATEWAY_PASSWORD)をローテーションし、再起動します。
  2. Gateway を呼び出せる任意のマシンで、リモートクライアントシークレット(gateway.remote.token / .password)をローテーションします。
  3. プロバイダー/API 認証情報(WhatsApp 認証情報、Slack/Discord トークン、auth-profiles.json 内のモデル/API キー、および使用時の暗号化シークレットペイロード値)をローテーションします。

監査

  1. Gateway ログを確認します: /tmp/openclaw/openclaw-YYYY-MM-DD.log(または logging.file)。
  2. 関連するトランスクリプトを確認します: ~/.openclaw/agents/<agentId>/sessions/*.jsonl
  3. 最近の設定変更(アクセスを広げた可能性があるもの: gateway.bindgateway.auth、DM/グループポリシー、tools.elevated、Plugin 変更)を確認します。
  4. openclaw security audit --deep を再実行し、重大な検出事項が解決済みであることを確認します。

レポート用に収集するもの

  • タイムスタンプ、Gateway ホスト OS + OpenClaw バージョン
  • セッショントランスクリプト + 短いログ末尾(リダクト後)
  • 攻撃者が送信した内容 + エージェントが行ったこと
  • Gateway が loopback を超えて公開されていたかどうか(LAN/Tailscale Funnel/Serve)

シークレットスキャン

CI はリポジトリ全体に対して pre-commit の detect-private-key フックを実行します。失敗した場合は、コミットされた鍵素材を削除またはローテーションしてから、ローカルで再現してください。

pre-commit run --all-files detect-private-key

セキュリティ問題の報告

OpenClaw に脆弱性を見つけた場合は、責任ある方法で報告してください。

  1. メール: [email protected]
  2. 修正されるまで公開投稿しないでください
  3. 希望しない場合を除き、あなたをクレジットします