KubeHero docs

Identity · SSO · RBAC

OIDC via Dex or WorkOS, role-based access, SCIM user provisioning.

Every path into KubeHero is authenticated. We don't ship an identity store of our own — we proxy to whatever your organization already runs.

Self-hosted: Dex

Dex is the canonical OIDC proxy in the CNCF ecosystem. It connects to Okta, Azure AD, Google Workspace, GitHub, GitLab, or any LDAP.

Install

./infra/demo/stack-install.sh   # interactive, prompts for Dex
# or
helm install dex dex/dex \
  --namespace dex --create-namespace \
  --values dex-values.yaml

Configure for Okta

# dex-values.yaml
config:
  issuer: https://auth.acme.internal/dex
  storage:
    type: kubernetes
    config: { inCluster: true }
  connectors:
    - type: oidc
      id: okta
      name: Okta
      config:
        issuer: https://acme.okta.com
        clientID: 0oa4...
        clientSecret: "$OKTA_CLIENT_SECRET"
        scopes: [openid, email, profile, groups]

Wire KubeHero to Dex

# kubehero values.yaml
auth:
  dex:
    embedded: false   # installed separately above
    issuerURL: "https://auth.acme.internal/dex"

The dashboard now redirects unauthenticated users through Dex → Okta → back. The CLI uses device-flow or static client credentials.

Cloud / SaaS: WorkOS

Used when KubeHero Cloud hosts the control plane. WorkOS provides SSO + SCIM for enterprise tenants.

auth:
  workos:
    enabled: true
    apiKeySecret: "workos-api-key"       # via external-secrets
    clientIdSecret: "workos-client-id"

SCIM endpoint: https://api.kubehero.io/scim/v2/.... Paste that into your IdP's SCIM provisioning config. WorkOS handles deprovisioning, group sync, and just-in-time provisioning.

RBAC

Three built-in roles (Enterprise tier extends):

RoleDashboardCLI
AdminRead + write everywhere, arm policiesFull
OperatorRead + arm policies in scoped clustersArm / undo within scope
ViewerRead-onlyRead-only

RBAC binds via OIDC group claims. In values.yaml:

auth:
  rbac:
    mapping:
      admin:    ["acme-sre-admins"]
      operator: ["acme-sre-oncall", "acme-platform"]
      viewer:   ["acme-engineering"]

Custom scopes per cluster / namespace are Enterprise-only.

Audit

Every authenticated action writes an audit_log row: actor.sub, actor.email, actor.groups, action, target, result, request_id. SIEM export via:

kubehero audit forward --syslog udp://siem.internal:514
kubehero audit forward --webhook https://siem.internal/hooks/kubehero
kubehero audit forward --s3 s3://acme-compliance/kubehero/

All three outputs include an HMAC signature so your SIEM can verify authenticity.

Token lifetimes

  • Dashboard session — 8 hours (sliding, refreshes on activity)
  • CLI token — 30 days, rotatable via kubehero auth rotate
  • Agent mTLS cert — 7 days, cert-manager rotates automatically

Service-to-service auth

Intra-platform RPCs use mTLS via cert-manager's CA. The agent holds a per-cluster cert issued at helm install time via kubehero cluster add. Inbound control-plane calls verify the cert's common name matches a registered cluster.