Restrictions et Meilleures Pratiques
Restrictions de sécurité et meilleures pratiques pour rédiger des politiques efficaces
Pour des raisons de sécurité, les politiques s'exécutent dans un environnement restreint. Cette page documente ce qui n'est pas autorisé et fournit les meilleures pratiques pour rédiger des politiques efficaces.
Limites de Politique
Les politiques sont limitées à 2 048 caractères de longueur. Cela encourage des règles concises et ciblées et garantit des temps d'évaluation rapides.
Restrictions au Niveau de la Plateforme
Les méthodes RPC suivantes sont bloquées au niveau de la plateforme et ne peuvent être activées par aucune politique :
| Category | Methods |
|---|---|
| Debug & Trace | debug_*, trace_* |
| Legacy Filters | eth_newFilter, eth_newBlockFilter, eth_newPendingTransactionFilter, eth_getFilterChanges, eth_getFilterLogs, eth_uninstallFilter |
Ces restrictions s'appliquent à toutes les requêtes, quelle que soit l'organisation ou les politiques de point de terminaison.
Limitations de eth_getLogs
La méthode eth_getLogs est limitée aux requêtes de bloc unique uniquement. Vous devez spécifier soit :
block_hash: Interroger les logs d'un hash de bloc spécifiqueblock_number: Interroger les logs d'un numéro de bloc spécifique (format hex comme0x100ou tags commelatest)
Les requêtes de plage de blocs utilisant fromBlock et toBlock ne sont pas supportées. Cette restriction s'applique aux requêtes RPC et MCP.
Mots-Clés Bloqués
Les modèles suivants ne sont pas autorisés dans les politiques :
| Pattern | Reason |
|---|---|
import ... | Cannot import external modules |
package ... | Cannot declare packages |
default ... | Cannot override default values |
data.* | Cannot reference external data |
Les politiques tentant d'utiliser ces modèles échoueront à la validation.
Fonctions Intégrées Désactivées
Ces catégories de fonctions intégrées sont désactivées et seront rejetées :
| 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" |
Les politiques utilisant des fonctions intégrées désactivées échoueront à la validation avec un message d'erreur clair indiquant quelle fonction n'est pas autorisée.
Erreurs de Validation
Lorsqu'une politique échoue à la validation, vous recevrez des erreurs comme :
| 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. |
Lorsque la compilation échoue en raison d'une syntaxe Rego invalide, vous recevrez le numéro de ligne et le message d'erreur du compilateur.
Meilleures Pratiques
Adresses en Minuscules
Utilisez toujours lower() pour la correspondance d'adresses insensible à la casse :
# Good: Normalized comparison
deny if {
lower(input.to_address) == "0xdead..."
}
# Bad: May miss matches due to case differences
deny if {
input.to_address == "0xDead..."
}Gérer les Champs Nullables
Certains champs d'entrée peuvent être null. Gérez cela avec précaution :
# 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
}Tester Minutieusement
Avant de déployer des politiques en production :
- Testez avec diverses combinaisons d'entrées
- Vérifiez les cas d'autorisation et de refus
- Vérifiez les cas limites (valeurs null, tableaux vides)
- Validez avec des données de transactions réalistes
Documentez Vos Règles
Utilisez des commentaires pour expliquer la logique complexe :
# 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
}Utilisez des Noms de Variables Significatifs
Lors de l'utilisation de variables locales, choisissez des noms descriptifs :
# 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
}