更新:2026/09/19

AIコーディングエージェント(Claude Code, OpenCode, Codex CLI等)を使っていると、しばしばAIエージェントからの権限確認が求められます。「このファイルを操作して良いですか?」という事をユーザーに確認する機能です。これによりエージェントが想定していないファイル操作をすることを未然に防止します。一方でユーザーの権限確認待ちで作業が進まないこともあります。例えばエージェントに指示を与えて別の作業をしていたら、全然進んでいなかった、というような事ですね。

最近はエージェント側でもこういった承認待ちを減らすための自動判断の仕組みが追加されていますが、他の方法としてエージェントの外側の仕組みで操作できるファイルを厳密にコントロールするという方法があります。こちらはエージェントによらず適用できるのがメリットです。

本稿ではLinux環境のFirejailを使うことで、OpenCodeのアクセス範囲を制限する方法を説明します。FirejailはLinux namespaceを利用した隔離機能(Sandbox)を提供するソフトウェアで、コンテナ等と比較して軽量であることが特徴です。以下のサンプルはOpenCode用ですが、Claude Code (CLI)や、Codex CLIでも参考になると思います。

なお、本稿は私の環境に合わせた設定ですので、他環境ではそのままでは適用できない(設定が不足する、もしくは緩すぎる)部分もあるはずです。設定をそのままコピーで利用せず、ご自身の責任の範囲で環境にあわせて利用方法を調整してください。

AIエージェントのファイルアクセス、ネットアクセスを制限する手法

あるプロセスのファイルアクセスやネットワークアクセスを外部から制限する方法は複数あります。

どのOSでも利用できる方法としては、権限をしぼった”AI用ユーザー”を作り、そのユーザーでエージェントを起動する方法です。ただ、この方法では各ディレクトリの権限を細かく調整していく必要があるのが大変ですし、通常ユーザーが作ってきた環境をAI用ユーザーに適切に渡すことにも工夫が必要です(例えばホームディレクトリに入れたツールはAI用ユーザーは参照できない)。

コンテナを使う方法もあります。より強い環境分離が可能であり、複数のエージェントを同時起動するような用途等、コンテナが適している場合も多いのですが、アクセス可能なファイルのマウントや環境変数の引き渡し、またコンテナ起動のオーバーヘッド等、準備すべき内容がずっと多くなります。

Firejailは上記とは違い、一般ユーザーIDのまま、アクセス可能なファイルやネットワークを制限します。環境変数や$HOME等もそのままなので、いつも使っているツールをエージェントに簡単に与えることができ、今回のような用途では便利です。Firejail以外だとbubblewrapも同様のことが実現できます。

他OSにおいては、例えばmac OS環境ではnonoが便利です。Windows環境では類似のものが見つけられていないのですが、AI用ユーザーを作るか、もしくはWSL2を一種の隔離環境として使う等が考えられます。

Firejailの導入

Firejailの導入は簡単です。詳細はgithubページにありますが、Ubuntu/DebianであればReleaseビルドにdebファイルが含まれるので、それを導入するだけです。今回はv0.9.80を利用しました。なおaptでも導入できますが、バージョンが古いため、GithubからReleaseバイナリを取得して導入することが推奨されています。

> wget "https://github.com/netblue30/firejail/releases/download/0.9.80/firejail_0.9.80_1_amd64.deb"
> sudo dpkg -i firejail_0.9.80_1_amd64.deb
> firejail --version
firejail version 0.9.80
Compile time support:
- always force nonewprivs support is disabled
- AppArmor support is enabled
- AppImage support is enabled
- chroot support is enabled
- D-BUS proxy support is enabled
- file transfer support is enabled
- Landlock support is enabled
- networking support is enabled
- output logging is enabled
- private-home support is enabled
- private-lib support is disabled
- sandbox check is enabled
- SELinux support is disabled
- user namespace support is enabled
- X11 sandboxing support is enabled

OpenCode用プロファイルの準備

Firejailは、デフォルトだとほぼ何も禁止されていない状態であり、用途別に設定ファイル(プロファイル)を作成します。プロファイルはデフォルトでは ~/.config/firejail/以下が参照されます。

以下が私の環境での~/.config/firejail/opencode.profile です。これは環境によって異なるので、あくまで以下は私の環境用であり、環境にあわせて修正する必要がある点に注意してください。

