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:
- Web UI provider management
stella vex providers configure ...in the CLI
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:
- Ops -> Integrations -> Advisory & VEX Sources -> VEX Providers
Then:
- Open the provider card.
- Open Provider Configuration.
- Enter or update the provider fields.
- 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:
--setacceptskey=value.- The current CLI path places literal values on the command line. If shell-history exposure is unacceptable for a secret, prefer the Web UI path or use an operator-approved secure shell/history procedure.
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.
enabled=truemeans the operator wants the provider scheduled once it becomes usable.readiness=blockedmeans the provider is intentionally on hold because required configuration is still missing or invalid.- Manual provider runs and batch ingest flows return a blocked result instead of pretending the provider is runnable.
- Scheduled worker runs skip blocked providers and record the configuration reason instead of treating missing credentials as transient retry failures.
Current blocked codes:
PROVIDER_CONFIG_REQUIREDPROVIDER_CONFIG_INVALIDPROVIDER_SOURCE_URL_REQUIREDPROVIDER_SOURCE_URL_NOT_HTTPSPROVIDER_SOURCE_URL_CONFIRMATION_REQUIREDPROVIDER_TRUST_MATERIAL_REQUIRED
4. Credential acquisition matrix
| Provider | Where to sign in or look | What to create or capture | Can the config be skipped? | Entitlement / paywall notes |
|---|---|---|---|---|
excititor:cisco | Public 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:redhat | Public 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:oracle | Oracle 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-rancher | Reachable 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:msrc | Public 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-openvex | Registry, 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
- No login is needed for the default public Cisco CSAF metadata path.
- Only collect
metadataUriwhen pointing Excititor at an approved internal mirror. - Only collect
apiTokenwhen your Cisco-side path or mirror explicitly requires a bearer token.
Microsoft MSRC
- Start with
authMode=Publicunless your deployment or mirror requires bearer-token authentication. - For
authMode=ClientCredentials, collect the Microsoft Entra Directory (tenant) ID, Application (client) ID, and a newly created Client secret value. - For
authMode=OfflineToken, collect either a server-sideofflineTokenPathor a short-livedstaticAccessTokenstaged through the approved secret path. - Confirm the app consent and scope expected by your MSRC or mirror onboarding process before storing client-credential values in Stella Ops.
Red Hat CSAF
- No credential is required for the default public metadata path.
- Use
subscriptionTokenonly when the selected internal mirror or entitled endpoint requires bearer authentication. - Enter a literal token through the Web UI when shell-history exposure is unacceptable; the production control plane seals it before persistence.
- Advanced operators may submit a supported secret reference instead of literal token material. An unresolved reference blocks the pull; it is never sent as the Authorization value.
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
| Field | Shape | Notes |
|---|---|---|
images | list<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). |
cosignMode | scalar (None | Keyless | KeyPair) | Controls which cosign verification material is required. Invalid modes surface as sub-code PROVIDER_CONFIG_INVALID_COSIGN_MODE. |
cosignIssuer, cosignSubject | scalar | Required when cosignMode=Keyless. Sub-codes: PROVIDER_CONFIG_MISSING_COSIGN_ISSUER, PROVIDER_CONFIG_MISSING_COSIGN_SUBJECT. |
cosignKey | artifactRef | Required when cosignMode=KeyPair. Staged artifact ID pointing to a PEM public/private key file. Sub-code PROVIDER_CONFIG_MISSING_COSIGN_KEY. |
cosignCertificate | artifactRef | Optional certificate paired with the cosign key. |
tufRoots | list<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, registryPassword | scalar | Optional basic-auth / token material for private registries. registryPassword is sensitive: retained on blank save, cleared only via clearKeys. |
allowHttpRegistries | scalar bool | Default false. Must be explicitly set to true to permit non-TLS registries. |
offlineBundleRoot | scalar | Server-side path to offline attestation bundles. Leave blank when bundles are uploaded via the artifact path. |
5.2 Artifact-staging API
| Verb | Path | Purpose |
|---|---|---|
POST | /excititor/providers/{id}/artifacts | Multipart upload (file field). Returns { artifactId, sha256, mime, sizeBytes, stagedAt }. The SHA-256 is the only payload-derived echo. |
GET | /excititor/providers/{id}/artifacts | Lists staged artifacts for the provider (metadata only). |
GET | /excititor/providers/{id}/artifacts/{artifactId}/meta | Returns 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.
| Provider | Required operator decision |
|---|---|
excititor:oracle | Confirm 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-rancher | Confirm a reachable HTTPS discoveryUri or configure offlineSnapshotPath. Provide PGP/Cosign trust material for signed-required, or select cache-only/quarantine-only. |
excititor:oci-openvex | Confirm 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
- Microsoft Entra app registration quickstart: https://learn.microsoft.com/en-us/azure/active-directory/develop/quickstart-register-app
- Microsoft Entra application credentials: https://learn.microsoft.com/en-us/entra/identity-platform/how-to-add-credentials
