Identity & Access
Federate sign-in to OpenID Connect, SAML 2.0 or LDAP, with TOTP or passkey MFA enforced on every door. Roles, just-in-time grants, break-glass and optional Kubernetes impersonation decide who may change which cluster.
Sign-in Methods
- IdP client secrets and bind passwords live in Kubernetes Secrets, never in the database, and are never shown again after saving
- Callback, ACS and logout URLs shown copy-ready from the console address, so there is nothing to hand-assemble
- Per-provider access policy: target tenant, default role on first sign-in, group-to-role mappings and an allowed-groups list
- Upstream group names are namespaced, so an IdP group called admins cannot grant platform administration
- Federated users are matched by provider and external id, never by email
- Issuers on private, loopback or in-cluster addresses are refused unless the owner allows that provider explicitly
MFA & Sessions
- TOTP or passkey asked on every sign-in door: local, LDAP, OIDC and SAML
- Ten single-use recovery codes, stored with Argon2id
- Adding or removing a factor requires a sign-in from the last 5 minutes, and sends a notice to the account mailbox
- Guess limits: 5 per challenge and 10 failures per user in 15 minutes
- Session list with revoke-one and sign out everywhere else
- Access tokens last 15 minutes and sessions 8 hours by default; the refresh cookie is httpOnly, Secure and SameSite=Strict
Roles & Elevated Access
Roles & Groups
Writer roles (admin, cluster-admin, editor, edit, owner) may change a cluster; every other role is read-only. Grants apply at fleet, tenant or single-cluster scope, and a group grant covers every member.
Just-in-Time Access
Users request a role; a second admin approves it. Grants expire automatically within at most 30 days, you cannot approve your own request, and each person can hold up to 5 pending requests.
Break-Glass
Immediate admin access for emergencies, written to the hash-chained audit log and sealed automatically after 60 minutes.
Fleet RBAC
Define a Kubernetes grant once on the hub and it lands on every target cluster as a ClusterRole plus bindings, reconciled and revoked everywhere on delete.
API Tokens
Per-user tokens for the CLI and CI, shown once and stored only as a SHA-256 hash. A token acts as its owner, can be set to expire, and is pinned to the platform scope its owner held when it was minted.
Kubernetes Impersonation
Optional: console requests reach each cluster as the signed-in user plus mapped groups, so native RBAC decides. system: groups are dropped, and an identity that cannot be expressed fails closed instead of running as the agent.
Tenancy & Isolation
- Tenant always taken from the verified token, and enforced again by PostgreSQL row-level security in deny-by-default mode
- Three separate authorities: cluster roles, tenant administration and installation administration
- Pod Security Admission levels set per namespace, with enforce, warn and audit chosen independently
- Raw writes of Pod Security or tenant labels are admin-only, so a tenant editor cannot open privileged pods or forge membership
- One-click namespace isolation: default-deny ingress plus allow-same-namespace, and a form-based NetworkPolicy editor with live YAML preview
- In-cluster projects group namespaces under one label, with quota, Pod Security and ingress isolation applied to every member; platform namespaces are skipped