ファイアウォールポリシーは順序付けられたルールの
リストです。このページは、ルールが何を表現できるか — マッチング言語、判定、
そしてエンジンがそれらをどう評価するか — の完全なリファレンスです。
ルールはコンソールのルールエディタで作成され、構造化された JSON マッチオブジェクトを
書き込みます。以下のすべては、UI で構築するにせよ API 経由で
POST するにせよ、ルールを正確に読み、推論し、検証できるよう、その語彙を記述します。
1. ルールの構造
| フィールド | 型 | 意味 |
|---|
priority | int | 低いものが先に実行されます。 同点はルール id で解決。 |
label | string | 人間向けの名前。events と監査に表示されます。 |
stage | enum | サーフェス — inbound / response / mcp / egress。空 = すべてのサーフェス。 |
tool_name_glob | string | ツール名に対するグロブ。 |
skill_name_glob | string | 所有スキルに対するオプションのグロブ。ツールグロブと AND されます;空 = 任意のスキル。 |
verdict | enum | アクション — §7 を参照。 |
args_match | object | オプションの引数述語。 |
sanitize | object | リダクション設定。verdict = sanitize のときに使用。§5 を参照。 |
egress | object | Host/CIDR の allow/deny リスト。stage = egress のときに使用。§6 を参照。 |
cap_cost_cents | int | 実行コストの上限。verdict = cap_cost のときに使用。 |
sequence | object | 順序付けられたマルチステップマッチ。リアクティブに強制されます。§8 を参照。 |
notes | string | 作成者の根拠;エンジンには無視されます。 |
ルールは、宣言されたすべての条件が成り立つときにツール呼び出しにマッチします:
ステージがマッチする(または空である)、ツールグロブがマッチする、スキルグロブが
マッチする(または空である)、引数句がマッチする(または存在しない)、そして
egress スコープがマッチする(egress ルールのみ)。エンジンは優先度順にルールを
辿り、最初にマッチしたものが勝ちます。
2. ツール名グロブ
意図的に小さい、大文字小文字を区別する文法 — 正規表現のサプライズなし、線形時間、
リレーのホットパス上で安全:
| パターン | マッチするもの |
|---|
"" または * | すべてのツール。 |
foo.* | プレフィックス — foo.bar、foo.exec(裸の foo ではない)。 |
*.exec | サフィックス — shell.exec、db.exec(裸の exec ではない)。 |
*.shell.* | インフィックス — local.shell.exec(各側に 1 文字以上必要)。 |
| それ以外 | 完全文字列マッチ(foo.*.bar を含む)。 |
ツールは慣例的に server.tool または category.action として名前空間化されるため、
shell.* はファミリ全体を捕捉し、*.delete はサーバーをまたいで動詞を捕捉します。
3. スキル名グロブ
同じグロブ文法で、ツール呼び出しの所有スキルに対してマッチされます
(例:community.*、builtin.send)。tool_name_glob と AND されるため:
tool_name_glob: http.fetch
skill_name_glob: community.*
は、community.* スキルに所有されているときにのみ http.fetch にマッチします
— 組み込みスキルからの同じツールは信頼し、コミュニティスキルからのものはゲート
します。空のスキルグロブは任意の所有者にマッチします。ツール呼び出しがどのように
スキルに帰属されるかは スキル で
扱われます。
4. 引数句
ツール名のマッチングはどのツールかに答えます;引数句はどんな引数でかに
答えます — 「shell.exec をブロックする」と「コマンドが rm -rf のときだけ
shell.exec をブロックする」の違いです。
args_match は句のセットで、すべて AND されます:
{
"clauses": [
{ "path": "$.command", "op": "regex", "value": "rm -rf|drop table" },
{ "path": "$.connection", "op": "in", "value": ["prod", "replica"] },
{ "path": "$.ip", "op": "cidr_match", "value": "10.0.0.0/8" }
]
}
空の / 存在しない args_match は空虚に真です — ルールはグロブだけでマッチします。
演算子
| 演算子 | マッチする条件 |
|---|
eq | スカラ等価(数値は数値的に比較;型の不一致 → マッチなし)。 |
contains | 部分文字列(両オペランドが文字列でなければなりません)。 |
regex | Go RE2 パターンが文字列値にマッチ(線形時間、後方参照なし)。 |
in | 値が与えられた JSON 配列の要素である。 |
cidr_match | 文字列 IP が与えられた CIDR 内に含まれる。 |
gt / lt | 数値の大なり / 小なり(文字列は強制変換されません)。 |
パス構文
ツールの引数オブジェクト上の小さな JSONPath サブセット:
$.foo、$.foo.bar — フィールドアクセス
$.foo[0]、$.arr[1].k — 配列インデックス
$ — 引数オブジェクト全体
ワイルドカード、フィルタ、スライス、再帰下降はありません。
引数句はフェイルクローズします — リクエストではなくルールが。 パスが解決され
ない、引数が不正、または regex/CIDR が無効な場合、句は false と評価され、
ルールは単に発火しません — 呼び出しは次のルールまたはデフォルト判定にフォールスルー
します。壊れた句が自動で deny したり、リレーをクラッシュさせたりすることは決して
ありません。「危険なものすべてを捕捉する」ルールは、句が特定の方法で失敗することに
頼るのではなく、独自のグロブを持つ明示的な deny として書いてください。
コンソールは保存時に句を厳密に検証します(未知の演算子、不正なパス、配列でない
in 値、コンパイル不能な regex、無効な CIDR はすべて拒否されます)。そのため、
不正な句はそもそも永続化できません。
5. サニタイザ
sanitize 判定は、マッチした部分文字列をツールの引数からリダクトし、クリーニング
された呼び出しを転送します — エージェントがツール引数に入れたシークレットや PII を、
アクション全体をブロックすることなく取り除くのに役立ちます。
{ "presets": ["email", "ssn_us"], "custom": ["foo-\\d+"] }
プリセットマッチは [redacted:<preset>] で、カスタム regex マッチは
[redacted:custom] で置換されます。組み込みプリセットライブラリ:
aws_access_key、aws_secret_key、openai_key、anthropic_key、
bearer_token、email、ssn_us、credit_card(Luhn チェックつき)。
sanitize ルールは少なくとも 1 つのプリセットまたはカスタムパターンを宣言しなければ
なりません — 空のサニタイザは保存時に拒否されます。inbound サーフェスでは
リダクトすべき呼び出し時の引数がないため、そこでの sanitize 判定はブロックに
エスカレートします。
6. egress 宛先リスト
egress ルール(ステージ egress)は、アウトバウンドの宛先 — SSRF と持ち出しの
サーフェス — に対してマッチします:
{
"deny": ["169.254.169.254", "10.0.0.0/8"],
"allow": ["api.openai.com"]
}
エントリは CIDR、IP リテラル、または大文字小文字を区別しないホスト名としてマッチ
します;ホスト名はベストエフォートで解決され、IP/CIDR エントリに対して再チェック
されます。極性は判定に従います:allow 判定では allow リストがスコープ内のものを
定義し deny がそこから例外を切り出します;強制判定(deny)では deny リストが
ブロックされるものを定義し allow が例外を切り出します。
169.254.169.254(クラウドメタデータエンドポイント)と RFC-1918 範囲は deny すべき
正典的なものです — block_ssrf_egress プリセットと tight
自律性レベル
はまさにそれを同梱しています。
7. 判定
| 判定 | 効果 | 備考 |
|---|
allow | 通す、ログされる。 | |
audit | 許可 + レビュー用に記録。 | 通常の default_verdict。 |
deny | 呼び出しをブロック。 | inbound では HTTP 400;mcp ではツールエラー。 |
sanitize | 引数をリダクト、転送。 | サニタイザが必要;inbound では deny にエスカレート。 |
pending_approval | 人間のために保留。 | 承認ストアの設定が必要;response/egress では拒否される。 |
cap_cost | 支出上限を超えたら deny。 | 非負の cap_cost_cents が必要;response/egress では不活性。 |
シャドウモードでは、すべての強制判定が
audit に格下げされ、理由には [shadow] would … が前置されます。
8. シーケンス
一部のリスクは複数の呼び出しにまたがってのみ可視です — 50 件の CRM レコードを
読み、その後エクスポートし、その後外部ホストに到達する。sequence ルールは、単一の
呼び出しではなく順序付けられたチェーンにマッチします:
{
"window_seconds": 600,
"steps": [
{ "match": "crm.*", "min_count": 3 },
{ "match": "*.export" },
{ "match": "*", "egress": true }
]
}
各ステップはツールグロブで、オプションの min_count(デフォルト 1)とオプションの
egress: true(ステップは egress 呼び出しでなければならない)を持ちます。ステップは
順番に発生しなければならず — 他の呼び出しとのインターリーブは問題ありません —
チェーン全体が window_seconds 以内に完了しなければなりません(0 = 制限なし)。
シーケンスは、各呼び出しでインラインにではなく、非同期マッチャによって
リアクティブに強制されます — そうでなければ * ステップを持つシーケンスは
あらゆる単一のツール呼び出しにマッチしてしまいます。シーケンスは events フィードを
点灯させ、後続のアクションをトリガーできますが、チェーンを完成させる個々の呼び出しを
リアルタイムでブロックすることはありません。
9. 組み込みプリセット
空白のルールではなくプリセットから始めましょう。プリセットはサーバーサイドで作成
されているため、コンソールとこのドキュメントは同一の挙動を記述します:
| プリセット | 何をするか |
|---|
block_destructive_shell | deny-by-glob ルールのセットを介して、破壊的シェルコマンド(rm -rf、mkfs、dd、フォークボム、…)を deny します。 |
block_ssrf_egress | メタデータエンドポイントと RFC-1918 範囲への egress を audit します。 |
block_secrets_in_args | 検出指向 — ツール引数に現れるクレデンシャルをフラグします。 |
block_pii_in_tool_results | 検出指向 — ツール結果内の PII を表面化します。 |
プリセットをシードとして適用し、その後は自由に編集します — プリセットは出発点で
あり、ロックではありません。
10. 評価、制限、安全性
- 最初にマッチしたものが勝ち。 ルールは
priority ASC, id ASC 順で実行され、
条件がすべて成り立つ最初のルールが判定を決めます。どのルールもマッチしなければ
→ ポリシーの default_verdict。
- 決定的で依存関係なし。 グロブと句のマッチングは、ネットワーク呼び出しを
伴わない純粋な文字列/JSON 操作で、すべてのツール呼び出しで実行しても安全です。
正規表現は RE2 です — 線形時間、破滅的なバックトラックなし。
- フェイルクローズな句。 評価できない句は、自動 deny ではなく、そのルールを
発火させません(§4)。
- 厳密な保存時検証。 判定/ステージのペアリング、サニタイザの非空性、
cap_cost_cents の存在、句の形状、参照の解決はすべて保存時にチェックされます —
無効なルールは永続化できません。
- 監査済み。 すべてのルールの作成/更新/削除は、変更がコミットされた後に監査行を
書き込みます;ルールブロブとシークレットは決して監査ログに書き込まれません。
API リファレンス
ルールはポリシーの下にあり、ワークスペーススコープです;書き込みは
Developer+ が必要です。
| メソッドとパス | ロール | 目的 |
|---|
POST /api/workspace/firewall/rules | Developer+ | ルールを作成。 |
PUT /api/workspace/firewall/rules | Developer+ | ルールを更新(id はボディ内)。 |
DELETE /api/workspace/firewall/rules/:id | Developer+ | ルールを削除。 |
GET /api/workspace/firewall/presets | Member | 組み込みプリセット一覧。 |
POST /api/workspace/firewall/test | Developer+ | サンプルのツール呼び出しに対してポリシー(ルールを含む)をドライラン。 |
依存する前にルールをプレビューするには、Test を使います — 何もディスパッチする
ことなく、判定、マッチしたルール、理由を返します。
関連項目
エージェントセキュリティをさらに深く知りたいですか? エージェントを保護する(ゼロトラスト) のガイドが、この機能をゼロトラストワークフローの中に位置づけます。
ファイアウォールポリシーを構築する
ゼロトラストポリシーをステップごとに作成し、強制する前にシャドウで試します。
ルールスキーマリファレンス
すべてのルールフィールド — グロブ、引数述語、egress、コスト上限。