shell.exec は
コマンドが rm -rf になるまで問題なく、db.query は prod に当たるまで問題ありません。
その区別こそ引数句が表現するものです:エージェントが渡す値にマッチする
jsonpath ツール引数述語で、判定が
危険な呼び出しでのみ発火し、残りを放置します。
このページはクックブックです — 最もよく出てくるケースのためのひと握りのコピペ
args_match_json レシピです。完全な句文法、演算子テーブル、フェイルクローズ
セマンティクスについては、引数の検証と
ルールスキーマリファレンスを参照してください。
1. jsonpath ツール引数句がどう機能するか
ルールのargs_match_json は、すべて AND された句のセットを運ぶ JSON
エンコードされた文字列です。デコードされた値はオブジェクト {"clauses": [ … ]} で、
各句は { path, op, value } の組です:
path— ツールの引数オブジェクトに対する小さな JSONPath サブセット:$.command、$.foo.bar、$.items[0]、またはオブジェクト全体には$。 ワイルドカード、フィルタ、スライス、再帰下降はなし。op— 閉じたセットのひとつ:eq、contains、regex、in、cidr_match、gt、lt。value— 比較対象のリテラル(文字列、数値、bool、またはinの場合は JSON 配列)。
tool_name_glob に AND されます:ルールはツール名がマッチしかつ
すべての句が成立するときのみ発火します。args_match_json を完全に省略する(または
空の "{}" のままにする)と、ルールはグロブ単独でマッチします。
句はフェイルクローズする — リクエストではなくルールが。 パスが解決しない、引数が
不正な形、または値が誤った型の場合、句は false に評価され、ルールは単に発火
しません — 呼び出しは次のルールまたはデフォルト判定に落ちます。壊れた句は決して自動
deny しません。ハードなバックストップは、特定の方法で失敗することに頼る句ではなく、
プレーンなグロブ
deny として書いてください。2. レシピ:1 つの破壊的なコマンドをブロック
典型的なケース。shell.exec を一般的に許可し、コマンドが破壊的に見えるときのみ
deny します。$.command への regex 句がそれを行います:
$.command(または欠落した
もの)は決してマッチしないため、不正な形の呼び出しは誤ってブロックされるのではなく
落ちます。
3. レシピ:名前付き環境に対してツールを deny
db.query を実行させるが、安全な接続に対してのみ — ターゲットが prod または
replica のとき deny します。in 演算子は解決された値を JSON 配列の任意の要素に
対してマッチします:
in の値は JSON 配列でなければなりません — 非配列はルールを保存するときに
拒否されます。要素はスカラー等価で比較されるため、数値と文字列はそれぞれ自身の型に
マッチします。
4. レシピ:プライベート IP またはメタデータ宛先を deny
ツールがターゲット IP を引数として取るとき、cidr_match はそれが CIDR に入るかを
テストします — 「10.x またはクラウドメタデータアドレスを取得するエージェント」の
SSRF の形です:
5. レシピ:数値引数を上限する
gt と lt は数値を比較します。それらを使って、不合理なバッチサイズ、過大な limit、
あるいは暴走する count を拒否します — ここでは、100 行を超えるバルク削除を deny します:
"500" のような数値に見える文字列は型不一致で
あり、マッチしません。そのためルールは文字列型の引数では発火しません。引数を数値に
保つか、ツールが見る前に正規化してください。
6. レシピ:句を組み合わせる(AND)
1 つのルール内のすべての句は AND されるため、判定を非常に特定の呼び出しに絞れます — 例えば、破壊的なコマンドかつ prod ホストに向けられているときのみshell.exec
を deny します:
args_match_json 内に OR はありません — 異なる優先度で
2 つのルール(または 2 つのグロブ)を作成します。エンジンは優先度順にルールを辿り、
最初にマッチしたものが勝ちますので、狭いルールを先に置きます。
ルール優先度を参照。
7. マッチした形のための判定を選ぶ
句はどの呼び出しがマッチするかを決定します;ルールのverdict は何が起こるかを
決定します。deny がクックブックのデフォルトですが、同じ句がより柔らかい判定を
運べます:
sanitize — 引数内のシークレットをリダクト
sanitize — 引数内のシークレットをリダクト
マッチした引数が危険な指示ではなくシークレットや PII を運ぶとき、
sanitize は
ツール引数からマッチした部分文字列をリダクトし、クリーニングされた呼び出しを
転送します。引数のみをリダクトします — ツールが返すコンテンツは決して触りません。
レスポンスのサニタイズを参照。pending_approval — マッチした呼び出しを人間のために保留
pending_approval — マッチした呼び出しを人間のために保留
リスクのある形を完全にブロックする代わりに、ちょうどそれをレビューのために保留
します:レビュアーが帯域外で承認または拒否し、エージェントは承認された呼び出しを
一度再送信します。承認を参照。
audit — とりあえず見るだけ
audit — とりあえず見るだけ
句をチューニングする間、ブロックせずにマッチした呼び出しを記録するには、判定を
audit に設定します。シャドウモードと
組み合わせて、deny が何かを変える前に実トラフィックに対して測定します。8. 依存する前に句をテストする
コンソールの Test タブはサンプルのツール呼び出しに対してポリシーをドライランし、 判定、マッチしたルール、理由を返します — 何もディスパッチされず、何も永続化されません。 現実的な引数オブジェクトを貼り付け、値を解決できない句がサイレントに発火しないため、 句が意図した呼び出しのみで発火することを確認します。 ルールのテストを参照。句は保存時に厳密に検証されます — 未知の演算子、不正なパス、非配列の
in 値、
コンパイルできない正規表現、無効な CIDR はすべて拒否されるため、不正な形の句はそもそも
永続化できません。9. 誰が引数句を作成できるか
これらすべてはセッション下のコンソールで実行されます(/api/workspace/firewall/*):
| アクション | ロール |
|---|---|
| ポリシー、プリセット、discovered tools の読み取り | Member |
| ルールの作成 / 編集 / 削除 | Developer+ |
| Test サンドボックス(ポリシーのドライラン) | Developer+ |
| events と実行集計の読み取り | Developer+ |
関連
引数の検証
引数マッチのユースケースの全容。
ツールをブロック
ツール全体を名前で deny — 句不要。
Egress 制御
アウトバウンドの host / IP / CIDR 宛先を統制。
ルールスキーマ
ルールが運べるすべてのフィールド。
ルール優先度
最初にマッチしたものが勝つ — 狭いものを広いものの前に並べる。
危険なツール呼び出し
これらのレシピが対処する脅威。
