- Introduced AGENTS.md, README.md, TASKS.md, and implementation_plan.md for Vexer, detailing mission, responsibilities, key components, and operational notes. - Established similar documentation structure for Vulnerability Explorer and Zastava modules, including their respective workflows, integrations, and observability notes. - Created risk scoring profiles documentation outlining the core workflow, factor model, governance, and deliverables. - Ensured all modules adhere to the Aggregation-Only Contract and maintain determinism and provenance in outputs.
		
			
				
	
	
		
			140 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			140 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| # Export Center Profiles
 | |
| 
 | |
| Export Center profiles define what data is collected, how it is encoded, and which distribution paths are enabled for a run. Profiles are tenant-scoped and deterministic: identical selectors and source data produce identical bundles. This guide summarises built-in profiles, configuration fields, schema conventions, and compatibility notes.
 | |
| 
 | |
| ## Profile catalogue
 | |
| 
 | |
| | Profile | Kind / Variant | Output artefacts | Primary use cases |
 | |
| |---------|----------------|------------------|-------------------|
 | |
| | `json:raw` | `json` / `raw` | Canonical JSONL archives of advisories, VEX, SBOMs | Evidence escrow, analytics pipelines |
 | |
| | `json:policy` | `json` / `policy` | `json:raw` artefacts plus policy snapshot + evaluated findings | Audit, compliance attestations |
 | |
| | `trivy:db` | `trivy` / `db` | Trivy-compatible vulnerability database | Feeding external scanners / CI |
 | |
| | `trivy:java-db` | `trivy` / `java-db` | Java ecosystem supplement for Trivy | Supply Java CVE data to Trivy |
 | |
| | `mirror:full` | `mirror` / `full` | Complete mirror bundle (raw, policy, indexes, provenance) | Air-gap deployments, disaster recovery |
 | |
| | `mirror:delta` | `mirror` / `delta` | Incremental changes relative to a prior manifest | Efficient mirror updates |
 | |
| 
 | |
| Profiles can be cloned and customised; configuration is immutable per revision to keep runs reproducible.
 | |
| 
 | |
| ## Common configuration fields
 | |
| 
 | |
| | Field | Description | Applies to | Notes |
 | |
| |-------|-------------|------------|-------|
 | |
| | `name` | Human-readable identifier displayed in Console/CLI | All | Unique per tenant. |
 | |
| | `kind` | Logical family (`json`, `trivy`, `mirror`) | All | Determines eligible adapters. |
 | |
| | `variant` | Specific export flavour (see table above) | All | Controls adapter behaviour. |
 | |
| | `include` | Record types to include (`advisories`, `vex`, `sboms`, `findings`) | JSON, mirror | Defaults depend on variant. |
 | |
| | `policySnapshotMode` | `required`, `optional`, or `none` | JSON policy, mirror | `required` forces a policy snapshot id when creating runs. |
 | |
| | `distribution` | Enabled distribution drivers (`http`, `oci`, `object`) | All | Offline installs typically disable `oci`. |
 | |
| | `compression` | Compression settings (`zstd`, level) | JSON, mirror | Trivy adapters manage compression internally. |
 | |
| | `encryption` | Mirror encryption options (`enabled`, `recipientKeys`, `strict`) | Mirror | When enabled, only `/data` subtree is encrypted; manifests remain plaintext. |
 | |
| | `retention` | Retention policy (days or `never`) | All | Drives pruning jobs for staged bundles. |
 | |
| 
 | |
| Selectors (time windows, tenants, products, SBOM subjects, ecosystems) are supplied per run, not stored in the profile.
 | |
| 
 | |
| ## JSON profiles
 | |
| 
 | |
| ### `json:raw`
 | |
| - **Content:** Exports raw advisories, VEX statements, and SBOMs as newline-delimited JSON (`.jsonl.zst`).
 | |
