メインコンテンツへスキップ
OpenClaw は、影響範囲を抑えるためにツール実行をサンドボックスバックエンド内で実行できます。サンドボックス化はデフォルトではオフで、agents.defaults.sandbox(グローバル)または agents.list[].sandbox(エージェントごと)で制御されます。Gateway プロセスは常にホスト上に残り、有効化されている場合のみツール実行がサンドボックスへ移動します。
これは完全なセキュリティ境界ではありませんが、モデルが不適切な動作をした場合に、ファイルシステムとプロセスへのアクセスを実質的に制限します。

サンドボックス化されるもの

  • ツール実行: execreadwriteeditapply_patchprocess など。
  • 任意のサンドボックス化ブラウザー(agents.defaults.sandbox.browser)。
サンドボックス化されないもの:
  • Gateway プロセス自体。
  • tools.elevated によってサンドボックス外での実行が明示的に許可されたツール。昇格された exec はサンドボックス化をバイパスし、設定されたエスケープパス(デフォルトでは gateway、exec ターゲットが node の場合は node)上で実行されます。サンドボックス化がオフの場合、exec はすでにホスト上で実行されているため、tools.elevated は何も変更しません。昇格モードを参照してください。

モード、スコープ、バックエンド

3 つの独立した設定でサンドボックスの動作を制御します。
設定キーデフォルト
モードagents.defaults.sandbox.modeoff, non-main, alloff
スコープagents.defaults.sandbox.scopeagent, session, sharedagent
バックエンドagents.defaults.sandbox.backenddocker, ssh, openshelldocker
モード はサンドボックス化を適用するタイミングを制御します。
  • off: サンドボックス化しません。
  • non-main: エージェントのメインセッションを除くすべてのセッションをサンドボックス化します。メインセッションキーは常に agent:<agentId>:main(または session.scope"global" の場合は global)であり、設定できません。グループ/チャンネルセッションは独自のキーを使用するため、常に non-main と見なされ、サンドボックス化されます。
  • all: すべてのセッションがサンドボックス内で実行されます。
スコープ は作成されるコンテナ/環境の数を制御します。
  • agent: エージェントごとに 1 つのコンテナ。
  • session: セッションごとに 1 つのコンテナ。
  • shared: すべてのサンドボックス化されたセッションで共有される 1 つのコンテナ(このスコープでは、エージェントごとの docker/ssh/browser オーバーライドは無視されます)。
バックエンド は、どのランタイムがサンドボックス化されたツールを実行するかを制御します。SSH 固有の設定は agents.defaults.sandbox.ssh 配下にあります。OpenShell 固有の設定は plugins.entries.openshell.config 配下にあります。
DockerSSHOpenShell
実行場所ローカルコンテナSSH でアクセス可能な任意のホストOpenShell 管理のサンドボックス
セットアップscripts/sandbox-setup.shSSH キー + ターゲットホストOpenShell Plugin が有効
ワークスペースモデルバインドマウントまたはコピーリモートを正とする(一度だけシード)mirror または remote
ネットワーク制御docker.network(デフォルト: なし)リモートホストに依存OpenShell に依存
ブラウザーサンドボックス対応非対応まだ非対応
バインドマウントdocker.bindsN/AN/A
最適な用途ローカル開発、完全な分離リモートマシンへのオフロード任意の双方向同期を備えた管理型リモートサンドボックス

Docker バックエンド

