Excititor Provider Credential Entry

Audience: Operators supplying credentials, source URLs, and trust material for Excititor VEX providers.

Last updated: 2026-07-14

For the readiness model, run counters, and the full provider inventory, see the Provider Control Plane guide.

1. Purpose

Excititor supports operator-supplied provider settings through the product surfaces operators already use:

Host configuration and environment variables remain compatibility fallbacks, but the primary operator path for supported credential-sensitive Excititor providers is persisted provider configuration owned by Stella Ops itself.

Credential custody

Red Hat’s optional subscriptionToken is never persisted as plaintext by a production Excititor host. excititor-web seals a newly submitted value before it writes vex.provider_settings; its idempotent startup migration converts any legacy plaintext value to a builtin:// reference and performs a residual-plaintext sweep. An operator-supplied builtin://, vault://, or other supported secret reference is retained as a reference rather than re-sealed.

Both excititor-web (manual/API ingest) and excititor-worker (scheduled ingest) resolve the stored reference only into the short-lived in-memory settings passed to the Red Hat connector. The persisted row and runtime settings cache retain the reference, resolution fails closed, and secret bytes are not logged. excititor-web is the sole migration owner so simultaneous host startup cannot double-seal the same row.

Both hosts need a usable KEK source. Resolution order is Excititor:SecretProtectionKey, Platform:Setup:SecretProtectionKey, STELLAOPS_SECRETS_ENCRYPTION_KEY, then STELLAOPS_BOOTSTRAP_KEY; Vault remains available through the configured secret-provider registry. A startup probe refuses to start the host when KEK material is empty or the selected secret backend does not match configuration.

2. Operator entry paths

Web UI

Use:

Then:

  1. Open the provider card.
  2. Open Provider Configuration.
  3. Enter or update the provider fields.
  4. Save the configuration.

Sensitive values never round-trip back to the browser. A stored secret is shown only as retained state. Leaving a password field blank keeps the retained secret. Explicitly checking the clear control removes the stored secret.

CLI

Inspect current persisted provider configuration:

stella vex providers configure excititor:cisco --server https://excititor.example.internal
stella vex providers configure excititor:msrc --server https://excititor.example.internal
stella vex providers configure excititor:oci-openvex --server https://excititor.example.internal

Update a provider:

stella vex providers configure excititor:cisco \
  --server https://excititor.example.internal \
  --set metadataUri=https://mirror.example.internal/cisco/provider-metadata.json \
  --set apiToken=...

stella vex providers configure excititor:msrc \
  --server https://excititor.example.internal \
  --set authMode=ClientCredentials \
  --set tenantId=... \
  --set clientId=... \
  --set clientSecret=...

Clear stored fields:

stella vex providers configure excititor:msrc \
  --server https://excititor.example.internal \
  --clear clientSecret

Notes:

3. Blocked providers

If an operator enables a provider that still lacks required credentials or has an invalid persisted configuration, Excititor preserves the enable intent but reports the provider as blocked.

Current blocked codes:

4. Credential acquisition matrix

ProviderWhere to sign in or lookWhat to create or captureCan the config be skipped?Entitlement / paywall notes
excititor:ciscoPublic Cisco CSAF metadata by default. Optional authenticated path depends on your Cisco API / mirror arrangement.Usually nothing for the default public path. Optionally capture metadataUri override and apiToken if your Cisco path requires bearer auth.Yes, for the default public Cisco CSAF metadata path. Configure it only when overriding the metadata URI or when your Cisco endpoint requires a token.No StellaOps-side paywall for the public path. Any token requirement depends on your Cisco-side arrangement, mirror, or entitlement.
excititor:redhatPublic Red Hat CSAF provider metadata by default, or an authenticated internal mirror/offline snapshot.Usually nothing for the default public path. Capture metadataUri, sourceUrlConfirmed, optional subscriptionToken, PGP/Cosign trust overrides, or offlineSnapshotPath when using a mirror/offline source.Yes, for the default public Red Hat path. No when overriding the source URL unless the HTTPS URL is explicitly confirmed.No StellaOps-side paywall for the public path. Any token requirement belongs to the selected mirror or entitlement.
excititor:oracleOracle public security RSS/CSAF JSON or an approved offline snapshot.Confirm catalogUri before use. For signed-required, capture pgpKeyFingerprint or Cosign-equivalent trust material; otherwise select cache-only or quarantine-only.No for trusted publication. The source URL must be confirmed and trust posture must be explicit.Public data is reachable, but observed detached signatures/provider metadata are not sufficient for trusted Stella Ops Mirror publication.
excititor:suse-rancherReachable Rancher VEX hub discovery URL or an approved offline snapshot.Confirm discoveryUri, or configure offlineSnapshotPath. Add OAuth fields only if the chosen hub requires credentials. Add PGP/Cosign trust material for signed-required.No when enabling the provider. Default public discovery is not enough in this environment.Current default hub discovery is unavailable from this environment.
excititor:msrcPublic MSRC Security Update Guide API by default. Use https://entra.microsoft.com -> App registrations only when authMode=ClientCredentials.Usually nothing for the default Public mode. For ClientCredentials, collect tenantId, clientId, clientSecret, and optional scope. For OfflineToken, collect offlineTokenPath or staticAccessToken.Yes, for default Public mode. No when the operator selects ClientCredentials or OfflineToken; the selected mode must include its required fields.No separate documented MSRC paywall for public reads. Client-credential mode requires a Microsoft Entra tenant plus permission to register the app and grant the required consent; mirror/offline modes depend on the local mirror or token staging process.
excititor:oci-openvexRegistry, identity provider, cosign/PKI authority, and any offline artifact staging path used by your deployment.images subscription list plus cosign/TUF material. Binary material (cosign keys, TUF roots, offline bundles) is uploaded as server-side artifact references via /excititor/providers/{id}/artifacts. Image list is a flat string map entry; artifact slots carry opaque artifact IDs.No. images list must contain at least one valid OCI reference. Sprint 20260423_001 shipped the artifact-backed configuration path.Depends on your registry, cosign, and offline bundle environment.

