本文へスキップ
メニュー
自分に必要?エージェントが手元のマシンで触れられるもの仕組みエージェントとシステムの間にある層比較組み込みサンドボックス、Docker、VM設定タスクに必要なものだけを開けるセキュリティ脅威モデルとその限界インストール
インストール

インストールして、中を見て、エージェントを動かす

ai-jailは1つのプログラムで、デーモンもrootも要りません。インストールして、いつも打っているコマンドの前にその名前を置けば、エージェントはサンドボックスの中で起動します。

インストール

コマンドラインツールを普段入れている方法を選んでください。どの方法でも、同じ単一のai-jailプログラムが入ります。

terminal
brew tap akitaonrails/tap && brew install ai-jail

macOSとLinuxで使えます。

システムに必要なもの

Linux

bubblewrapをインストールしてください。ai-jailがサンドボックスの構築に使う小さなプログラムです。ほとんどのディストリビューションではbubblewrapという名前でパッケージになっています。

terminal
pacman -S bubblewrapapt install bubblewrapdnf install bubblewrap

macOS

インストールするものはありません。ai-jailはmacOSに付属のsandbox-execを使います。Appleはこのインターフェースを非推奨としています。

Windows

対応していません。WSL2を使い、その中でLinuxの手順に従ってください。

最初の実行

3つのコマンドで、計画の確認、中の見学、実際に動くエージェントまで進みます。ai-jailは、指定するまで何も開けません。

左から右へ3枚のパネル。「ドライラン」では、独房は破線の輪郭だけで、エージェントは外で待っています。「中を見て回る」では、独房が実体になり、中にターミナルとプロジェクトフォルダがあります。「エージェントを実行」では、エージェントとプロジェクトが中にあり、壁にはネットワーク用とエージェントのログイン用の2つの開口部があります。ホームフォルダは3枚とも外にあり、格子がかかっています。
ホームディレクトリはどのステップでも外にあります。何かを開けるのは最後のステップだけで、開けるのはクラウド型のエージェントに必要な2つだけです。
  1. 何も実行せずに計画を見る

    プロジェクトに移動して、ドライランを実行します。ai-jailは、使うはずのサンドボックスコマンドを表示して終了します。ドライランがファイルを書き込むことはありません。

    ドライラン
    cd ~/Projects/my-appai-jail --dry-run claude
  2. 中を見て回る

    ジェイルの中で普通のシェルを起動します。プロジェクトは実際のパスにあり、編集もできます。ホームディレクトリは新しい空のもので、シェルのトークンは消えています。出るにはexitと打ちます。

    ジェイルの中のシェル
    ai-jail bash
  3. 必要な2つを付けてエージェントを動かす

    クラウドのモデルと通信するエージェントには、モデルに接続するためのネットワークと、あなたが誰かを証明するための保存済みログイン情報が必要です。どちらもデフォルトでは無効なので、--network--agent-stateで有効にします。バージョン1.22以降、既知のエージェントをどちらかなしで起動すると、ai-jailは足りないフラグの名前を警告に表示します。

    本番の実行
    ai-jail --network --agent-state claude
  4. そのエージェントのデフォルトにする

    この2つの設定を、あなた自身の設定ファイル~/.ai-jailに、エージェントの名前の下に書きます。以降は短いコマンドだけで足ります。プロジェクト内にできることがある.ai-jailファイルは、ジェイルを厳しくすることしかできません。ネットワークやログインを有効にすることはできないので、cloneしたリポジトリが自分でジェイルを開けることはありません。

    ~/.ai-jail
    [commands.claude]network = trueagent_state = true # from now on, in any project:# ai-jail claude

中で見えるもの

プロンプトは(jail)に変わり、プロジェクトはいつもの場所にあります。盗む価値のあるものは見当たりません。

ai-jail bash、Linuxの場合
$ ai-jail bash# プロジェクトは実際のパスにある(jail) ~/Projects/my-app $ pwd/home/you/Projects/my-app# シェルでexportしたトークンは付いてこない(jail) ~/Projects/my-app $ echo $GITHUB_TOKEN # このホームにあなたの鍵はない(jail) ~/Projects/my-app $ cat ~/.ssh/id_ed25519cat: /home/you/.ssh/id_ed25519: No such file or directory# ジェイルには専用のホスト名がある(jail) ~/Projects/my-app $ hostnameai-sandbox