Docker は、サンドボックス化が有効になるとデフォルトのバックエンドになります。Docker デーモンソケット(/var/run/docker.sock)を通じてツールとサンドボックスブラウザーをローカルで実行します。分離は Docker 名前空間によって実現されます。 デフォルト: network: "none"(外向き通信なし)、readOnlyRoot: truecapDrop: ["ALL"]、イメージ openclaw-sandbox:bookworm-slim ホスト GPU を公開するには、agents.defaults.sandbox.docker.gpus(またはエージェントごとのオーバーライド)を "all""device=GPU-uuid" のような値に設定します。これは Docker の --gpus フラグに渡され、NVIDIA Container Toolkit などの互換性のあるホストランタイムが必要です。
Docker-out-of-Docker (DooD) の制約OpenClaw Gateway 自体を Docker コンテナとしてデプロイする場合、ホストの Docker ソケット(DooD)を使って兄弟サンドボックスコンテナをオーケストレーションします。これにより、パスマッピング上の制約が生じます。
  • 設定にはホストパスが必要: openclaw.jsonworkspace には、内部の Gateway コンテナパスではなく、ホストの絶対パス(例: /home/user/.openclaw/workspaces)を含める必要があります。Docker デーモンは、Gateway 自身の名前空間ではなく、ホスト OS 名前空間を基準にパスを評価します。
  • 一致するボリュームマップが必要: Gateway プロセスも、その workspace パスに heartbeat とブリッジファイルを書き込みます。Gateway コンテナに同一のボリュームマップ(-v /home/user/.openclaw:/home/user/.openclaw)を与え、Gateway コンテナ内からも同じホストパスが正しく解決されるようにしてください。マッピングが一致しない場合、Gateway が heartbeat を書き込もうとしたときに EACCES として現れます。
  • Codex コードモード: OpenClaw サンドボックスがアクティブな場合、そのターンでは OpenClaw は Codex アプリサーバーのネイティブ Code Mode、ユーザー MCP サーバー、アプリ支援 Plugin 実行を無効化します(これらは OpenClaw サンドボックスバックエンドではなく、Gateway ホストのアプリサーバープロセスから実行されるため)。ただし、サンドボックスツールポリシーが必要なツールを公開しており、実験的なサンドボックス exec-server パスにオプトインしている場合を除きます。その場合、シェルアクセスは sandbox_execsandbox_process などの OpenClaw サンドボックス支援ツール経由でルーティングされます。ホストの Docker ソケットをエージェントサンドボックスコンテナやカスタム Codex サンドボックスにマウントしないでください。完全な動作については Codex Harness を参照してください。
Docker サンドボックスモードが有効な Ubuntu/AppArmor ホストでは、Codex アプリサーバーの workspace-write シェル実行に、サンドボックスコンテナ内の非特権ユーザー名前空間が必要です。サービスユーザーがそれらを作成できない場合、シェル起動前に失敗することがあります。Docker サンドボックスの外向き通信が無効(network: "none"、デフォルト)な場合は、非特権ネットワーク名前空間も必要です。一般的な症状: bwrap: setting up uid map: Permission denied および bwrap: loopback: Failed RTM_NEWADDR: Operation not permittedopenclaw doctor を実行してください。Codex bwrap 名前空間プローブの失敗が報告された場合は、必要な名前空間を OpenClaw サービスプロセスに許可する AppArmor プロファイルを優先してください。kernel.apparmor_restrict_unprivileged_userns=0 は、セキュリティ上のトレードオフを伴うホスト全体のフォールバックです。そのホストの姿勢として許容できる場合にのみ使用してください。

サンドボックス化ブラウザー

  • サンドボックスブラウザーは、ブラウザーツールが必要とするときに自動起動します(CDP に到達可能であることを保証します)。agents.defaults.sandbox.browser.autoStart(デフォルト true)と autoStartTimeoutMs(デフォルト 12s)で設定します。
  • サンドボックスブラウザーコンテナは、グローバルな bridge ネットワークの代わりに、専用の Docker ネットワーク(openclaw-sandbox-browser)を使用します。agents.defaults.sandbox.browser.network で設定します。
  • agents.defaults.sandbox.browser.cdpSourceRange は、CIDR 許可リスト(例: 172.21.0.1/32)でコンテナエッジの CDP 入口を制限します。
  • noVNC オブザーバーアクセスはデフォルトでパスワード保護されます。OpenClaw は、ローカルブートストラップページを提供し、URL フラグメント(クエリ文字列やヘッダーログではありません)内のパスワードで noVNC を開く、短命のトークン URL を出力します。
  • agents.defaults.sandbox.browser.allowHostControl(デフォルト false)は、サンドボックス化されたセッションがホストブラウザーを明示的にターゲットにできるようにします。
  • 任意の許可リストが target: "custom" をゲートします: allowedControlUrlsallowedControlHostsallowedControlPorts

SSH バックエンド

