制限とベストプラクティス

効果的なポリシーを作成するためのセキュリティ制限とベストプラクティス

セキュリティ上の理由から、ポリシーは制限された環境で実行されます。このページでは、許可されていない事項を文書化し、効果的なポリシーを作成するためのベストプラクティスを提供します。

ポリシーの制限

ポリシーは2,048文字の長さに制限されています。これにより、簡潔で焦点を絞ったルールが推奨され、高速な評価時間が保証されます。


プラットフォームレベルの制限

以下のRPCメソッドはプラットフォームレベルでブロックされており、どのポリシーでも有効にすることはできません:

CategoryMethods
Debug & Tracedebug_*, trace_*
Legacy Filterseth_newFilter, eth_newBlockFilter, eth_newPendingTransactionFilter, eth_getFilterChanges, eth_getFilterLogs, eth_uninstallFilter

これらの制限は、組織やエンドポイントポリシーに関係なく、すべてのリクエストに適用されます。


eth_getLogsの制限

eth_getLogsメソッドは単一ブロッククエリのみに制限されています。次のいずれかを指定する必要があります:

  • block_hash:特定のブロックハッシュからログをクエリ
  • block_number:特定のブロック番号からログをクエリ(0x100のような16進数形式またはlatestのようなタグ)

fromBlocktoBlockを使用したブロック範囲クエリはサポートされていません。この制限はRPCリクエストとMCPリクエストの両方に適用されます。


ブロックされたキーワード

以下のパターンはポリシーで許可されていません:

PatternReason
import ...Cannot import external modules
package ...Cannot declare packages
default ...Cannot override default values
data.*Cannot reference external data

これらのパターンを使用しようとするポリシーは検証に失敗します。


無効化された組み込み関数

これらの組み込みカテゴリは無効化されており、拒否されます:

PatternError 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"

無効化された組み込み関数を使用するポリシーは、どの関数が許可されていないかを示す明確なエラーメッセージとともに検証に失敗します。


検証エラー

ポリシーが検証に失敗すると、次のようなエラーが表示されます:

ErrorCause
"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
}

徹底的なテスト

ポリシーを本番環境にデプロイする前に:

  1. さまざまな入力の組み合わせでテストする
  2. 許可と拒否の両方のケースを検証する
  3. エッジケース(null値、空の配列)をチェックする
  4. 実際のトランザクションデータで検証する

ルールを文書化する

複雑なロジックを説明するためにコメントを使用してください:

# 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
}
制限とベストプラクティス | 256 Blocks