384 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Markdown
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			384 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Markdown
		
	
	
		
			Executable File
		
	
	
	
	
| #  3 · Product Vision — **Stella Ops**  
 | ||
| 
 | ||
| ## 1) Problem Statement & Goals
 | ||
| 
 | ||
| We ship containers. We need:
 | ||
| - **Authenticity & integrity** of build artifacts and metadata.
 | ||
| - **Provenance** attached to artifacts, not platforms.
 | ||
| - **Transparency** to detect tampering and retroactive edits.
 | ||
| - **Determinism & explainability** so scanner judgments can be replayed and justified.
 | ||
| - **Actionability** to separate theoretical from exploitable risk (VEX).
 | ||
| - **Minimal trust** across multi‑tenant and third‑party boundaries.
 | ||
| 
 | ||
| **Non‑goals:** Building a new package manager, inventing new SBOM/attestation formats, or depending on closed standards.
 | ||
| 
 | ||
| ---
 | ||
| 
 | ||
| ## 2) Golden Path (Minimal End‑to‑End Flow)
 | ||
| 
 | ||
| ```mermaid
 | ||
| flowchart LR
 | ||
|     A[Source / Image / Rootfs] --> B[SBOM Producer\nCycloneDX 1.6]
 | ||
|     B --> C[Signer\nin‑toto Attestation + DSSE]
 | ||
|     C --> D[Transparency\nSigstore Rekor - optional but RECOMMENDED]
 | ||
|     D --> E[Durable Storage\nSBOMs, Attestations, Proofs]
 | ||
|     E --> F[Scanner\nPkg analyzers + Entry‑trace + Layer cache]
 | ||
|     F --> G[VEX Authoring\nOpenVEX + SPDX 3.0.1 relationships]
 | ||
|     G --> H[Policy Gate\nOPA/Rego: allow/deny + waivers]
 | ||
|     H --> I[Artifacts Store\nReports, SARIF, VEX, Audit log]
 | ||
| ````
 | ||
| 
 | ||
| **Adopted standards (pinned for interoperability):**
 | ||
| 
 | ||
| * **SBOM:** CycloneDX **1.6** (JSON/XML)
 | ||
| * **Attestation & signing:** **in‑toto Attestations** (Statement + Predicate) in **DSSE** envelopes
 | ||
| * **Transparency:** **Sigstore Rekor** (inclusion proofs, monitoring)
 | ||
| * **Exploitability:** **OpenVEX** (statuses & justifications)
 | ||
| * **Modeling & interop:** **SPDX 3.0.1** (relationships / VEX modeling)
 | ||
| * **Findings interchange (optional):** SARIF for analyzer output
 | ||
| 
 | ||
| > Pinnings are *policy*, not claims about “latest”. We may update pins via normal change control.
 | ||
| 
 | ||
| ---
 | ||
| 
 | ||
| ## 3) Security Invariants (What MUST Always Hold)
 | ||
| 
 | ||
| 1. **Artifact identity is content‑addressed.**
 | ||
| 
 | ||
|    * All identities are SHA‑256 digests of immutable blobs (images, SBOMs, attestations).
 | ||
| 2. **Every SBOM is signed.**
 | ||
| 
 | ||
|    * SBOMs MUST be wrapped in **in‑toto DSSE** attestations tied to the container digest.
 | ||
| 3. **Provenance is attached, not implied.**
 | ||
| 
 | ||
|    * Build metadata (who/where/how) MUST ride as attestations linked by digest.
 | ||
| 4. **Transparency FIRST mindset.**
 | ||
| 
 | ||
|    * Signatures/attestations SHOULD be logged to **Rekor** and store inclusion proofs.
 | ||
| 5. **Determinism & replay.**
 | ||
| 
 | ||
|    * Scans MUST be reproducible given: input digests, scanner version, DB snapshot, and config.
 | ||
| 6. **Explainability.**
 | ||
| 
 | ||
|    * Findings MUST show the *why*: package → file path → call‑stack / entrypoint (when available).
 | ||
| 7. **Exploitability over enumeration.**
 | ||
| 
 | ||
|    * Risk MUST be communicated via **VEX** (OpenVEX), including **under_investigation** where appropriate.
 | ||
| 8. **Least privilege & minimal trust.**
 | ||
| 
 | ||
|    * Build keys are short‑lived; scanners run on ephemeral, least‑privileged workers.
 | ||
| 9. **Air‑gap friendly.**
 | ||
| 
 | ||
|    * Mirrors for vuln DBs and containers; all verification MUST work without public egress.
 | ||
| 10. **No hidden blockers.**
 | ||
| 
 | ||
| * Policy gates MUST be code‑reviewable (e.g., Rego) and auditable; waivers are attestations, not emails.
 | ||
| 
 | ||
| ---
 | ||
| 
 | ||
| ## 4) Trust Boundaries & Roles
 | ||
| 
 | ||
| <!-- ```mermaid
 | ||
