3.7 KiB
3.7 KiB
TASK METADATA
- Target Files:
spire_ffi/src/lib.rsspire_ffi/Cargo.tomlserver/spire.tsserver/routes/rpc.tsserver/tests/spire_workload.test.tsinfra/spire/docker-compose.test.yml
- Core Objective: Establish a comprehensive integration harness and
automated testing pipeline for the Rust SPIFFE/mTLS FFI crate (
spire_ffi/), enabling live X.509 SVID validation and ConnectRPC mutual TLS attestation against a containerized SPIRE agent. - Dependencies:
- Rust toolchain (
cargo,rustc). - Deno FFI (
--allow-ffi). - Containerized SPIRE Server & Agent in
infra/spire/.
- Rust toolchain (
- Additional Important Notes:
- Must provide a seamless mock fallback for standard development environments
when
libspire_ffi.sois not built, while enforcing strict validation in mesh-enabled environments.
- Must provide a seamless mock fallback for standard development environments
when
2. Architectural Considerations & Risks
Risks
- Native Dynamic Library Portability: C dynamic libraries (
.so,.dylib,.dll) compiled on one architecture/OS cannot run on others without cross-compilation.- Mitigation: Keep
server/spire.tsresilient with an explicit graceful fallback mock layer whenlibspire_ffiis missing. Provide a dedicated task script (deno task build:ffi) that compilesspire_ffilocally usingcargo build --release.
- Mitigation: Keep
- Workload API Unix Domain Socket Timeouts: If the SPIRE agent daemon
restarts or socket permissions change, FFI calls to fetch X.509 SVIDs could
block or hang worker threads.
- Mitigation: Enforce non-blocking socket reads with strict timeouts (e.g. 500ms) inside Rust FFI functions before returning to Deno.
Alternatives
- Pure TypeScript gRPC Client for SPIRE Workload API: We considered writing
a pure TypeScript gRPC client. However, SPIRE's Workload API communicates over
Unix Domain Sockets with strict OS-level credential passing (
SO_PEERCRED), which is far more performant and natively handled via the officialspire-api-sdkcrate in Rust.
3. Proposed Implementation
Phase 1: Rust FFI Hardening (spire_ffi/src/lib.rs)
- Enhance
spire_ffi:- Implement
fetch_x509_svid(socket_path: *const c_char, timeout_ms: u32) -> FfiResult. - Implement
validate_spiffe_id(client_cert_der: *const u8, cert_len: usize, expected_spiffe_id: *const c_char) -> bool. - Ensure all string buffers and error structures are safely allocated and
freed across the FFI boundary (
free_ffi_string).
- Implement
Phase 2: Deno FFI Binding & Fallback Layer (server/spire.ts)
- Load dynamic library:
- Search
./libspire_ffi.so,./spire_ffi/target/release/libspire_ffi.so, and system library paths. - If missing, log a warning and activate the hermetic mock provider for local unit testing.
- Search
- Expose high-level TypeScript API:
getWorkloadSvid(socketPath?: string): Promise<{ spiffeId: string, certChain: Uint8Array, privateKey: Uint8Array }>verifyClientSpiffeId(cert: Uint8Array, expectedId: string): boolean
Phase 3: ConnectRPC Integration & Test Harness
- In
server/routes/rpc.ts:- Bind incoming ConnectRPC service requests to
verifyClientSpiffeIdwhen running behind mTLS proxies.
- Bind incoming ConnectRPC service requests to
- In
infra/spire/docker-compose.test.yml:- Add minimal SPIRE Server & Agent test configuration with a registered test
workload entry (
spiffe://system.local/auth-yes-tester).
- Add minimal SPIRE Server & Agent test configuration with a registered test
workload entry (
- In
server/tests/spire_workload.test.ts:- Test live X.509 SVID acquisition, parsing, and ConnectRPC authorization against the running test SPIRE container.
Phase 4: Quality Gates
- Run
cargo testinspire_ffi/. - Run
deno fmt,deno task lint,deno task check, anddeno test -A --no-check.