設定しているのは、以下のような内容です。

  1. private-dev : null、zero、random、urandom、tty、stdin/stdout/stderrといった最小限の/dev/*へのアクセスを許可
  2. nosound, nodvd等 : 不要な機能を禁止
  3. root関連操作の禁止(sudoも)
  4. Networkは許可
  5. ~/projects/以下は読み書きを許可
  6. ホームディレクトリの中で、opencodeが動作するために必要なファイルやディレクトリのみ許可
  7. その他ツール(git, uv, cargo等)が動作するために必要なファイルやディレクトリを許可

という内容になっています。特に4以降は環境によって大きく異なる部分かと思います。例えば私の場合は ~/.ssh への許可を与えていません。これはエージェントにSSHを使う処理をさせないためです。一方で、~/.aws は一部読み書きを許可しています。このため別途aws cli側の設定で適切な権限(IAMロール)を使うようにする設定が必要です。また、private tmpはコメントアウトしています。これは/tmpが共有されていることを前提に動作するツールを使う必要があるためですが、そうでなければ private tmpは有効化したままで使う方が隔離の観点では望ましいです。

# opencode Firejail Profile
# Secure execution environment for opencode AI coding assistant
#
# Install: sudo apt install firejail
# Deploy: stow firejail
# Usage: firejail --profile=opencode opencode
#
# Profile lookup: ~/.config/firejail/<binary-name>.profile
# ============================================
# Basic Sandbox
# ============================================
#private-tmp
private-dev
# ============================================
# Disable Unnecessary Hardware/Features
# ============================================
nodvd
notv
nosound
nou2f
novideo
no3d
nogroups
# ============================================
# allow dbus secrets access
# ============================================
dbus-user filter
dbus-user.talk org.freedesktop.secrets
# ============================================
# Security Hardening
# ============================================
seccomp
nonewprivs
caps.drop all
noroot
# ============================================
# Network
# ============================================
# ALLOWED - required for LLM API calls and git operations.
# To restrict with a custom netfilter, uncomment:
# netfilter /etc/firejail/opencode.net
# ============================================
# Home Directory Whitelist
# ============================================
# --- opencode core ---
whitelist ~/.opencode
whitelist ~/.config/opencode
whitelist ~/dotfiles
whitelist ~/.local/share/opencode
whitelist ~/.local/share/OpenCode
whitelist ~/.local/share/ai.opencode.desktop
whitelist ~/.local/share/opentui
whitelist ~/.local/state/opencode
whitelist ~/.cache/OpenCode
whitelist ~/.cache/ai.opencode.desktop
whitelist ~/.cache/opencode
# --- mise configuration, installations, and cache ---
whitelist ~/.config/mise
whitelist-ro ~/.local/share/mise
whitelist ~/.cache/mise
# --- tuicr configuration and review sessions ---
whitelist ~/.config/tuicr
whitelist ~/.local/share/tuicr
# --- project directories ---
whitelist ~/project
# --- git ---
whitelist ~/.gitconfig
whitelist ~/.config/gh
whitelist ~/.config/git
whitelist ~/.cache/git
# --- Rust / Cargo ---
whitelist ~/.cargo
whitelist ~/.rustup
# --- Go ---
whitelist ~/go
whitelist ~/.cache/go-build
whitelist ~/.cache/goimports
whitelist ~/.cache/gopls
# --- Node.js ---
whitelist ~/.npm
whitelist ~/.cache/node-gyp
whitelist ~/.cache/typescript
# --- Python / uv ---
whitelist ~/.local/bin
read-only ~/.local/bin
whitelist ~/.local/share/uv
whitelist ~/.config/uv
whitelist ~/.ruff_cache
# --- AWS CLI ---
whitelist ~/.aws
read-only ~/.aws/config
# --- Other dev tools ---
whitelist ~/.local/share/zoxide
whitelist ~/.cache/tree-sitter

OpenCode用プロファイルでテスト起動

上記プロファイルを適用した状態でプロセスを実行するには、以下のように実行します。

> firejail --profile=opencode <コマンド>

例えば firejail --profile=opencode bash と実行するとbashが起動します。この時、firejailから起動することによるオーバーヘッドはほとんど感じないと思います(私の格安Linux VPS環境でも30-40ms程度しかかかりません)。

制限された状態でbashが起動できるので、どこまでアクセスできるのか確認すると良いでしょう。例えば ls ~/.ssh 等とすると、あるはずのディレクトリが見えなくなっているのが確認できます。

問題なさそうであればいったんbashを終了してから、firejailでopencodeを起動します。プロファイル名と実行コマンドが同じ場合は、--profileを省略できます。

> firejail opencode

上記をalias登録しておくのも良いでしょう。あとはOpenCodeの設定ファイルで、権限を与える範囲を調整して使ってください。

[参考] OpenCodeをYOLOモード(権限確認不要)で利用する

これは、すべての環境にお勧めできる方法ではないのですが、私の個人プロジェクトでは、VPSサーバー(GreenCloudで借りている格安サーバー)の中で、Firejailを有効にしつつ、OpenCodeには許可確認を一切不要にする設定(いわゆるYOLOモード)を試しています。

OpenCode v1.17.12からAuto mode が--autoと指定することで利用可能になったので、以下のように.bashrcにaliasを指定しています。Auto modeは明示的に禁止されたもの以外はユーザーに許可確認をせずに実行するモードです。

alias opencode-yolo='firejail --profile=opencode opencode --auto'

また、OpenCodeでは環境変数OPENCODE_CONFIG_CONTENTを使うと、設定ファイルの一部を上書きできるので(この変数の内容が最後に参照される)、以下のようにする方法もあります。

alias opencode-yolo='firejail --profile=opencode env OPENCODE_CONFIG_CONTENT='\''{"permission":{"*":"allow"}}'\'' opencode'

[参考] OpenCode v2への対応

基本的に利用するファイルやディレクトリは変わっていないので、OpenCode v1からv2に移行した場合でもfirejail設定は変更しなくて良いのですが、v2からOpenCodeエージェントの稼働(server)と、UI (TUI, GUI)が綺麗に分離され、serverを複数のUIから共有するデザインに変更されました。つまり、

project-aディレクトリでopencode (v2)を起動する => project-aディレクトリをカレントディレクトリとしてopencode serverが起動 => 別のシェルからproject-bディレクトリでopencodeを起動するとproject-aディレクトリ内に制限されたopencode serverに接続

という動きになるので、サンドボックスの境界が想定していない範囲になってしまいます。これを避けるには、--standaloneフラグを付けることで、そのTUI専用のopencode serverを起動することができます。また、--deterministic-shutdownオプションを付けることで、TUI終了時にServerプロセスを確実にシャットダウンできます。

firejail --profile=opencode --deterministic-shutdown opencode --auto --standalone

私の場合はmiseのtaskに以下のように登録して利用しています。

[tasks.opencode-yolo-standalone]
description = "Run OpenCode in Firejail with auto approval (stand alone)"
run = "firejail --profile=opencode --deterministic-shutdown opencode --auto --standalone \"$(pwd -P)\""
dir = "{{cwd}}"
raw = true
raw_args = true

コメントを残す