backend: "ssh" を使用して、任意の SSH アクセス可能なマシン上で exec、ファイルツール、メディア読み取りをサンドボックス化します。
{
  agents: {
    defaults: {
      sandbox: {
        mode: "all",
        backend: "ssh",
        scope: "session",
        workspaceAccess: "rw",
        ssh: {
          target: "user@gateway-host:22",
          workspaceRoot: "/tmp/openclaw-sandboxes",
          strictHostKeyChecking: true,
          updateHostKeys: true,
          identityFile: "~/.ssh/id_ed25519",
          certificateFile: "~/.ssh/id_ed25519-cert.pub",
          knownHostsFile: "~/.ssh/known_hosts",
          // Or use SecretRefs / inline contents instead of local files:
          // identityData: { source: "env", provider: "default", id: "SSH_IDENTITY" },
          // certificateData: { source: "env", provider: "default", id: "SSH_CERTIFICATE" },
          // knownHostsData: { source: "env", provider: "default", id: "SSH_KNOWN_HOSTS" },
        },
      },
    },
  },
}
デフォルト: command: "ssh"workspaceRoot: "/tmp/openclaw-sandboxes"strictHostKeyChecking: trueupdateHostKeys: true
  • ライフサイクル: OpenClaw は sandbox.ssh.workspaceRoot の下にスコープごとのリモートルートを作成します。作成または再作成後の初回使用時に、ローカルワークスペースからそのリモートワークスペースへ一度だけシードします。その後、execreadwriteeditapply_patch、プロンプトメディア読み取り、受信メディアのステージングは、SSH 経由でリモートワークスペースに対して直接実行されます。OpenClaw はリモートの変更をローカルワークスペースへ自動的には同期しません。
  • 認証素材: identityFile/certificateFile/knownHostsFile は既存のローカルファイルを参照します。identityData/certificateData/knownHostsData はインライン文字列または SecretRefs を受け付け、通常のシークレットランタイムスナップショットを通じて解決され、モード 0600 の一時ファイルに書き込まれ、SSH セッション終了時に削除されます。同じ項目に *File*Data の両方のバリアントが設定されている場合、そのセッションでは *Data が優先されます。
  • リモートを正とすることの結果: 初期シード後、リモート SSH ワークスペースが実際のサンドボックス状態になります。シード手順の後に OpenClaw 外で行われたホストローカルの編集は、サンドボックスを再作成するまでリモートには表示されません。openclaw sandbox recreate は、スコープごとのリモートルートを削除し、次回使用時にローカルから再度シードします。このバックエンドではブラウザーサンドボックス化は対応しておらず、sandbox.docker.* 設定は適用されません。

OpenShell バックエンド

backend: "openshell" を使用して、OpenShell 管理のリモート環境でツールをサンドボックス化します。OpenShell は汎用 SSH バックエンドと同じ SSH トランスポートおよびリモートファイルシステムブリッジを再利用し、OpenShell ライフサイクル(sandbox create/get/delete/ssh-config)に加えて、任意の mirror ワークスペース同期モードを追加します。
{
  agents: {
    defaults: {
      sandbox: {
        mode: "all",
        backend: "openshell",
        scope: "session",
        workspaceAccess: "rw",
      },
    },
  },
  plugins: {
    entries: {
      openshell: {
        enabled: true,
        config: {
          from: "openclaw",
          mode: "remote", // mirror | remote
        },
      },
    },
  },
}
mode: "mirror"(デフォルト)は、ローカルワークスペースを正として保ちます。OpenClaw は exec の前にローカルをサンドボックスへ同期し、その後に同期し戻します。mode: "remote" は、ローカルからリモートワークスペースへ一度だけシードし、その後は同期し戻さずにリモートワークスペースに対して exec/read/write/edit/apply_patch を直接実行します。シード後のローカル編集は、openclaw sandbox recreate するまで見えません。scope: "agent" または scope: "shared" では、そのリモートワークスペースが同じスコープで共有されます。現在の制限: サンドボックスブラウザーはまだ対応しておらず、sandbox.docker.binds はこのバックエンドには適用されません。 openclaw sandbox list/recreate/prune はすべて、OpenShell ランタイムを Docker ランタイムと同じように扱います。prune ロジックはバックエンドを認識します。 完全な前提条件、設定リファレンス、ワークスペースモードの比較、ライフサイクルの詳細については、OpenShell を参照してください。

ワークスペースアクセス

