v0.9.0
[0.9.0] — Fase 15 (Enterprise reforzado) — 2026-07-17
Refuerza la capa enterprise con tres pilares de seguridad, todos offline-safe
por defecto (OIDC real, Vault dinámico y sandbox fuerte son opt-in vía
config/env; sin red/IdP/Vault/Docker el comportamiento previo se mantiene).
Corresponde a v0.9 — Enterprise reforzado del roadmap. Retrocompatibilidad
total: no cambia la API pública ni la verificación local de JWT ni la
abstracción de secretos existente. Baseline de tests: 390 passed / 7 skipped.
F-OIDC — SSO/OIDC con proveedor real
OIDCVerifierextendido (ciel.enterprise.rbac): además del modo local
(clave estática, retrocompat Fase 7), añade modo JWKS opt-in con discovery
.well-known/openid-configuration, fetch/caché de JWKS porkid(TTL +
refresh onkiddesconocido) y validación estricta deiss/aud/exp/alg
(solo RS/ES asimétricos; rechazanone/HS256en modo JWKS).OIDCVerifier.from_config()leeCIEL_OIDC_*(ISSUER,AUDIENCE,
JWKS_URI,ROLE_CLAIM,ROLE_MAPPING);enabled_from_env()mira
CIEL_OIDC_ENABLED(default off).map_oidc_claims_to_role(): mapeo configurable de claims → rol RBAC con
defaults para Keycloak (realm_access.roles), Auth0/genérico (roles),
Azure AD/Okta (groups). Fail-closed: sin match ⇒ sin rol.make_oidc_dependency()(ciel.gateway.auth): dependency FastAPI que
delega a la guard api_key cuando OIDC está off (open-mode por defecto) y exige
Bearer JWT válido cuando está on, devolviendo unAuthContext
(subject/role/claims/via).- Nuevo extra
oidc = ["PyJWT[crypto]", "authlib", "python-multipart"].
F-Vault — Secretos dinámicos y rotación
LeasedSecretdataclass (name/value/lease_id/ttl/expires_at/
renewable) conis_expired().VaultSecretBackend.get_lease()para engines dinámicos (database/aws/...)
víaclient.read, yrevoke_lease()best-effort. La ruta KV estática
sigue igual (lease_id=None).RotatingSecretStore: caché lease-aware con refresh proactivo (default al
75% del TTL), revocación del lease previo al rotar (evita fugas), y
degradación a last-known-good y a un backend estático (env) ante fallo de red.
resolve()/require()/invalidate()/revoke()thread-safe (call-time).- Nuevo extra
vault = ["hvac>=2.0"].
F-Sandbox — Guardrails + sandbox de ejecución
SandboxExecutorcon backends seleccionables (SandboxBackend):
INPROCESS(default cross-platform,subprocess+ timeout),LIGHT(Linux,
setrlimitCPU/mem; degrada a inprocess en Windows),DOCKER(opt-in:
--network=none --read-only --cap-drop=ALL --security-opt=no-new-privileges --memory --pids-limit --rm) yGVISOR(opt-in, runtimerunsc). Degradación
graceful con log: backend fuerte no disponible ⇒ fallback a inprocess.SandboxLimits(timeout/cpu/mem/pids/network) yExecResultcon
telemetría (backend,duration_ms,limits_applied,timed_out).GuardrailMiddleware: rate-limit por tenant (reusaTenantRateLimiter),
redacción de secretos en salida (reusaredact_string) y truncado.SandboxContextahora ejecuta de verdad:execute/read_file/
write_filereemplazan los antiguos stubs por ejecución real respaldada por
SandboxExecutor(respetando la política de guardrails).