| flowchart TB
 | ||
|     subgraph DevTenant[Dev Tenant]
 | ||
|       SRC[Source Code]
 | ||
|       CI[CI Runner]
 | ||
|     end
 | ||
|     subgraph SecPlatform[Security Platform]
 | ||
|       SB[SBOM Service]
 | ||
|       AT[Attestation Service]
 | ||
|       TR[Transparency Client]
 | ||
|       SCN[Scanner Pool]
 | ||
|       POL[Policy Gate]
 | ||
|       ST[Artifacts Store]
 | ||
|     end
 | ||
|     subgraph External[External/3rd‑party]
 | ||
|       REG[Container Registry]
 | ||
|       REK[Rekor]
 | ||
|     end
 | ||
| 
 | ||
|     SRC --> CI
 | ||
|     CI -->|image digest| REG
 | ||
|     REG -->|pull by digest| SB
 | ||
|     SB --> AT --> TR --> REK
 | ||
|     AT --> ST
 | ||
|     REK --> ST
 | ||
|     ST --> SCN --> POL --> ST
 | ||
| 
 | ||
| ``` -->
 | ||
| 
 | ||
| * **Build/CI:** Holds signing capability (short‑lived keys or keyless signing).
 | ||
| * **Registry:** Source of truth for image bytes; access via digest only.
 | ||
| * **Scanner Pool:** Ephemeral nodes; content‑addressed caches; no shared mutable state.
 | ||
| * **Artifacts Store:** Immutable, WORM‑like storage for SBOMs, attestations, proofs, SARIF, VEX.
 | ||
| 
 | ||
| ---
 | ||
| 
 | ||
| ## 5) Data & Evidence We Persist
 | ||
| 
 | ||
| | Artifact             | MUST Persist                         | Why                          |
 | ||
| | -------------------- | ------------------------------------ | ---------------------------- |
 | ||
| | SBOM (CycloneDX 1.6) | Raw file + DSSE attestation          | Reproducibility, audit       |
 | ||
| | in‑toto Statement    | Full JSON                            | Traceability                 |
 | ||
| | Rekor entry          | UUID + inclusion proof               | Tamper‑evidence              |
 | ||
| | Scanner output       | SARIF + raw notes                    | Triage & tooling interop     |
 | ||
| | VEX                  | OpenVEX + links to findings          | Noise reduction & compliance |
 | ||
| | Policy decisions     | Input set + decision + rule versions | Governance & forensics       |
 | ||
| 
 | ||
| Retention follows our Compliance policy; default **≥ 18 months**.
 | ||
| 
 | ||
| ---
 | ||
| 
 | ||
| ## 6) Scanner Requirements (Determinism & Explainability)
 | ||
| 
 | ||
| * **Inputs pinned:** image digest(s), SBOM(s), scanner version, vuln DB snapshot date, config hash.
 | ||
| * **Explainability:** show file paths, package coords (e.g., purl), and—when possible—**entry‑trace/call‑stack** from executable entrypoints to vulnerable symbol(s).
 | ||
| * **Caching:** content‑addressed per‑layer & per‑ecosystem caches; warming does not change decisions.
 | ||
| * **Unknowns:** output **under_investigation** where exploitability is not yet known; roll into VEX.
 | ||
| * **Interchange:** emit **SARIF** for IDE and pipeline consumption (optional but recommended).
 | ||
| 
 | ||
| ---
 | ||
| 
 | ||
| ## 7) Policy Gate (OPA/Rego) — Examples
 | ||
| 
 | ||
| > Gate runs after scan + VEX merge. It treats VEX as first‑class input.
 | ||
| 
 | ||
| ### 7.1 Deny unreconciled criticals that are exploitable
 | ||
| 
 | ||
| ```rego
 | ||