| - **Schema:** Follows canonical StellaOps schema with casing and timestamps normalised. Each record includes `tenant`, `source`, `linkset`, and `content` fields.
 | |
| - **Options:**
 | |
|   - `include` defaults to `["advisories", "vex", "sboms"]`.
 | |
|   - `compression` defaults to `zstd` level 9.
 | |
|   - `maxRecordsPerFile` (optional) splits outputs for large datasets.
 | |
| - **Compatibility:** Intended for analytics platforms, data escrow, or feeding downstream normalisation pipelines.
 | |
| - **Sample manifest excerpt:**
 | |
| 
 | |
| ```json
 | |
| {
 | |
|   "profile": { "kind": "json", "variant": "raw" },
 | |
|   "outputs": [
 | |
|     { "type": "advisories.jsonl.zst", "sha256": "...", "count": 15234 },
 | |
|     { "type": "vex.jsonl.zst", "sha256": "...", "count": 3045 },
 | |
|     { "type": "sboms.jsonl.zst", "sha256": "...", "count": 872 }
 | |
|   ],
 | |
|   "selectors": { "tenant": "acme", "products": ["registry.example/app"] }
 | |
| }
 | |
| ```
 | |
| 
 | |
| ### `json:policy`
 | |
| - **Content:** Everything from `json:raw` plus:
 | |
|   - `policy_snapshot.json` (policy metadata, version, hash).
 | |
|   - `findings.policy.jsonl.zst` (evaluated findings with decision, rationale, rule id, inputs hash).
 | |
| - **Determinism:** Requires a policy snapshot id; runs fail if snapshot is missing or non-deterministic mode is active.
 | |
| - **Use cases:** Compliance exports, auditor packages, policy attestation archives.
 | |
| - **Guardrails:** AOC boundaries preserved: policy outputs are clearly partitioned from raw evidence.
 | |
| 
 | |
| ## Trivy profiles
 | |
| 
 | |
| ### `trivy:db`
 | |
| - Detailed adapter behaviour is documented in `docs/modules/export-center/trivy-adapter.md`.
 | |
| - **Content:** Produces a Trivy DB-compatible bundle (SQLite database or tarball as required by Trivy version).
 | |
| - **Mapping rules:**
 | |
|   - Advisory namespaces mapped to Trivy vendor IDs (e.g., `ubuntu`, `debian`, `npm`).
 | |
|   - Version ranges translated into Trivy's semantic version syntax.
 | |
|   - Severity mapped to Trivy standard (`UNKNOWN`, `LOW`, `MEDIUM`, `HIGH`, `CRITICAL`).
 | |
| - **Validation:** Adapter enforces supported Trivy schema versions; configuration includes `targetSchemaVersion`.
 | |
| - **Distribution:** Typically pushed to OCI or object storage for downstream scanners; Console download remains available.
 | |
| 
 | |
| ### `trivy:java-db`
 | |
| - Refer to `docs/modules/export-center/trivy-adapter.md` for ecosystem-specific notes.
 | |