5. What operators should actually look for

Cisco CSAF

Microsoft MSRC

Red Hat CSAF

Custody verification

After deployment, verify the Red Hat slot without selecting or printing the token itself:

SELECT tenant_id,
       provider_id,
       CASE
         WHEN COALESCE(settings->>'subscriptionToken', '') = '' THEN 'absent'
         WHEN settings->>'subscriptionToken' ~ '^[a-z][a-z0-9+.-]*://' THEN 'reference'
         ELSE 'plaintext'
       END AS custody_state
FROM vex.provider_settings
WHERE provider_id = 'excititor:redhat';

Every returned credential-bearing row must report reference; plaintext is a failed seal sweep and must be treated as an operational incident. An empty result is clean but does not exercise the migration forcing function.

OCI OpenVEX

Sprint 20260423_001 OCI-CFG-001/002/003 wired the artifact-backed configuration path.

The OCI OpenVEX provider carries configuration shapes the scalar settings store cannot cleanly absorb: a variable-length list of image subscriptions and binary cosign / TUF material that must not round-trip on reads. The implementation keeps the scalar settings JSONB column a flat string map and introduces a sibling artifact-reference store (vex.provider_artifact_refs) for binary material. The settings JSONB references artifact rows by opaque GUID.

5.1 Shape of the configuration

FieldShapeNotes
imageslist<string>One OCI reference per line. At least one entry is required before the provider can run. Invalid references surface as PROVIDER_CONFIG_INVALID with sub-code PROVIDER_CONFIG_INVALID_IMAGE_REFERENCE. HTTP (non-TLS) registries are rejected unless allowHttpRegistries=true (sub-code PROVIDER_CONFIG_HTTP_REGISTRY_BLOCKED).
cosignModescalar (None | Keyless | KeyPair)Controls which cosign verification material is required. Invalid modes surface as sub-code PROVIDER_CONFIG_INVALID_COSIGN_MODE.
cosignIssuer, cosignSubjectscalarRequired when cosignMode=Keyless. Sub-codes: PROVIDER_CONFIG_MISSING_COSIGN_ISSUER, PROVIDER_CONFIG_MISSING_COSIGN_SUBJECT.
cosignKeyartifactRefRequired when cosignMode=KeyPair. Staged artifact ID pointing to a PEM public/private key file. Sub-code PROVIDER_CONFIG_MISSING_COSIGN_KEY.
cosignCertificateartifactRefOptional certificate paired with the cosign key.
tufRootslist<artifactRef>One or more TUF root.json artifacts providing offline trust material. Sub-code PROVIDER_CONFIG_MISSING_TUF_ROOT when a TUF-dependent path requires one.
registryAuthority, registryUsername, registryPasswordscalarOptional basic-auth / token material for private registries. registryPassword is sensitive: retained on blank save, cleared only via clearKeys.
allowHttpRegistriesscalar boolDefault false. Must be explicitly set to true to permit non-TLS registries.
offlineBundleRootscalarServer-side path to offline attestation bundles. Leave blank when bundles are uploaded via the artifact path.

5.2 Artifact-staging API

VerbPathPurpose
POST/excititor/providers/{id}/artifactsMultipart upload (file field). Returns { artifactId, sha256, mime, sizeBytes, stagedAt }. The SHA-256 is the only payload-derived echo.
GET/excititor/providers/{id}/artifactsLists staged artifacts for the provider (metadata only).
GET/excititor/providers/{id}/artifacts/{artifactId}/metaReturns the metadata projection for a single artifact. NEVER returns the payload.
DELETE/excititor/providers/{id}/artifacts/{artifactId}Removes a staged artifact.

