Security & permissions
What protects you today, and what we're building next.
Today#
- Magic-link auth — every dashboard session is gated by an email-link OTP (Resend mailer). Sessions are HttpOnly + Secure cookies.
- Allowlist —
AUTH_ALLOWED_EMAILSon the API restricts who can request a magic link; non-allowlisted users see a waitlist message. - Machine auth — daemons enrol with a JWT and identify via WS bearer. Every session read is gated by
m.user_id == u.user_id. - TLS — Traefik (Coolify) terminates Let's Encrypt certs for both
app.controlum.pwandcontrolum.pw. - Harness permission flag —
--cu-mode dangerousper-harness; default is ask.
SSO via openbitum (preview)#
openbitum (the sister project) runs a Logto tenant at auth.openbitum.pw. We're wiring controlum as an OIDC client there so a single openbitum login also signs you into the controlum dashboard. Magic-link stays as the fallback for accounts not in the openbitum tenant.
Discovery confirmed: Logto exposes the standard config at /oidc/.well-known/openid-configuration; PKCE S256 supported; issuer https://auth.openbitum.pw/oidc. Implementation tracked in the M12 milestone.
Roadmap: policy engine#
The current dangerous flag is too coarse — sessions that drop it surrender ALL safety, including the safety we actually wanted. Coming:
- Per-tool classification (filesystem, network, exec, credential) with risk levels.
- Pattern-based command intercept:
rm -rf /,curl … | sh, env-var exfil, sudo, ssh outbound. - User-defined policies: allow / require approval / deny per pattern, scoped by cwd or kind.
- Audit log per session — every classified command + decision archived alongside the transcript.
Roadmap: ephemeral environments#
Long-term, every cu-launched session can optionally start inside a per-session Docker container that mounts only the chosen cwd. The harness blast-radius is bounded by the container; the policy engine remains as a second layer for what it's allowed to do inside.