メインコンテンツへスキップ
ツールを名指しして deny するのは鈍いです:すべての呼び出しでツールを殺します。 ほとんどの場合ツールは問題なく、呼び出しの 1 つの形が問題です — shell.exec は コマンドが rm -rf になるまで問題なく、db.queryprod に当たるまで問題ありません。 その区別こそ引数句が表現するものです:エージェントが渡すにマッチする jsonpath ツール引数述語で、判定が 危険な呼び出しでのみ発火し、残りを放置します。 このページはクックブックです — 最もよく出てくるケースのためのひと握りのコピペ args_match_json レシピです。完全な句文法、演算子テーブル、フェイルクローズ セマンティクスについては、引数の検証ルールスキーマリファレンスを参照してください。

1. jsonpath ツール引数句がどう機能するか

ルールの args_match_json は、すべて AND されたのセットを運ぶ JSON エンコードされた文字列です。デコードされた値はオブジェクト {"clauses": [ … ]} で、 各句は { path, op, value } の組です:
  • path — ツールの引数オブジェクトに対する小さな JSONPath サブセット: $.command$.foo.bar$.items[0]、またはオブジェクト全体には $。 ワイルドカード、フィルタ、スライス、再帰下降はなし。
  • op — 閉じたセットのひとつ:eqcontainsregexincidr_matchgtlt
  • value — 比較対象のリテラル(文字列、数値、bool、または in の場合は JSON 配列)。
句はルールの tool_name_glob に AND されます:ルールはツール名がマッチしかつ すべての句が成立するときのみ発火します。args_match_json を完全に省略する(または 空の "{}" のままにする)と、ルールはグロブ単独でマッチします。
句はフェイルクローズする — リクエストではなくルールが。 パスが解決しない、引数が 不正な形、または値が誤った型の場合、句は false に評価され、ルールは単に発火 しません — 呼び出しは次のルールまたはデフォルト判定に落ちます。壊れた句は決して自動 deny しません。ハードなバックストップは、特定の方法で失敗することに頼る句ではなく、 プレーンなグロブ deny として書いてください。

2. レシピ:1 つの破壊的なコマンドをブロック

典型的なケース。shell.exec を一般的に許可し、コマンドが破壊的に見えるときのみ deny します。$.command への regex 句がそれを行います:
{
  "label": "block destructive shell commands",
  "tool_name_glob": "*.exec",
  "verdict": "deny",
  "args_match_json": "{\"clauses\":[{\"path\":\"$.command\",\"op\":\"regex\",\"value\":\"rm -rf|mkfs|dd if=\"}]}"
}
正規表現は Go RE2 です — 線形時間、後方参照なし、壊滅的なバックトラックなし — そのため すべてのツール呼び出しで実行しても安全です。非文字列の $.command(または欠落した もの)は決してマッチしないため、不正な形の呼び出しは誤ってブロックされるのではなく 落ちます。
固定の部分文字列をマッチしているときは regex より contains を優先してください — 読みやすく、エスケープされていないメタ文字に引っかかりません。本当に選択肢やアンカーが 必要なときのみ regex に手を伸ばします。

3. レシピ:名前付き環境に対してツールを deny

db.query を実行させるが、安全な接続に対してのみ — ターゲットが prod または replica のとき deny します。in 演算子は解決された値を JSON 配列の任意の要素に 対してマッチします:
{
  "label": "no agent queries against prod",
  "tool_name_glob": "db.query",
  "verdict": "deny",
  "args_match_json": "{\"clauses\":[{\"path\":\"$.connection\",\"op\":\"in\",\"value\":[\"prod\",\"replica\"]}]}"
}
in の値は JSON 配列でなければなりません — 非配列はルールを保存するときに 拒否されます。要素はスカラー等価で比較されるため、数値と文字列はそれぞれ自身の型に マッチします。

4. レシピ:プライベート IP またはメタデータ宛先を deny

ツールがターゲット IP を引数として取るとき、cidr_match はそれが CIDR に入るかを テストします — 「10.x またはクラウドメタデータアドレスを取得するエージェント」の SSRF の形です:
{
  "label": "deny tool calls aimed at RFC-1918",
  "tool_name_glob": "*",
  "verdict": "deny",
  "args_match_json": "{\"clauses\":[{\"path\":\"$.target_ip\",\"op\":\"cidr_match\",\"value\":\"10.0.0.0/8\"}]}"
}
引数値は CIDR 内に収まる IP リテラルとしてパースされなければなりません;ホスト名や 非 IP 文字列は決してマッチしません。
cidr_matchすでにツール引数の中にある値のみを検査します。ツールがネットワーク層で 実際に到達する宛先を統制する — host/CIDR の allow・deny リスト — には、代わりに egress サーフェス上の専用egress ルールを 使います。両者は補完的です:入りでの引数検査、出での egress 制御。

