Skip to content

Enterprise: present Image Factory credentials as customer ID + API keys, never expose secrets #3139

Description

@sterlingkoch

Problem Description

Enterprise Image Factory credentials are presented as a "username" and "password" — shared-credential semantics, with the secret handled like a human login. Enterprise customers expect API-key semantics: a per-customer identifier plus a revocable secret.

The original driver for this ticket — plaintext credentials embedded in the download/boot URLs of the install-media dialog — is now owned elsewhere: image download URLs are replaced by signed download tokens (#3138, mechanism shipped in siderolabs/image-factory#509), and security artifacts (SBOM/VEX/scan reports) will be served through Omni server-side so factory credentials never reach the browser (#3166).

What neither of those covers is the credential the customer holds and uses outside Omni:

  • The cluster create command on the install-media confirmation screen renders --image-factory-auth='username:password' — the local cluster pulls the installer from the factory and must authenticate to it.
  • The installer image in the machine config is pulled from the enterprise factory's registry, so machines authenticate with registry credentials.
  • Self-hosted Omni is itself configured with factory credentials (registries.factories.primary).

These need a durable credential — a short-lived link can't serve them. The question this ticket answers is what shape that credential takes and how it is presented.

The shape is already half-decided: the factory accepts Auth0 bearer tokens in the Basic auth password field (siderolabs/image-factory#514), because OCI and Talos registry clients only speak Basic. So what a customer holds is an identifier plus a token — customer ID + API key. The rename describes what the credential now actually is.

Solution

  • Rename throughout the enterprise UI: "username" → customer ID, "password" → API key.
  • Deliberate, never incidental: a credential appears only where the user explicitly asked for it (e.g. the cluster-create command they're about to copy), never baked into rendered URLs, download links, or page content as a side effect. Surfaces that just need an authenticated fetch use Support time-based signed download URLs #3138 tokens (images) or the Serve EIF security artifacts through Omni (API + UI) instead of client-side factory fetches #3166 server-side path (artifacts).
  • Align rotation language with the Auth0 model: revocation/rotation happens on the identity side; when Omni's own factory credential rotates, Omni reconciles the change out to machine configs.

Out of scope

Notes

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions