
소형의 감사 가능한 종료형 결정적 마이크로 정책 엔진
작고, 감사 가능하며, 종료가 보장되고, 결정론적인 마이크로 정책 엔진입니다.
운영 환경에서 정규식 기반 정책을 디버깅하는 데 지쳐서 Gate0를 만들었습니다. 지루하고, 한정적이며, 크래시가 불가능한 무언가가 필요했습니다. 유연하고 범용적인 정책 엔진이 필요하다면 OPA를 사용하세요. 보안에 중요한 경로에서 50µs 미만의 평가와 제로 할당을 벤치마크하는 정책 엔진이 필요하다면 Gate0가 적합합니다.
Gate0는 정책 평가가 결정론적이고 리소스가 제한되어야 하는 높은 신뢰성 환경을 위해 설계되었습니다. 취약점 신고는 보안 정책을 참조하고, 전체 위협 모델 및 기계적 보장은 보안 모델을 참조하세요.
Gate0는 선형적인 거부-우선 평가 전략을 사용합니다. 각 규칙은 대상(빠른 경로 매치)과 선택적 조건(심층 로직)으로 구성됩니다.
+----------+ +-------------+ +--------+
| Ephemera | ----> | GateBridge | ----> | Gate0 |
| (Legacy) | | (Normalize) | | (Core) |
+----------+ +-------------+ +--------+
| ^
| |
+----(Shadow Log)----+
Gate0의 정확성과 안전성은 핵심 로직과 경계 사례를 포괄하는 단위 테스트, 수백 가지 생성 시나리오를 사용한 proptest 기반 속성 기반 테스트, 그리고 패닉 및 정의되지 않은 동작(UB)이 없음을 보장하는 MIRI 검증을 통해 기계적으로 확인됩니다. 최악의 입력도 제한된 종료를 보장하도록 테스트됩니다.
cargo test
cargo +nightly miri test --lib
Gate0의 평가자는 고정 크기의 스택 할당 버퍼를 사용하여 평가 중 힙 할당이 전혀 발생하지 않도록 보장합니다. 기본 구현은 MaybeUninit을 사용하여 사용되지 않는 슬롯의 초기화를 피하므로 O(용량) 대신 O(사용됨)의 초기화 비용이 발생합니다.
안전하지 않은 코드는 단일 모듈(fixed_stack.rs)에 국한되며, 간단한 불변 조건을 가집니다: 0..len 요소는 초기화되고, len..N 요소는 그렇지 않습니다. 모든 안전하지 않은 경로는 MIRI로 검증됩니다.
안전하지 않은 코드를 전혀 사용하지 않으려는 사용자를 위해 Gate0는 safe-stack 기능 플래그 뒤에 SafeFixedStack을 제공합니다. 이 변형은 T: Default + Copy를 갖춘 [T; N]을 사용하며 모든 슬롯을 미리 초기화합니다. 대가는 모든 평가 호출 시 O(용량)의 초기화 비용입니다.
cargo build --features safe-stack
두 구현 모두 동일한 의미론과 평가 중 동일한 제로 할당 보장을 제공합니다. 선택은 성능(O(사용됨))과 절대적 안전성(O(용량)) 사이입니다. bool과 같은 저렴한 Default 타입의 작은 스택에서는 차이가 미미합니다.
Gate0는 더 큰 호스트 애플리케이션 내에서 정책 결정 지점(PDP) 역할을 하도록 설계되었습니다. 결정론과 엄격한 경계를 유지하기 위해 Gate0는 I/O, 네트워킹 또는 객체 수명 주기를 처리하지 않습니다.
권장 통합 패턴은 세 가지 계층으로 관심사를 분리합니다. 호스트 애플리케이션(API 게이트웨이, SSH 서버 등)은 상태, ID 및 부작용을 관리합니다. 어댑터 계층은 이 복잡한 상태를 Gate0가 이해하는 기본 요소(문자열, bool, 정수)로 정규화합니다. Gate0는 순수하게 평탄화된 컨텍스트를 평가하고 Decision을 반환합니다.
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에 미리 계산된 bool 또는 문자열 속성을 제공합니다. 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/멀티 테넌시 로직. Zero Trust Network: MFA 및 위치 확인을 포함한 속성 기반 접근 제어(ABAC). Complex Overrides: 거부-우선 충돌 해결을 보여줍니다.
다음 명령어로 실행하세요:
cargo run --example saas_api
cargo run --example zero_trust_network
cargo run --example complex_overrides
Gate0는 예측 가능성과 성능을 유지하기 위해 의도적으로 제약되어 있습니다.
복잡한 매처 없음: 전체 Bit-Mask CIDR이나 고급 정규식과 같은 로직은 어댑터 계층의 책임입니다. Gate0는 전처리된 기본 요소를 평가합니다.
네이티브 멀티스레딩 없음: 현재 Python용 FFI 구현은 스레드 안전하지 않습니다. 높은 동시성 사용자는 멀티프로세싱을 사용하거나 글로벌 잠금을 해결할 4단계 FFI 안정화를 기다려야 합니다.
중복 결정 없음: 단일 효과 클래스(허용/거부) 내에서는 첫 번째 일치 규칙만 반환됩니다. 충돌 해결은 엄격하게 순서에 따라 결정됩니다.
다음 프로젝트는 특수 사용 사례를 위해 Gate0 엔진을 확장합니다.
gate0_dsl: hardliner66가 개발한 Gate0용 Rust 네이티브 도메인 특화 언어(DSL)입니다. Rust 매크로를 활용하여 코드에서 직접 정책을 정의할 수 있는 깔끔하고 읽기 쉬운 구문을 제공합니다. 구현 및 문서는 hardliner66/gate0_dsl에서 확인할 수 있습니다.
MIT