5. レシピ:数値引数を上限する

gtlt は数値を比較します。それらを使って、不合理なバッチサイズ、過大な limit、 あるいは暴走する count を拒否します — ここでは、100 行を超えるバルク削除を deny します:
{
  "label": "block large bulk deletes",
  "tool_name_glob": "*.bulk_delete",
  "verdict": "deny",
  "args_match_json": "{\"clauses\":[{\"path\":\"$.count\",\"op\":\"gt\",\"value\":100}]}"
}
両側が数値でなければなりません — "500" のような数値に見える文字列は型不一致で あり、マッチしません。そのためルールは文字列型の引数では発火しません。引数を数値に 保つか、ツールが見る前に正規化してください。

6. レシピ:句を組み合わせる(AND)

1 つのルール内のすべての句は AND されるため、判定を非常に特定の呼び出しに絞れます — 例えば、破壊的なコマンドかつ prod ホストに向けられているときのみ shell.exec を deny します:
{
  "label": "destructive shell on a prod host",
  "tool_name_glob": "*.exec",
  "verdict": "deny",
  "args_match_json": "{\"clauses\":[{\"path\":\"$.command\",\"op\":\"regex\",\"value\":\"rm -rf|drop table\"},{\"path\":\"$.host\",\"op\":\"in\",\"value\":[\"db-prod-1\",\"db-prod-2\"]}]}"
}
代わりに OR が必要?単一の args_match_json 内に OR はありません — 異なる優先度で 2 つのルール(または 2 つのグロブ)を作成します。エンジンは優先度順にルールを辿り、 最初にマッチしたものが勝ちますので、狭いルールを先に置きます。 ルール優先度を参照。

7. マッチした形のための判定を選ぶ

句はどの呼び出しがマッチするかを決定します;ルールの verdict は何が起こるかを 決定します。deny がクックブックのデフォルトですが、同じ句がより柔らかい判定を 運べます:
マッチした引数が危険な指示ではなくシークレットや PII を運ぶとき、sanitize は ツール引数からマッチした部分文字列をリダクトし、クリーニングされた呼び出しを 転送します。引数のみをリダクトします — ツールが返すコンテンツは決して触りません。 レスポンスのサニタイズを参照。
リスクのある形を完全にブロックする代わりに、ちょうどそれをレビューのために保留 します:レビュアーが帯域外で承認または拒否し、エージェントは承認された呼び出しを 一度再送信します。承認を参照。
句をチューニングする間、ブロックせずにマッチした呼び出しを記録するには、判定を audit に設定します。シャドウモードと 組み合わせて、deny が何かを変える前に実トラフィックに対して測定します。

8. 依存する前に句をテストする

コンソールの Test タブはサンプルのツール呼び出しに対してポリシーをドライランし、 判定、マッチしたルール、理由を返します — 何もディスパッチされず、何も永続化されません。 現実的な引数オブジェクトを貼り付け、値を解決できない句がサイレントに発火しないため、 句が意図した呼び出しのみで発火することを確認します。 ルールのテストを参照。
句は保存時に厳密に検証されます — 未知の演算子、不正なパス、非配列の in 値、 コンパイルできない正規表現、無効な CIDR はすべて拒否されるため、不正な形の句はそもそも 永続化できません。

9. 誰が引数句を作成できるか

これらすべてはセッション下のコンソールで実行されます(/api/workspace/firewall/*):
アクションロール
ポリシー、プリセット、discovered tools の読み取りMember
ルールの作成 / 編集 / 削除Developer+
Test サンドボックス(ポリシーのドライラン)Developer+
events と実行集計の読み取りDeveloper+
引数句の作成または変更は Developer+ の書き込みです。Test サンドボックスも Developer+ です — ドラフトポリシーに対してプレビューでき、その判定トレースは ポリシー名とルールラベルを公開するため、読み取り側ではなく書き込み側に位置します。

関連

引数の検証

引数マッチのユースケースの全容。

ツールをブロック

ツール全体を名前で deny — 句不要。

Egress 制御

アウトバウンドの host / IP / CIDR 宛先を統制。

ルールスキーマ

ルールが運べるすべてのフィールド。

ルール優先度

最初にマッチしたものが勝つ — 狭いものを広いものの前に並べる。

危険なツール呼び出し

これらのレシピが対処する脅威。