제한 사항 및 모범 사례
효과적인 정책 작성을 위한 보안 제한 사항 및 모범 사례
보안상의 이유로 정책은 제한된 환경에서 실행됩니다. 이 페이지는 허용되지 않는 사항을 문서화하고 효과적인 정책 작성을 위한 모범 사례를 제공합니다.
정책 제한
정책은 길이가 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: 특정 블록 번호에서 로그 조회 (16진수 형식 예:0x100또는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
}