| package stella.policy
 | ||
| 
 | ||
| default allow := false
 | ||
| 
 | ||
| exploitable(v) {
 | ||
|   v.severity == "CRITICAL"
 | ||
|   v.exploitability == "affected"
 | ||
| }
 | ||
| 
 | ||
| allow {
 | ||
|   not exploitable_some
 | ||
| }
 | ||
| 
 | ||
| exploitable_some {
 | ||
|   some v in input.findings
 | ||
|   exploitable(v)
 | ||
|   not waived(v.id)
 | ||
| }
 | ||
| 
 | ||
| waived(id) {
 | ||
|   some w in input.vex
 | ||
|   w.vuln_id == id
 | ||
|   w.status == "not_affected"
 | ||
|   w.justification != ""
 | ||
| }
 | ||
| ```
 | ||
| 
 | ||
| ### 7.2 Require Rekor inclusion for attestations
 | ||
| 
 | ||
| ```rego
 | ||
| package stella.policy
 | ||
| 
 | ||
| violation[msg] {
 | ||
|   some a in input.attestations
 | ||
|   not a.rekor.inclusion_proof
 | ||
|   msg := sprintf("Attestation %s lacks Rekor inclusion proof", [a.id])
 | ||
| }
 | ||
| ```
 | ||
| 
 | ||
| ---
 | ||
| 
 | ||
| ## 8) Version Pins & Compatibility
 | ||
| 
 | ||
| | Domain       | Standard       | Stella Pin       | Notes                                            |
 | ||
| | ------------ | -------------- | ---------------- | ------------------------------------------------ |
 | ||
| | SBOM         | CycloneDX      | **1.6**          | JSON or XML accepted; JSON preferred             |
 | ||
| | Attestation  | in‑toto        | **Statement v1** | Predicates per use case (e.g., sbom, provenance) |
 | ||
| | Envelope     | DSSE           | **v1**           | Canonical JSON payloads                          |
 | ||
| | Transparency | Sigstore Rekor | **API stable**   | Inclusion proof stored alongside artifacts       |
 | ||
| | VEX          | OpenVEX        | **spec current** | Map to SPDX 3.0.1 relationships as needed        |
 | ||
| | Interop      | SPDX           | **3.0.1**        | Use for modeling & cross‑ecosystem exchange      |
 | ||
| | Findings     | SARIF          | **2.1.0**        | Optional but recommended                         |
 | ||
| 
 | ||
| ---
 | ||
| 
 | ||
| ## 9) Minimal CLI Playbook (Illustrative)
 | ||
| 
 | ||
| > Commands below are illustrative; wire them into CI with short‑lived credentials.
 | ||
| 
 | ||
| ```bash
 | ||
| # 1) Produce SBOM (CycloneDX 1.6) from image digest
 | ||
| syft registry:5000/myimg@sha256:... -o cyclonedx-json > sbom.cdx.json
 | ||
| 
 | ||
| # 2) Create in‑toto DSSE attestation bound to the image digest
 | ||
| cosign attest --predicate sbom.cdx.json \
 | ||
|   --type https://stella-ops.org/attestations/sbom/1 \
 | ||
|   --key env://COSIGN_KEY \
 | ||
|   registry:5000/myimg@sha256:...
 | ||
| 
 | ||
| # 3) (Optional but recommended) Rekor transparency
 | ||
| cosign sign --key env://COSIGN_KEY registry:5000/myimg@sha256:...
 | ||
| cosign verify-attestation --type ... --certificate-oidc-issuer https://token.actions... registry:5000/myimg@sha256:... > rekor-proof.json
 | ||
| 
 | ||
| # 4) Scan (pinned DB snapshot)
 | ||
| stella-scan --image registry:5000/myimg@sha256:... \
 | ||
|   --sbom sbom.cdx.json \
 | ||
|   --db-snapshot 2025-10-01 \
 | ||
|   --out findings.sarif
 | ||
| 
 | ||
