制限とベストプラクティス
効果的なポリシーを作成するためのセキュリティ制限とベストプラクティス
セキュリティ上の理由から、ポリシーは制限された環境で実行されます。このページでは、許可されていない事項を文書化し、効果的なポリシーを作成するためのベストプラクティスを提供します。
ポリシーの制限
ポリシーは2,048文字の長さに制限されています。これにより、簡潔で焦点を絞ったルールが推奨され、高速な評価時間が保証されます。
プラットフォームレベルの制限
以下のRPCメソッドはプラットフォームレベルでブロックされており、どのポリシーでも有効にすることはできません:
| Category | Methods |
|---|---|
| Debug & Trace | debug_*, trace_* |
| Legacy Filters | eth_newFilter, eth_newBlockFilter, eth_newPendingTransactionFilter, eth_getFilterChanges, eth_getFilterLogs, eth_uninstallFilter |
これらの制限は、組織やエンドポイントポリシーに関係なく、すべてのリクエストに適用されます。
eth_getLogsの制限
eth_getLogsメソッドは単一ブロッククエリのみに制限されています。次のいずれかを指定する必要があります:
block_hash:特定のブロックハッシュからログをクエリblock_number:特定のブロック番号からログをクエリ(0x100のような16進数形式またはlatestのようなタグ)
fromBlockとtoBlockを使用したブロック範囲クエリはサポートされていません。この制限はRPCリクエストとMCPリクエストの両方に適用されます。
ブロックされたキーワード
以下のパターンはポリシーで許可されていません:
| Pattern | Reason |
|---|---|
import ... | Cannot import external modules |
package ... | Cannot declare packages |
default ... | Cannot override default values |
data.* | Cannot reference external data |
これらのパターンを使用しようとするポリシーは検証に失敗します。
無効化された組み込み関数
これらの組み込みカテゴリは無効化されており、拒否されます:
| Pattern | Error Message |
|---|---|
http.send | "http.send is disabled" |
crypto.* | "Crypto functions are disabled" |
io.jwt.* | "JWT functions are disabled" |
yaml.* | "YAML functions are disabled" |
uuid.* | "UUID functions are disabled" |
glob.* | "Glob functions are disabled" |
semver.* | "Semver functions are disabled" |
json.schema* | "JSON schema functions are disabled" |
graphql.* | "GraphQL functions are disabled" |
net.cidr* | "Net CIDR functions are disabled" |
opa.runtime* | "OPA runtime functions are disabled" |
rego.metadata* | "Rego metadata functions are disabled" |
無効化された組み込み関数を使用するポリシーは、どの関数が許可されていないかを示す明確なエラーメッセージとともに検証に失敗します。
検証エラー
ポリシーが検証に失敗すると、次のようなエラーが表示されます:
| Error | Cause |
|---|---|
| "Import statements are not allowed" | Policy contains import |
| "Package declarations are not allowed" | Policy contains package |
| "Default statements are not allowed" | Policy contains default |
| "Data references are not allowed" | Policy contains data. |
無効なRego構文によりコンパイルが失敗すると、コンパイラから行番号とエラーメッセージが表示されます。
ベストプラクティス
アドレスの小文字化
大文字小文字を区別しないアドレスマッチングには、常にlower()を使用してください:
# Good: Normalized comparison
deny if {
lower(input.to_address) == "0xdead..."
}
# Bad: May miss matches due to case differences
deny if {
input.to_address == "0xDead..."
}Nullableフィールドの処理
一部の入力フィールドはnullになる可能性があります。適切に処理してください:
# Good: Check for null before comparison
deny if {
input.usd_value != null
input.usd_value > 10000
}
# Alternative: Use type checking
deny if {
is_number(input.usd_value)
input.usd_value > 10000
}徹底的なテスト
ポリシーを本番環境にデプロイする前に:
- さまざまな入力の組み合わせでテストする
- 許可と拒否の両方のケースを検証する
- エッジケース(null値、空の配列)をチェックする
- 実際のトランザクションデータで検証する
ルールを文書化する
複雑なロジックを説明するためにコメントを使用してください:
# Block high-value transactions during off-hours
# Business hours are 9 AM - 5 PM UTC, Monday-Friday
deny if {
[hour, _, _] := time.clock(time.now_ns())
hour < 9
input.usd_value > 1000
}意味のある変数名を使用する
ローカル変数を使用する場合は、説明的な名前を選択してください:
# Good: Clear variable names
deny if {
high_risk_threshold := 10000
input.usd_value > high_risk_threshold
}
# Avoid: Cryptic names
deny if {
x := 10000
input.usd_value > x
}