agents.defaults.sandbox.workspaceAccess はサンドボックスが何を参照できるかを制御します。
動作
none (デフォルト)ツールは ~/.openclaw/sandboxes 配下の隔離されたサンドボックスワークスペースを参照します。
roエージェントワークスペースを /agent に読み取り専用でマウントします(write/edit/apply_patch を無効化)。
rwエージェントワークスペースを /workspace に読み書き可能でマウントします。
OpenShell バックエンドでは、mirror モードは exec ターン間の正規ソースとして引き続きローカルワークスペースを使用し、remote モードは初期シード後の正規ソースとしてリモートの OpenShell ワークスペースを使用します。また、workspaceAccess: "ro"/"none" は同じ方法で書き込み動作を制限します。 受信メディアはアクティブなサンドボックスワークスペース(media/inbound/*)にコピーされます。
Skills: read ツールはサンドボックスルート基準です。workspaceAccess: "none" では、OpenClaw は読み取り可能にするため、対象の Skills をサンドボックスワークスペース(.../skills)にミラーします。"rw" では、ワークスペースの Skills は /workspace/skills から読み取り可能で、対象の管理対象、バンドル済み、または Plugin の Skills は、生成された読み取り専用パス /workspace/.openclaw/sandbox-skills/skills に実体化されます。

カスタムバインドマウント

agents.defaults.sandbox.docker.binds は追加のホストディレクトリをコンテナにマウントします。形式: host:container:mode(例: "/home/user/source:/source:rw")。 グローバルバインドとエージェント単位のバインドはマージされます(置き換えではありません)。scope: "shared" では、エージェント単位のバインドは無視されます。 agents.defaults.sandbox.browser.binds は追加のホストディレクトリを サンドボックスブラウザ コンテナにのみマウントします。設定されている場合([] を含む)は、ブラウザコンテナについて docker.binds を置き換えます。省略された場合、ブラウザコンテナは docker.binds にフォールバックします。
{
  agents: {
    defaults: {
      sandbox: {
        docker: {
          binds: ["/home/user/source:/source:ro", "/var/data/myapp:/data:ro"],
        },
      },
    },
    list: [
      {
        id: "build",
        sandbox: {
          docker: {
            binds: ["/mnt/cache:/cache:rw"],
          },
        },
      },
    ],
  },
}
バインドのセキュリティ
  • バインドはサンドボックスファイルシステムをバイパスします。設定したモード(:ro または :rw)でホストパスを公開します。
  • OpenClaw は危険なバインド元をデフォルトでブロックします。システムパス(/etc, /proc, /sys, /dev, /root, /boot)、Docker ソケットディレクトリ(/run, /var/run とそれらの docker.sock バリアント)、一般的なホームディレクトリの認証情報ルート(~/.aws, ~/.cargo, ~/.config, ~/.docker, ~/.gnupg, ~/.netrc, ~/.npm, ~/.ssh)が対象です。
  • 検証ではソースパスを正規化し、その後、最も深い既存の祖先を通じて再度解決してから、ブロック済みパスと許可済みルートを再確認します。そのため、最終的なリーフがまだ存在しない場合でも、シンボリックリンク親による脱出は fail closed になります(例: run-link がそこを指している場合、/workspace/run-link/new-file は引き続き /var/run/... として解決されます)。
  • 予約済みコンテナマウントポイント(/workspace, /agent)を隠すバインドターゲットもデフォルトでブロックされます。agents.defaults.sandbox.docker.dangerouslyAllowReservedContainerTargets: true で上書きできます。
  • ワークスペース/エージェントワークスペースの許可済みルート外にあるバインド元は、デフォルトでブロックされます。agents.defaults.sandbox.docker.dangerouslyAllowExternalBindSources: true で上書きできます。許可済みルートも同じ方法で正規化されるため、シンボリックリンク解決前に許可リスト内に見えるだけのパスも、許可済みルート外として拒否されます。
  • 機密マウント(シークレット、SSH キー、サービス認証情報)は、絶対に必要でない限り :ro にする必要があります。
  • ワークスペースへの読み取りアクセスだけが必要な場合は、workspaceAccess: "ro" と組み合わせてください。バインドモードは独立したままです。
  • バインドがツールポリシーと昇格 exec とどのように相互作用するかについては、サンドボックス vs ツールポリシー vs 昇格 を参照してください。

イメージとセットアップ

デフォルトの Docker イメージ: openclaw-sandbox:bookworm-slim
ソースチェックアウト vs npm installscripts/sandbox-setup.shscripts/sandbox-common-setup.shscripts/sandbox-browser-setup.sh ヘルパースクリプトは、ソースチェックアウト から実行している場合にのみ利用できます。npm パッケージには含まれていません。npm install -g openclaw で OpenClaw をインストールした場合は、代わりに以下に示すインラインの docker build コマンドを使用してください。
1

デフォルトイメージをビルドする

ソースチェックアウトから:
scripts/sandbox-setup.sh
npm インストールから(ソースチェックアウトは不要):
docker build -t openclaw-sandbox:bookworm-slim - <<'DOCKERFILE'
FROM debian:bookworm-slim
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y --no-install-recommends \
  bash ca-certificates curl git jq python3 ripgrep \
  && rm -rf /var/lib/apt/lists/*
RUN useradd --create-home --shell /bin/bash sandbox
USER sandbox
WORKDIR /home/sandbox
CMD ["sleep", "infinity"]
DOCKERFILE
デフォルトイメージには Node は含まれません。Skill が Node(または他のランタイム)を必要とする場合は、カスタムイメージに焼き込むか、sandbox.docker.setupCommand 経由でインストールしてください(ネットワーク egress + 書き込み可能なルート + root ユーザーが必要です)。openclaw-sandbox:bookworm-slim が見つからない場合でも、OpenClaw はプレーンな debian:bookworm-slim を暗黙に代替として使用しません。デフォルトイメージを対象にしたサンドボックス実行は、ビルドするまでビルド手順を表示して即座に失敗します。これは、バンドルされたイメージがサンドボックスの write/edit ヘルパー用に python3 を含んでいるためです。
2

任意: 共通イメージをビルドする

一般的なツール(たとえば curl, jq, Node 24, pnpm, python3, git)を含む、より機能的なサンドボックスイメージを使う場合:ソースチェックアウトから:
scripts/sandbox-common-setup.sh
npm インストールからは、まずデフォルトイメージをビルドし(上記参照)、その後リポジトリの scripts/docker/sandbox/Dockerfile.common を使って、その上に共通イメージをビルドします。その後、agents.defaults.sandbox.docker.imageopenclaw-sandbox-common:bookworm-slim に設定します。
3

任意: サンドボックスブラウザ用イメージをビルドする

ソースチェックアウトから:
scripts/sandbox-browser-setup.sh
npm インストールからは、リポジトリの scripts/docker/sandbox/Dockerfile.browser を使ってビルドします。
デフォルトでは、Docker サンドボックスコンテナは ネットワークなし で実行されます。agents.defaults.sandbox.docker.network で上書きできます。
バンドルされたサンドボックスブラウザイメージは、コンテナ化されたワークロード向けに保守的な Chromium 起動フラグを適用します:
  • --remote-debugging-address=127.0.0.1
  • --remote-debugging-port=<derived from OPENCLAW_BROWSER_CDP_PORT>
  • --user-data-dir=${HOME}/.chrome
  • --no-first-run
  • --no-default-browser-check
  • --disable-dev-shm-usage
  • --disable-background-networking
  • --disable-breakpad
  • --disable-crash-reporter
  • --no-zygote
  • --metrics-recording-only
  • --password-store=basic
  • --use-mock-keychain
  • --headless=newbrowser.headless が有効な場合。
  • --no-sandbox --disable-setuid-sandboxbrowser.noSandbox が有効な場合。
  • --disable-3d-apis, --disable-gpu, --disable-software-rasterizer はデフォルトです。これらのグラフィックス強化フラグは、GPU サポートのないコンテナに役立ちます。ワークロードが WebGL やその他の 3D 機能を必要とする場合は、OPENCLAW_BROWSER_DISABLE_GRAPHICS_FLAGS=0 を設定してください。
  • --disable-extensions はデフォルトです。拡張機能に依存するフローでは OPENCLAW_BROWSER_DISABLE_EXTENSIONS=0 を設定してください。
  • --renderer-process-limit=2 はデフォルトです。OPENCLAW_BROWSER_RENDERER_PROCESS_LIMIT=<N> で制御され、0 は Chromium のデフォルトを保持します。
別のランタイムプロファイルが必要な場合は、カスタムブラウザイメージを使用し、独自のエントリポイントを指定してください。ローカル(非コンテナ)の Chromium プロファイルでは、browser.extraArgs を使って追加の起動フラグを付加します。
  • network: "host" はブロックされます。
  • network: "container:<id>" はデフォルトでブロックされます(名前空間参加のバイパスリスク)。
  • 緊急時の上書き: agents.defaults.sandbox.docker.dangerouslyAllowContainerNamespaceJoin: true
Docker インストールとコンテナ化された Gateway はこちらです: Docker Docker Gateway デプロイでは、scripts/docker/setup.sh がサンドボックス設定をブートストラップできます。そのパスを有効にするには OPENCLAW_SANDBOX=1(または true/yes/on)を設定します。ソケットの場所は OPENCLAW_DOCKER_SOCKET で上書きできます。完全なセットアップと env リファレンス: Docker

setupCommand(一度だけのコンテナセットアップ)

setupCommand はサンドボックスコンテナが作成された後に 一度だけ 実行されます(毎回の実行ではありません)。コンテナ内で sh -lc 経由で実行されます。 パス:
  • グローバル: agents.defaults.sandbox.docker.setupCommand
  • エージェント単位: agents.list[].sandbox.docker.setupCommand
  • デフォルトの docker.network"none"(egress なし)なので、パッケージのインストールは失敗します。
  • docker.network: "container:<id>" には dangerouslyAllowContainerNamespaceJoin: true が必要で、緊急時専用です。
  • readOnlyRoot: true は書き込みを防ぎます。readOnlyRoot: false を設定するか、カスタムイメージに焼き込んでください。
  • パッケージインストールには user が root である必要があります(user を省略するか、user: "0:0" を設定)。
  • サンドボックス exec はホストの process.env を継承しません。Skill API キーには agents.defaults.sandbox.docker.env(またはカスタムイメージ)を使用してください。
  • agents.defaults.sandbox.docker.env の値は、明示的な Docker コンテナ環境変数として渡されます。Docker デーモンにアクセスできる人は誰でも、docker inspect などの Docker メタデータコマンドでそれらを検査できます。そのメタデータ露出が許容できない場合は、カスタムイメージ、マウントされたシークレットファイル、または別のシークレット配信経路を使用してください。

ツールポリシーとエスケープハッチ

ツールの allow/deny ポリシーは、サンドボックスルールより前に引き続き適用されます。ツールがグローバルまたはエージェント単位で拒否されている場合、サンドボックス化しても復活しません。 tools.elevated は、サンドボックス外で exec を実行する明示的なエスケープハッチです(デフォルトは gateway、exec ターゲットが node の場合は node)。/exec ディレクティブは承認された送信者にのみ適用され、セッション単位で永続化されます。exec を強制的に無効化するには、ツールポリシー deny を使用してください(サンドボックス vs ツールポリシー vs 昇格 を参照)。 デバッグ:
  • openclaw sandbox list は、サンドボックスコンテナ、ステータス、イメージ一致、経過時間、アイドル時間、関連付けられたセッション/エージェントを表示します。
  • openclaw sandbox explain [--session <key>] [--agent <id>] は、有効なサンドボックスモード、ホストワークスペース、ランタイム workdir、Docker マウント、ツールポリシー、修正用の設定キーを検査します。その workspaceRoot フィールドは設定されたサンドボックスルートのままです。effectiveHostWorkspaceRoot はアクティブなワークスペースが実際に存在する場所を示します。
  • openclaw sandbox recreate [--all | --session <key> | --agent <id>] [--browser] [--force] は、次回使用時に現在の設定で再作成されるよう、コンテナ/環境を削除します。
  • 「なぜこれはブロックされているのか?」というメンタルモデルについては、サンドボックス vs ツールポリシー vs 昇格 を参照してください。

マルチエージェントの上書き

各エージェントはサンドボックス + ツールを上書きできます: agents.list[].sandboxagents.list[].tools(サンドボックスツールポリシー用の agents.list[].tools.sandbox.tools も含む)。優先順位については、マルチエージェントのサンドボックスとツール を参照してください。

最小有効化例

{
  agents: {
    defaults: {
      sandbox: {
        mode: "non-main",
        scope: "session",
        workspaceAccess: "none",
      },
    },
  },
}

関連