Piのサンドボックス機能

2026年7月25日

はじめに

Piは、デフォルトでは、よくも悪くもガードレールのような余計な機能がない。さすがに危ないので、サンドボックス機能を検討する。

環境

  • Ubuntu 22.04 LTS
  • Pi v0.82.0

セットアップ

こちら を参考にセットアップする。先にripgrep、socatを入れる。

$ sudo apt install ripgrep
$ sudo apt install socat

pi-sandboxのインストール

$ pi install npm:pi-sandbox

Piを起動して、設定を確認。

$ pi
> /sandbox

 Sandbox Configuration
   Project config: /home/penguin/work/agents_md/.pi/sandbox.json
   Global config:  /home/penguin/.pi/agent/sandbox.json

 Network (bash + !cmd):
   Allowed domains: npmjs.org, *.npmjs.org, registry.npmjs.org, registry.yarnpkg.com, pypi.org, *.pypi.org,
 github.com, *.github.com, api.github.com, raw.githubusercontent.com
   Denied domains:  (none)

 Filesystem (bash + read/write/edit tools):
   Deny Read:   /Users, /home
   Allow Read:  ., ~/.config, ~/.local, Library
   Allow Write: ., /tmp
   Deny Write:  .env, .env.*, *.pem, *.key

 Note: ALL reads are prompted unless the path is in allowRead or allowWrite.
 Note: allowWrite also grants read access to the same path.
 Note: denyRead is not a hard-block — granting a prompt adds to allowRead, overriding denyRead. 
 Note: denyWrite takes PRECEDENCE over allowWrite and is never prompted.

どういう意味なのかご本人に解説してもらう。

# Sandbox Configuration 解説

## ネットワーク設定 (Network)

`bash`コマンドと`read/write/edit`ツールからアクセスできるドメインを制限しています。

**許可ドメイン:**
- `npmjs.org` / `registry.npmjs.org` / `yarnpkg.com` → npmパッケージのインストール
- `pypi.org` → Pythonパッケージのインストール
- `github.com` / `api.github.com` / `raw.githubusercontent.com` → GitHubからのファイル取得

**拒否ドメイン:** なし(デフォルトで全てブロックされる)

## ファイルシステム設定 (Filesystem)

| ルール | 内容 |
|--------|------|
| **Deny Read** | `/Users`, `/home` 以下の読み取りを禁止 |
| **Allow Read** | 現在のディレクトリ(`.`)、`~/.config`, `~/.local`, `Library` の読み取りを許可 |
| **Allow Write** | 現在のディレクトリ(`.`)、`/tmp` への書き込みを許可 |
| **Deny Write** | `.env`, `.env.*`, `*.pem`, `*.key` への書き込みを**絶対に禁止** |

## 重要な注意点

1. **読み取りは全てプロンプトが必要** — `allowRead`または`allowWrite`に含まれるパス以外を読み取る際、毎回ユーザーの許可を求める
2. **`allowWrite`は読み取りも兼ねる** — 書き込みが許可されたパスは読み取りも可能
3. **`denyRead`はハードブロックではない** — プロンプトで許可を与えると、`denyRead`をオーバーライドして読み取り可能になる
4. **`denyWrite`は最優先** — 書き込み禁止ファイルにはプロンプトすら出ず、絶対に書き込みできない

## 要約

現在のプロジェクトディレクトリ内と一部の設定ファイルは自由に扱えるが、他システムのファイル(`/home`以下など)は都度許可が必要。機密ファイル(`.env`, `.key`等)への書き込みは完全に禁止。ネットワークアクセスもパッケージリポジトリとGitHubに限定されています。

設定の例: ~/.pi/agent/sandbox.json

{
  "enabled": true,
  "allowBrowserProcess": true,
  "network": {
    "allowLocalBinding": true,
    "allowAllUnixSockets": true,
    "allowUnauthenticatedSocksProxy": true,
    "allowedDomains": ["github.com", "*.github.com"],
    "deniedDomains": []
  },
  "filesystem": {
    "denyRead": ["/Users", "/home"],
    "allowRead": [".", "~/.config", "~/.local", "Library"],
    "allowWrite": [".", "/tmp"],
    "denyWrite": [".env", ".env.*", "*.pem", "*.key"]
  }
}