一个轻量、可审计、可终止、确定性的微策略引擎。
我构建Gate0是因为我厌倦了在生产环境中调试基于正则表达式的策略。我想要的是一种无趣、有界且不可能崩溃的东西。如果你需要一个灵活、通用的策略引擎,你应该使用OPA。如果你需要一个在安全关键路径上评估耗时低于50微秒且零分配的策评估引擎,那么Gate0就是你的选择。
Gate0 专为高可信环境设计,其中策略评估必须具有确定性和资源受限性。请参阅安全策略报告漏洞,以及安全模型了解完整的威胁模型和机械保证。
Gate0 使用线性、拒绝优先的评估策略。每条规则由一个目标(快速路径匹配)和一个可选的条件(深层逻辑)组成。
+----------+ +-------------+ +--------+
| Ephemera | ----> | GateBridge | ----> | Gate0 |
| (Legacy) | | (Normalize) | | (Core) |
+----------+ +-------------+ +--------+
| ^
| |
+----(Shadow Log)----+
Gate0 的正确性和安全性通过以下方式机械验证:覆盖核心逻辑和边界情况的单元测试、通过 proptest 进行的基于属性的测试(包含数百个生成的场景),以及用于确保无 panic 和无未定义行为的 MIRI 验证。已测试最坏情况输入以确保有界终止。
cargo test
cargo +nightly miri test --lib
Gate0 的评估器使用固定大小、栈分配的缓冲区,保证评估期间零堆分配。默认实现使用 MaybeUninit 避免初始化未使用的槽位,从而产生 O(已使用) 而非 O(容量) 的初始化成本。
不安全代码仅限于一个模块 (fixed_stack.rs),其中包含简单的不可变条件:元素 0..len 已初始化,元素 len..N 未初始化。所有不安全路径均通过 MIRI 验证。
对于偏好零不安全代码的用户,Gate0 提供了 SafeFixedStack,位于 safe-stack 特性标志之后。此变体使用 [T; N],其中 T: Default + Copy,并预先初始化所有槽位。代价是每次评估调用时都需要 O(容量) 的初始化。
cargo build --features safe-stack
两种实现提供相同的语义和评估期间相同的零分配保证。选择在于性能 (O(已使用)) 与绝对安全性 (O(容量))。对于像 bool 这样具有廉价 Default 类型的小型栈,差异可以忽略。
Gate0 设计为在更大的宿主应用程序中充当策略决策点(PDP)。为了保持确定性和严格边界,Gate0 不处理 I/O、网络或对象生命周期。
推荐的集成模式将关注点分离为三层。宿主应用程序(API 网关、SSH 服务器等)管理状态、身份和副作用。适配器层将此复杂状态规范化为主谓宾(Gate0 理解的字符串、布尔值、整数)。Gate0 纯粹地评估扁平化的上下文并返回一个决策。
Host Application (User Request)
│
▼
[Adapter Layer] → Pre-computes context (time, IP ranges, MFA status)
│ Converts "complex" to "primitive"
▼
[Gate0 Engine] → Pure evaluation (0 allocations, bounded stack)
│
▼
Decision::Allow / Deny
这种分离解释了为什么 Gate0 不包含复杂的匹配器(如 IP 范围检查或正则表达式)。适配器层处理领域特定逻辑,并将预先计算的布尔或字符串属性呈现给 Gate0。Gate0 保持小巧、可审计和确定性。
use gate0::{Policy, Rule, Target, Request, ReasonCode};
let policy = Policy::builder()
.rule(Rule::allow(Target::any(), ReasonCode(1)))
.build()?;
let decision = policy.evaluate(&Request::new("alice", "read", "doc"))?;
assert!(decision.is_allow());
examples/ 目录包含说明 Gate0 常见使用模式的示例场景:
SaaS API:标准 RBAC/多租户逻辑。 零信任网络:基于属性的访问控制(ABAC),含 MFA 和位置检查。 复杂覆盖:演示拒绝优先冲突解决。
运行它们:
cargo run --example saas_api
cargo run --example zero_trust_network
cargo run --example complex_overrides
Gate0 故意限制自己以保持可预测性和高性能。
无复杂匹配器:像完整位掩码 CIDR 或高级正则表达式这样的逻辑仍由适配器层负责。Gate0 评估预处理后的基本类型。
无原生多线程:当前面向 Python 的 FFI 实现不是线程安全的。高并发用户应使用多进程,或等待第 4 阶段 FFI 稳定化(将解决全局锁问题)。
无重叠决策:在单个效果类(允许/拒绝)内,只返回第一个匹配的规则。冲突解决严格依赖于顺序。
以下项目扩展了 Gate0 引擎,用于特殊用例。
gate0_dsl:由 hardliner66 开发的 Rust 原生领域特定语言。它利用 Rust 宏为直接在代码中定义策略提供清晰可读的语法。你可以在 hardliner66/gate0_dsl 找到实现和文档。
MIT