| # 5) Emit VEX
 | ||
| stella-vex --from findings.sarif --policy vex-policy.yaml --out vex.json
 | ||
| 
 | ||
| # 6) Gate
 | ||
| opa eval -i gate-input.json -d policy/ -f pretty "data.stella.policy.allow"
 | ||
| ```
 | ||
| 
 | ||
| ---
 | ||
| 
 | ||
| ## 10) JSON Skeletons (Copy‑Ready)
 | ||
| 
 | ||
| ### 10.1 in‑toto Statement (DSSE payload)
 | ||
| 
 | ||
| ```json
 | ||
| {
 | ||
|   "_type": "https://in-toto.io/Statement/v1",
 | ||
|   "subject": [
 | ||
|     {
 | ||
|       "name": "registry:5000/myimg",
 | ||
|       "digest": { "sha256": "IMAGE_DIGEST_SHA256" }
 | ||
|     }
 | ||
|   ],
 | ||
|   "predicateType": "https://stella-ops.org/attestations/sbom/1",
 | ||
|   "predicate": {
 | ||
|     "sbomFormat": "CycloneDX",
 | ||
|     "sbomVersion": "1.6",
 | ||
|     "mediaType": "application/vnd.cyclonedx+json",
 | ||
|     "location": "sha256:SBOM_BLOB_SHA256"
 | ||
|   }
 | ||
| }
 | ||
| ```
 | ||
| 
 | ||
| ### 10.2 DSSE Envelope (wrapping the Statement)
 | ||
| 
 | ||
| ```json
 | ||
| {
 | ||
|   "payloadType": "application/vnd.in-toto+json",
 | ||
|   "payload": "BASE64URL_OF_CANONICAL_STATEMENT_JSON",
 | ||
|   "signatures": [
 | ||
|     {
 | ||
|       "keyid": "KEY_ID_OR_CERT_ID",
 | ||
|       "sig": "BASE64URL_SIGNATURE"
 | ||
|     }
 | ||
|   ]
 | ||
| }
 | ||
| ```
 | ||
| 
 | ||
| ### 10.3 OpenVEX (compact)
 | ||
| 
 | ||
| ```json
 | ||
| {
 | ||
|   "@context": "https://openvex.dev/ns/v0.2.0",
 | ||
|   "author": "Stella Ops Security",
 | ||
|   "timestamp": "2025-10-29T00:00:00Z",
 | ||
|   "statements": [
 | ||
|     {
 | ||
|       "vulnerability": "CVE-2025-0001",
 | ||
|       "products": ["pkg:purl/example@1.2.3?arch=amd64"],
 | ||
|       "status": "under_investigation",
 | ||
|       "justification": "analysis_ongoing",
 | ||
|       "timestamp": "2025-10-29T00:00:00Z"
 | ||
|     }
 | ||
|   ]
 | ||
| }
 | ||