| - **Content:** Optional Java ecosystem supplement for Trivy (matching Trivy's separate Java DB).
 | |
| - **Dependencies:** Requires Java advisories in Findings Ledger; run fails with `ERR_EXPORT_EMPTY` if no Java data present and `allowEmpty=false`.
 | |
| - **Compatibility:** Intended for organisations using Trivy's Java plugin or hardened pipelines that split general and Java feeds.
 | |
| 
 | |
| ## Mirror profiles
 | |
| 
 | |
| ### `mirror:full`
 | |
| - Bundle structure and delta strategy are covered in `docs/modules/export-center/mirror-bundles.md`.
 | |
| - **Content:** Complete export with:
 | |
|   - Raw advisories, VEX, SBOMs (`/data/raw`).
 | |
|   - Policy overlays (`/data/policy`), including evaluated findings and policy snapshots.
 | |
|   - Indexes for fast lookup (`/indexes/advisories.pb`, `/indexes/sboms.pb`).
 | |
|   - Manifests and provenance (`/manifests/export.json`, `/manifests/provenance.json`).
 | |
| - **Layout:** Deterministic directory structure with hashed filenames to reduce duplication.
 | |
| - **Encryption:** Optional `encryption` block enables age/AES-GCM encryption of `/data`. `strict=true` encrypts everything except `export.json`.
 | |
| - **Use cases:** Air-gap replication, disaster recovery drills, Offline Kit seeding.
 | |
| 
 | |
| ### `mirror:delta`
 | |
| - See `docs/modules/export-center/mirror-bundles.md` for delta mechanics and application order.
 | |
| - **Content:** Includes only changes relative to a base manifest (specified by `baseExportId` when running).
 | |
|   - `changed`, `added`, `removed` lists in `manifests/delta.json`.
 | |
|   - Incremental indexes capturing only updated subjects.
 | |
| - **Constraints:** Requires the base manifest to exist in object storage or artifact registry accessible to the worker. Fails with `ERR_EXPORT_BASE_MISSING` otherwise.
 | |
| - **Workflow:** Ideal for frequent updates to mirrored environments with limited bandwidth.
 | |
| 
 | |
| ## Compatibility and guardrails
 | |
| - **Aggregation-Only Contract:** All profiles respect AOC boundaries: raw evidence is never mutated. Policy outputs are appended separately with clear provenance.
 | |
| - **Tenant scoping:** Profiles are tenant-specific. Cross-tenant exports require explicit administrative approval and signed justification.
 | |
| - **Retriable runs:** Re-running a profile with identical selectors yields matching manifests and hashes, facilitating verify-on-download workflows.
 | |
| - **Offline operation:** JSON and mirror profiles function in offline mode without additional configuration. Trivy profiles require pre-seeded schema metadata shipped via Offline Kit.
 | |
| - **Quota integration:** Profiles can define run quotas (per tenant per day). Quota exhaustion surfaces as `429 Too Many Requests` with `X-Stella-Quota-*` hints.
 | |
| 
 | |
| ## Example profile definition (CLI)
 | |
| 
 | |
| ```jsonc
 | |
| {
 | |
|   "name": "daily-json-raw",
 | |
|   "kind": "json",
 | |
|   "variant": "raw",
 | |
|   "include": ["advisories", "vex", "sboms"],
 | |
|   "distribution": ["http", "object"],
 | |
|   "compression": { "codec": "zstd", "level": 9 },
 | |
|   "retention": { "mode": "days", "value": 14 }
 | |
| }
 | |
| ```
 | |
| 
 | |
| Create via `stella export profile create --file profile.json` (CLI command documented separately).
 | |
| 
 | |
| ## Verification workflow
 | |
| - Download bundle via Console/CLI and extract `export.json` and `provenance.json`.
 | |
| - Run `cosign verify --key <tenant-key> export.json` (for detatched signatures use `--signature export.json.sig`).
 | |
| - Validate Trivy bundles with `trivy --cache-dir <temp> --debug --db-repository <oci-ref>` or local `trivy module db import`.
 | |
| - For mirror bundles, run internal `mirror verify` script (bundled in Offline Kit) to ensure directory layout and digests match manifest.
 | |
| 
 | |
| ## Extending profiles
 | |
| - Use API/CLI to clone an existing profile and adjust `include`, `distribution`, or retention policies.
 | |
| - Adapter plug-ins can introduce new variants (e.g., `json:raw-lite`, `mirror:policy-only`). Plug-ins must be registered at service restart and documented under `/docs/modules/export-center/profiles.md`.
 | |
| - Any new profile must append the imposed rule line and follow determinism and guardrail requirements.
 | |
| 
 | |
| > **Imposed rule:** Work of this type or tasks of this type on this component must also be applied everywhere else it should be applied.
 |