shell.exec は ls には問題
ありませんが、rm -rf / には大惨事です。db.query はレプリカに対しては問題
ありませんが、prod に対しては責任問題です。違いは引数の中にあり、ツール名
ルールはそれを見られません。
ファイアウォールの引数句(args_match_json)はそのギャップを埋めます。ツール
呼び出しのためにモデルが選んだ具体的な引数を検査し、その値から判定を決定します —
そのためツールを広く許可しつつ、それが取りうる 1 つの危険な形を deny できます。
このページはそれらの句を作成するための焦点を絞ったガイドです;完全なルール語彙に
ついてはファイアウォールルールを、その周りのポリシー
モデルについてはファイアウォールを参照してください。
引数値はモデルがツールをどう呼び出すかを選んだ後にのみ存在するため、引数句は
response と mcp のステージに属します。inbound
では — エージェントがツール定義のみをアドバタイズする — チェックする呼び出し時の
引数がありません。1. いつツール呼び出しの引数を検証するか
ツールが一般的には安全だが特定の形で危険なときはいつでも、引数句に手を伸ばします:破壊的なコマンド
shell.exec を許可しつつ、コマンドが rm -rf、mkfs、dd if= にマッチするとき
deny。本番のブラスト半径
db.query を許可しつつ、接続ターゲットが prod のとき deny(または承認のための
保留)。内部宛先
フェッチツールを許可しつつ、その
url/ip 引数が RFC-1918 範囲またはクラウド
メタデータ IP に入るとき deny。過大な操作
バルクツールを許可しつつ、
limit または count 引数が数値上限を超えるとき deny。2. 句セットの形
args_match_json は JSON エンコードされた文字列で、そのデコードされた値は
clauses のリストを保持するオブジェクトです。各句は { path, op, value } の組であり、
すべての句が AND されます — すべての句が真のときのみルールが発火します。デコード
すると、値は次のようになります:
"args_match_json": "{\"clauses\":[{\"path\":\"$.command\",\"op\":\"regex\",\"value\":\"rm -rf\"}]}"。
空または不在の args_match_json は空虚に真です — ルールはツール名グロブ単独で
マッチし、名前のみのルールと全く同じです。
3. 演算子
7 つの演算子が閉じた語彙を構成します。コンソールは保存時に演算子とその値の形を検証 するため、不正な形の句が永続化されることはありません。| 演算子 | マッチする条件 |
|---|---|
eq | スカラー等価(数値は数値として比較;型不一致はマッチなし)。 |
contains | 部分文字列 — 両オペランドが文字列でなければならない。 |
regex | Go RE2 パターンが文字列値にマッチ(線形時間、後方参照なし)。 |
in | 値が与えられた JSON 配列の要素である。 |
cidr_match | 文字列 IP が与えられた CIDR に入る。 |
gt / lt | 数値の greater-than / less-than(文字列は強制変換されない)。 |
4. パス構文
句のpath は、ツールの引数オブジェクトに対する小さな JSONPath サブセットです:
$.foo, $.foo.bar — フィールドアクセス
$.foo, $.foo.bar — フィールドアクセス
トップレベルまたはネストしたオブジェクトフィールドを名前で読みます。
$.foo[0], $.arr[1].k — 配列インデックス
$.foo[0], $.arr[1].k — 配列インデックス
配列にインデックスし、オプションで要素のフィールドへ続けます。
$ — 引数オブジェクト全体
$ — 引数オブジェクト全体
引数 blob 全体に対してマッチ(粗いスキャンには
contains または regex と
組み合わせて便利)。5. 実践例
エージェントにshell.exec を自由に実行させるが、再帰的な強制削除は決してシェルに
到達してはならないとします。コマンド引数が破壊的に見えるときのみ shell.exec を
deny する 1 つの response ステージルールを作成します。
ルールエディタを開く
コンソールで、エージェントのキーにアタッチされたファイアウォールポリシー(または
ワークスペースデフォルト)を開き、ルールを追加します。ポリシーの編集は
Developer+ のアクションです — メンバーはポリシーを読めますが書けません。
response ステージでツールをマッチする
ステージを
response に、ツールグロブを shell.exec に設定します。response
ステージは、句が必要とするモデルが選んだ引数を運びます。引数句を追加する
$.command に 1 つの regex 句を追加し、判定を deny に設定します:args_match_json は JSON エンコードされた文字列です;そのデコードされた値は
§2 で示した { "clauses": [ … ] } オブジェクトです。依存する前にドライランする
Test タブを使って、サンプルの
shell.exec
呼び出しに対してルールを評価します。判定、マッチしたルール、理由を返します — 何も
ディスパッチされず、何も永続化されません。"command": "ls -la" の shell.exec は以前と同様に流れ、"command": "rm -rf /var"
は deny されます。response 上の deny は、モデルがツールエラーを見て反応できるように
します — 別のツールを選ぶ、ユーザーに尋ねる、あるいは停止する — クラッシュする代わりに。
6. 句はフェイルクローズする — リクエストではなくルールが
句が評価できない場合 — パスが解決しない、引数が不正な形、正規表現 / CIDR が無効 — 句は false に評価され、ルールは単に発火しません。呼び出しは次のルールまたは ポリシーのdefault_verdict に落ちます。壊れた句は決して自動 deny せず、リレーを
決して乱しません。
7. 句をルールの残りと組み合わせる
引数句はルールが表現する他のすべてとスタックします — それらはいくつかの中の 1 つの AND された条件です:| 組み合わせ先 | 効果 |
|---|---|
tool_name_glob | 句はツール名がマッチした後にのみ実行 — 名前が先、引数が後。 |
skill_name_glob | 所有スキルによって同じツールの引数を異なってゲート(例:community.* でより厳格)。 |
verdict | 句を deny だけでなく deny、sanitize、pending_approval、cap_cost と組み合わせ。 |
| 複数の句 | すべて成立しなければならない — regex コマンドチェックと in 環境チェックを組み合わせ、deny を厳密にスコープ。 |
8. これがどこに収まるか
ファイアウォールルール
完全なルールリファレンス — グロブ、句、サニタイザ、egress、シーケンス。
引数クックブック
一般的な危険な形のためのコピペ
args_match_json レシピ。ファイアウォールステージ
なぜ引数句が
inbound ではなく response と mcp に存在するか。ツールをブロック
どの引数も安全でないとき、ツールを完全に deny。