| ```
 | ||
| 
 | ||
| ---
 | ||
| 
 | ||
| ## 11) Handling “Unknowns” & Noise
 | ||
| 
 | ||
| * Use **OpenVEX** statuses: `affected`, `not_affected`, `fixed`, `under_investigation`.
 | ||
| * Prefer **justifications** over free‑text.
 | ||
| * Time‑bound **waivers** are modeled as VEX with `not_affected` + justification or `affected` + compensating controls.
 | ||
| * Dashboards MUST surface counts separately for `under_investigation` so risk is visible.
 | ||
| 
 | ||
| ---
 | ||
| 
 | ||
| ## 12) Operational Guidance
 | ||
| 
 | ||
| **Key management**
 | ||
| 
 | ||
| * Use **ephemeral OIDC** or short‑lived keys (HSM/KMS bound).
 | ||
| * Rotate signer identities at least quarterly; no shared long‑term keys in CI.
 | ||
| 
 | ||
| **Caching & performance**
 | ||
| 
 | ||
| * Layer caches keyed by digest + analyzer version.
 | ||
| * Pre‑warm vuln DB snapshots; mirror into air‑gapped envs.
 | ||
| 
 | ||
| **Multi‑tenancy**
 | ||
| 
 | ||
| * Strict tenant isolation for storage and compute.
 | ||
| * Rate‑limit and bound memory/CPU per scan job.
 | ||
| 
 | ||
| **Auditing**
 | ||
| 
 | ||
| * Every decision is a record: inputs, versions, rule commit, actor, result.
 | ||
| * Preserve Rekor inclusion proofs with the attestation record.
 | ||
| 
 | ||
| ---
 | ||
| 
 | ||
| ## 13) Exceptions Process (Break‑glass)
 | ||
| 
 | ||
| 1. Open a tracked exception with: artifact digest, CVE(s), business justification, expiry.
 | ||
| 2. Generate VEX entry reflecting the exception (`not_affected` with justification or `affected` with compensating controls).
 | ||
| 3. Merge into policy inputs; **policy MUST read VEX**, not tickets.
 | ||
| 4. Re‑review before expiry; exceptions cannot auto‑renew.
 | ||
| 
 | ||
| ---
 | ||
| 
 | ||
| ## 14) Threat Model (Abbreviated)
 | ||
| 
 | ||
| * **Tampering**: modified SBOMs/attestations → mitigated by DSSE + Rekor + WORM storage.
 | ||
| * **Confused deputy**: scanning a different image → mitigated by digest‑only pulls and subject digests in attestations.
 | ||
| * **TOCTOU / re‑tagging**: registry tags drift → mitigated by digest pinning everywhere.
 | ||
| * **Scanner poisoning**: unpinned DBs → mitigated by snapshotting and recording version/date.
 | ||
| * **Key compromise**: long‑lived CI keys → mitigated by OIDC keyless or short‑lived KMS keys.
 | ||
| 
 | ||
| ---
 | ||
| 
 | ||
| ## 15) Implementation Checklist
 | ||
| 
 | ||
| * [ ] SBOM producer emits CycloneDX 1.6; bound to image digest.
 | ||
| * [ ] in‑toto+DSSE signing wired in CI; Rekor logging enabled.
 | ||
| * [ ] Durable artifact store with WORM semantics.
 | ||
| * [ ] Scanner produces explainable findings; SARIF optional.
 | ||
| * [ ] OpenVEX emitted and archived; linked to findings & image.
 | ||
| * [ ] Policy gate enforced; waivers modeled as VEX; decisions logged.
 | ||
| * [ ] Air‑gap mirrors for registry and vuln DBs.
 | ||
| * [ ] Runbooks for key rotation, Rekor outage, and database rollback.
 | ||
| 
 | ||
| ---
 | ||
| 
 | ||
| ## 16) Glossary
 | ||
| 
 | ||
| * **SBOM**: Software Bill of Materials describing packages/components within an artifact.
 | ||
| * **Attestation**: Signed statement binding facts (predicate) to a subject (artifact) using in‑toto.
 | ||
| * **DSSE**: Envelope that signs the canonical payload detached from transport.
 | ||
| * **Transparency Log**: Append‑only log (e.g., Rekor) giving inclusion and temporal proofs.
 | ||
| * **VEX**: Vulnerability Exploitability eXchange expressing exploitability status & justification.
 | ||
| 
 | ||
| ---
 | ||
| 
 | ||
| 
 | ||
| ## 8 · Change Log
 | ||
| 
 | ||
| | Version | Date        | Note (high‑level)                                                                                     |
 | ||
| | ------- | ----------- | ----------------------------------------------------------------------------------------------------- |
 | ||
| | v1.4    | 29-Oct-2025 | Initial principles, golden path, policy examples, and JSON skeletons.                                    |
 | ||
| | v1.4    | 14‑Jul‑2025 | First public revision reflecting quarterly roadmap & KPI baseline.                                    |
 | ||
| | v1.3    | 12‑Jul‑2025 | Expanded ecosystem pillar, added metrics/integrations, refined non-goals, community persona/feedback. |
 | ||
| | v1.2    | 11‑Jul‑2025 | Restructured to link with WHY; merged principles into Strategic Pillars; added review §7              |
 | ||
| | v1.1    | 11‑Jul‑2025 | Original OSS‑only vision                                                                              |
 | ||
| | v1.0    | 09‑Jul‑2025 | First public draft                                                                                    |
 | ||
| 
 | ||
| *(End of Product Vision v1.3)*
 |