これはLinuxでのセッションです。macOSには別のファイルツリーを組み立てる手段がないので、同じパスは存在しますが、読み取りが拒否されます。

独房の中からの眺め。エージェントは大きく明るいプロジェクトフォルダの隣にいて、その後ろに空のホームとシステムのツールがあります。格子の外には、SSH鍵、クラウドのログイン、ほかのプロジェクト、ネットワークが暗く、格子がかかった状態で並んでいます。

中から見ると、あなたのもので存在するのはプロジェクトだけです。ネットワークも、--networkを渡すまでは外にあります。

起動しないとき

READMEのトラブルシューティングにあるケースと、つまずく人の多いセットアップ上のルール2つを取り上げます。

bwrap: setting up uid map: Permission denied

Ubuntu 24.04以降とDebian 13以降には、プログラムがrootなしでユーザー名前空間を作ることを禁じるAppArmorポリシーが入っています。bubblewrapはまさにその方法でジェイルを隔離しています。この種のrootなしのツールはどれも影響を受けます。システム全体で緩めるには次のようにします。

terminal
echo 'kernel.apparmor_restrict_unprivileged_userns=0' \  | sudo tee /etc/sysctl.d/60-userns.confsudo sysctl --system

ポリシーは残して、bwrapだけを対象外にすることもできます。次の内容を/etc/apparmor.d/bwrapとして保存し、sudo apparmor_parser -r /etc/apparmor.d/bwrapを実行してください。

/etc/apparmor.d/bwrap
abi <abi/4.0>,include <tunables/global>profile bwrap /usr/bin/bwrap flags=(unconfined) {  userns,}

BWRAP_BINが拒否される

BWRAP_BINを使うと、特定のbubblewrapをai-jailに指定できます。ai-jailが受け入れるのは、解決先が、rootが所有しほかのユーザーが書き込めないプログラムである場合か、標準的なマルチユーザーの/nix/store内にある場合だけです。自分のホームに置いたコピーは拒否されます。そのファイルを差し替えられる人なら誰でも、ジェイルを支配できてしまうからです。

中でmiseのツールが見つからない

ai-jailはmiseを見つけると有効化します。しかし、新しいホームにはmiseの設定もインストール済みのツールもないため、有効化をスキップします。自分の設定ファイルで、両方を読み取り専用でマップしてください。

~/.ai-jail
[commands.claude]ro_maps = ["~/.config/mise", "~/.local/share/mise"]

起動時にFailed to create stream fdと出る

miseのセットアップ中に、Ubuntuデスクトップのログインスクリプトが出すメッセージです。害はなく、miseは問題なく動きます。--no-miseを渡せば、miseのセットアップごとこのメッセージも出なくなります。

terminal
ai-jail --no-mise claude

エージェント別

ai-jailは、各エージェントがログイン情報をどこに保存するかを知っています。--agent-stateは、起動するエージェントのフォルダだけを、存在する場合に限ってマウントします。

実行するコマンド--agent-stateがマウントするもの知っておくとよいこと
ai-jail claude~/.claude
~/.claude.json
2つ目のClaudeプロファイルを使うには、--claude-dirでそのディレクトリを指定します。
ai-jail codex~/.codexウィンドウをリサイズすると、画面が描き直されるよう、ai-jailがCodexに再描画のキーを送ります。
ai-jail opencode~/.config/opencode
~/.local/share/opencode
ai-jail gemini~/.gemini
ai-jail ai-memory run claude起動されるエージェントのフォルダai-jailは、ai-memoryが起動するエージェントを認識して、そのエージェントの設定を適用します。2つのプログラムは同じジェイルに入ります。

crushgrokjcodepiaidersoulforgeomp、各種のkimiコマンドでも同じように動きます。それ以外のコマンドも実行できます。ジェイルは同じで、ログイン用のフォルダはマウントされません。

エージェントを檻の中に

ai-jailは単一のバイナリで、デーモンもroot権限も要りません。いつものコマンドの前に1語足すだけです。

terminal
brew tap akitaonrails/tap && brew install ai-jailai-jail claude