Size caps: 10 MiB per artifact, 50 MiB per provider total. Tunable via Excititor:ProviderArtifacts:MaxArtifactSizeBytes / MaxProviderTotalSizeBytes environment settings. Cap violations surface as HTTP 400 with error codes ARTIFACT_TOO_LARGE / ARTIFACT_PROVIDER_QUOTA_EXCEEDED. Tenant isolation is enforced via RLS on vex.provider_artifact_refs.tenant_id.

At runtime, cosign/TUF verification libraries need on-disk paths. The effective-settings resolver materializes referenced artifacts to a per-request scratch directory (chmod 0700 on POSIX) and cleans up on session dispose — see VexProviderArtifactMaterializer.

5.3 Canonical setup flows

A. Keyless Sigstore, single image, default registry:

stella vex providers configure excititor:oci-openvex \
  --server https://excititor.example.internal \
  --image ghcr.io/acme/app:v1.2.3 \
  --set cosignMode=Keyless \
  --set cosignIssuer=https://token.actions.githubusercontent.com \
  --set cosignSubject='https://github.com/acme/repo/.github/workflows/release.yml@refs/tags/v1.*'

B. KeyPair cosign verification with operator-supplied public key:

stella vex providers configure excititor:oci-openvex \
  --server https://excititor.example.internal \
  --image ghcr.io/acme/app:v1 \
  --image ghcr.io/acme/sidecar:v1 \
  --set cosignMode=KeyPair \
  --upload-artifact cosignKey=@/secure/cosign/cosign.pub \
  --upload-artifact cosignCertificate=@/secure/cosign/cosign.crt

C. TUF trust roots + offline bundle:

stella vex providers configure excititor:oci-openvex \
  --server https://excititor.example.internal \
  --image registry.example.com/platform/base@sha256:... \
  --upload-artifact tufRoots=@/air-gap/tuf/root.json \
  --set offlineBundleRoot=/var/lib/stella/offline/openvex

D. Private registry with basic auth:

stella vex providers configure excititor:oci-openvex \
  --server https://excititor.example.internal \
  --image internal.registry.example.com/team/app:v3 \
  --set registryAuthority=internal.registry.example.com:5000 \
  --set registryUsername=stella-reader \
  --set registryPassword=<token>

5.4 Host-path compatibility (CLI only)

The CLI exposes --host-path-compat to preserve the legacy flow where cosign/TUF material is referenced by absolute path instead of uploaded as an artifact. Use it only when the Excititor server shares a filesystem with the operator workstation (typically a single-node sealed deployment). The UI deliberately never surfaces file-path inputs because the server cannot read arbitrary host paths in production-scale deployments. Host-path mode is visible in CLI --help as a compatibility-only flag.

5.5 Listing and clearing staged artifacts

# Show all artifacts staged against a provider
stella vex providers artifacts excititor:oci-openvex

# Clear a field's artifact binding (leaves the staged blob — delete the blob separately if unused)
stella vex providers configure excititor:oci-openvex --clear-artifact cosignCertificate

5.6 UI

The Web panel renders conditionally from the existing Advisory & VEX Sources detail flow when provider.kind === 'oci-openvex' (or the provider id matches excititor:oci-openvex). It provides the image-subscription list editor, artifact-reference slots with upload + staged-meta rendering, and a readiness hint surface for the OCI-specific blocked sub-codes. File-path inputs are intentionally omitted from the UI — use the CLI for host-path compat when that flow is needed.

6. Source confirmation and trust posture

Oracle and SUSE Rancher are configuration choices, but their required setup is not a normal username/password credential flow. They are blocked by source and trust posture until an operator records an explicit decision.

ProviderRequired operator decision
excititor:oracleConfirm the HTTPS catalogUri. Keep trustMode=signed-required only when pinned trust material is present; otherwise use cache-only or quarantine-only so the data is not presented as trusted VEX.
excititor:suse-rancherConfirm a reachable HTTPS discoveryUri or configure offlineSnapshotPath. Provide PGP/Cosign trust material for signed-required, or select cache-only/quarantine-only.
excititor:oci-openvexConfirm registry/image subscriptions with registrySourcesConfirmed=true; changing images clears the confirmation.

CLI examples:

stella vex providers configure oracle \
  --source-url https://www.oracle.com/ocom/groups/public/@otn/documents/webcontent/rss-otn-sec.xml \
  --confirm-source-url \
  --trust-mode cache-only

stella vex providers configure suse-rancher \
  --source-url https://mirror.example.internal/rancher-hub.json \
  --confirm-source-url \
  --trust-mode signed-required \
  --pgp-fingerprint <fingerprint>

7. References