VexSource
VEX documents read back as suppression rules. Fields, YAML, HCL and CLI samples, and how apply treats it.
VEX documents read back as suppression rules. A not_affected statement (CycloneDX not_affected or false_positive) becomes a suppression with the document’s justification, timestamp and author; fixed or resolved marks the finding remediated; affected, in_triage and exploitable are recorded as triage context; under_investigation is an annotation. Products are matched to findings by purl. A later statement wins. Suppressions a source creates are owned by it: they go when the statement leaves the document, and cannot be deleted by hand. Name exactly one of tea, s3, git, path or urls.
How sources are fetched, how statements become suppressions and how a path source is uploaded are on VEX documents as suppression rules. The Advanced sample applies as written. The fields the schema accepts but plan blocks are listed under what plan refuses, and the schema release carries them in examples/VexSource/unsupported-features.yaml.
apiVersion |
vulnetix.com/v1 |
kind |
VexSource |
| Group | Suppression |
| Status | Served. The config engine plans and applies it. |
| Objects per tenant | many, keyed by metadata.name |
| Token and role | An owner or admin session, or a vmt_ config management token with the owner or admin role that lists VexSource in its kinds. See Management tokens. |
| Applied after | VaultEntry (deleted before them) |
| Terraform resource | vulnetix_vex_source, imported by name (see Terraform and OpenTofu) |
| CLI | vulnetix config apply, CLI v3.157.0 and later. |
| Pinned schema | v1.15.0/VexSource.schema.json |
| Newest schema | latest/VexSource.schema.json |
| First released in | v1.1.0 |
| Print the built-in copy | vulnetix config schema VexSource |
Minimal
Only the fields the kind requires. From examples/VexSource/minimal.yaml.
YAML
# yaml-language-server: $schema=https://github.com/Vulnetix/config-schemas/releases/latest/download/VexSource.schema.json
apiVersion: vulnetix.com/v1
kind: VexSource
metadata:
name: local-vex
spec:
path:
path: .vulnetix/vex.openvex.json
HCL (resource vulnetix_vex_source)
# Only the arguments the kind requires. From config-schemas examples/VexSource/minimal.yaml.
resource "vulnetix_vex_source" "local_vex" {
name = "local-vex"
path = {
path = ".vulnetix/vex.openvex.json"
}
}
CLI (applies it)
export VULNETIX_CONFIG_TOKEN=vmt_... # a config management token
vulnetix config apply -f - --manager gitops:acme/platform --auto-approve <<'EOF'
# yaml-language-server: $schema=https://github.com/Vulnetix/config-schemas/releases/latest/download/VexSource.schema.json
apiVersion: vulnetix.com/v1
kind: VexSource
metadata:
name: local-vex
spec:
path:
path: .vulnetix/vex.openvex.json
EOF
Advanced
Every field the kind supports, with a when expression where it takes one. From examples/VexSource/advanced.yaml.
YAML
# yaml-language-server: $schema=https://github.com/Vulnetix/config-schemas/releases/latest/download/VexSource.schema.json
apiVersion: vulnetix.com/v1
kind: VexSource
metadata:
name: vendor-tea-product
labels:
team: product-security
annotations:
ticket: https://jira.example.com/browse/SEC-2217
spec:
format: auto
scope:
org: true
trust:
allowedAuthors: [security@acme.example]
refresh: { interval: 6h }
onError: keep-last
tea:
product: 7f3c1a52-1b8e-4d0e-9c3f-2a6b8e5d4c10
server: https://tea.acme.example
---
# yaml-language-server: $schema=https://github.com/Vulnetix/config-schemas/releases/latest/download/VexSource.schema.json
apiVersion: vulnetix.com/v1
kind: VexSource
metadata:
name: vendor-tea-release
spec:
format: cyclonedx
refresh: { interval: 1d }
tea:
productRelease: "urn:tei:uuid:products.acme.example:4b2e9d17-6a3c-4f81-b5d0-8e1c7a9f2d36"
server: https://tea.acme.example
---
# yaml-language-server: $schema=https://github.com/Vulnetix/config-schemas/releases/latest/download/VexSource.schema.json
apiVersion: vulnetix.com/v1
kind: VexSource
metadata:
name: vendor-tea-collection
spec:
scope:
repos: [acme/payments-api]
refresh: { webhook: true }
tea:
collection: 2c8f4e61-9d7a-4b35-a0e2-5f6c3b8d1e94
server: https://tea.vendor.example.com
---
# yaml-language-server: $schema=https://github.com/Vulnetix/config-schemas/releases/latest/download/VexSource.schema.json
apiVersion: vulnetix.com/v1
kind: VexSource
metadata:
name: vex-bucket
spec:
format: openvex
refresh: { webhook: true }
onError: keep-last
s3:
bucket: acme-vex-statements
prefix: openvex/
region: us-east-1
roleArn: arn:aws:iam::123456789012:role/VulnetixVexRead
externalId: acme-vex-read-7f3c1a52
---
# yaml-language-server: $schema=https://github.com/Vulnetix/config-schemas/releases/latest/download/VexSource.schema.json
apiVersion: vulnetix.com/v1
kind: VexSource
metadata:
name: vex-bucket-object
spec:
format: openvex
refresh: { interval: 30m }
s3:
bucket: acme-vex-public
region: us-east-1
key: products/ledger/ledger.openvex.json
roleArn: arn:aws:iam::123456789012:role/VulnetixVexRead
---
# yaml-language-server: $schema=https://github.com/Vulnetix/config-schemas/releases/latest/download/VexSource.schema.json
apiVersion: vulnetix.com/v1
kind: VexSource
metadata:
name: platform-repo
spec:
scope:
repos: [acme/payments-api, acme/ledger]
git:
url: https://github.com/acme/security-advisories.git
ref: main
paths: ["vex/**/*.openvex.json", "vex/**/*.cdx.json"]
credentialRef: github-advisories-token
---
# yaml-language-server: $schema=https://github.com/Vulnetix/config-schemas/releases/latest/download/VexSource.schema.json
apiVersion: vulnetix.com/v1
kind: VexSource
metadata:
name: local-vex
spec:
format: cyclonedx
path:
path: .vulnetix/vex.cdx.json
---
# yaml-language-server: $schema=https://github.com/Vulnetix/config-schemas/releases/latest/download/VexSource.schema.json
apiVersion: vulnetix.com/v1
kind: VexSource
metadata:
name: upstream-urls
spec:
refresh: { interval: 1d }
onError: clear
urls:
- https://downloads.example.org/vex/product.openvex.json
- url: https://vendor.example.com/vex/all.cdx.json
sha256: 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08
auth:
header: Authorization
credentialRef: vendor-vex-token
HCL (resource vulnetix_vex_source)
# Every argument the kind supports. From config-schemas examples/VexSource/advanced.yaml.
resource "vulnetix_vex_source" "vendor_tea_product" {
name = "vendor-tea-product"
format = "auto"
on_error = "keep-last"
refresh = {
interval = "6h"
}
scope = {
org = true
}
tea = {
product = "7f3c1a52-1b8e-4d0e-9c3f-2a6b8e5d4c10"
server = "https://tea.acme.example"
}
trust = {
allowed_authors = ["security@acme.example"]
}
labels = {
team = "product-security"
}
annotations = {
ticket = "https://jira.example.com/browse/SEC-2217"
}
}
resource "vulnetix_vex_source" "vendor_tea_release" {
name = "vendor-tea-release"
format = "cyclonedx"
refresh = {
interval = "1d"
}
tea = {
product_release = "urn:tei:uuid:products.acme.example:4b2e9d17-6a3c-4f81-b5d0-8e1c7a9f2d36"
server = "https://tea.acme.example"
}
}
resource "vulnetix_vex_source" "vendor_tea_collection" {
name = "vendor-tea-collection"
refresh = {
webhook = true
}
scope = {
repos = ["acme/payments-api"]
}
tea = {
collection = "2c8f4e61-9d7a-4b35-a0e2-5f6c3b8d1e94"
server = "https://tea.vendor.example.com"
}
}
resource "vulnetix_vex_source" "vex_bucket" {
name = "vex-bucket"
format = "openvex"
on_error = "keep-last"
refresh = {
webhook = true
}
s_3 = {
bucket = "acme-vex-statements"
external_id = "acme-vex-read-7f3c1a52"
prefix = "openvex/"
region = "us-east-1"
role_arn = "arn:aws:iam::123456789012:role/VulnetixVexRead"
}
}
resource "vulnetix_vex_source" "vex_bucket_object" {
name = "vex-bucket-object"
format = "openvex"
refresh = {
interval = "30m"
}
s_3 = {
bucket = "acme-vex-public"
key = "products/ledger/ledger.openvex.json"
region = "us-east-1"
role_arn = "arn:aws:iam::123456789012:role/VulnetixVexRead"
}
}
resource "vulnetix_vex_source" "platform_repo" {
name = "platform-repo"
git = {
credential_ref = "github-advisories-token"
paths = ["vex/**/*.openvex.json", "vex/**/*.cdx.json"]
ref = "main"
url = "https://github.com/acme/security-advisories.git"
}
scope = {
repos = ["acme/payments-api", "acme/ledger"]
}
}
resource "vulnetix_vex_source" "local_vex" {
name = "local-vex"
format = "cyclonedx"
path = {
path = ".vulnetix/vex.cdx.json"
}
}
resource "vulnetix_vex_source" "upstream_urls" {
name = "upstream-urls"
on_error = "clear"
refresh = {
interval = "1d"
}
urls = jsonencode(["https://downloads.example.org/vex/product.openvex.json", {
auth = {
credentialRef = "vendor-vex-token"
header = "Authorization"
}
sha256 = "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08"
url = "https://vendor.example.com/vex/all.cdx.json"
}])
}
CLI (applies it)
export VULNETIX_CONFIG_TOKEN=vmt_... # a config management token
vulnetix config apply -f - --manager gitops:acme/platform --auto-approve <<'EOF'
# yaml-language-server: $schema=https://github.com/Vulnetix/config-schemas/releases/latest/download/VexSource.schema.json
apiVersion: vulnetix.com/v1
kind: VexSource
metadata:
name: vendor-tea-product
labels:
team: product-security
annotations:
ticket: https://jira.example.com/browse/SEC-2217
spec:
format: auto
scope:
org: true
trust:
allowedAuthors: [security@acme.example]
refresh: { interval: 6h }
onError: keep-last
tea:
product: 7f3c1a52-1b8e-4d0e-9c3f-2a6b8e5d4c10
server: https://tea.acme.example
---
# yaml-language-server: $schema=https://github.com/Vulnetix/config-schemas/releases/latest/download/VexSource.schema.json
apiVersion: vulnetix.com/v1
kind: VexSource
metadata:
name: vendor-tea-release
spec:
format: cyclonedx
refresh: { interval: 1d }
tea:
productRelease: "urn:tei:uuid:products.acme.example:4b2e9d17-6a3c-4f81-b5d0-8e1c7a9f2d36"
server: https://tea.acme.example
---
# yaml-language-server: $schema=https://github.com/Vulnetix/config-schemas/releases/latest/download/VexSource.schema.json
apiVersion: vulnetix.com/v1
kind: VexSource
metadata:
name: vendor-tea-collection
spec:
scope:
repos: [acme/payments-api]
refresh: { webhook: true }
tea:
collection: 2c8f4e61-9d7a-4b35-a0e2-5f6c3b8d1e94
server: https://tea.vendor.example.com
---
# yaml-language-server: $schema=https://github.com/Vulnetix/config-schemas/releases/latest/download/VexSource.schema.json
apiVersion: vulnetix.com/v1
kind: VexSource
metadata:
name: vex-bucket
spec:
format: openvex
refresh: { webhook: true }
onError: keep-last
s3:
bucket: acme-vex-statements
prefix: openvex/
region: us-east-1
roleArn: arn:aws:iam::123456789012:role/VulnetixVexRead
externalId: acme-vex-read-7f3c1a52
---
# yaml-language-server: $schema=https://github.com/Vulnetix/config-schemas/releases/latest/download/VexSource.schema.json
apiVersion: vulnetix.com/v1
kind: VexSource
metadata:
name: vex-bucket-object
spec:
format: openvex
refresh: { interval: 30m }
s3:
bucket: acme-vex-public
region: us-east-1
key: products/ledger/ledger.openvex.json
roleArn: arn:aws:iam::123456789012:role/VulnetixVexRead
---
# yaml-language-server: $schema=https://github.com/Vulnetix/config-schemas/releases/latest/download/VexSource.schema.json
apiVersion: vulnetix.com/v1
kind: VexSource
metadata:
name: platform-repo
spec:
scope:
repos: [acme/payments-api, acme/ledger]
git:
url: https://github.com/acme/security-advisories.git
ref: main
paths: ["vex/**/*.openvex.json", "vex/**/*.cdx.json"]
credentialRef: github-advisories-token
---
# yaml-language-server: $schema=https://github.com/Vulnetix/config-schemas/releases/latest/download/VexSource.schema.json
apiVersion: vulnetix.com/v1
kind: VexSource
metadata:
name: local-vex
spec:
format: cyclonedx
path:
path: .vulnetix/vex.cdx.json
---
# yaml-language-server: $schema=https://github.com/Vulnetix/config-schemas/releases/latest/download/VexSource.schema.json
apiVersion: vulnetix.com/v1
kind: VexSource
metadata:
name: upstream-urls
spec:
refresh: { interval: 1d }
onError: clear
urls:
- https://downloads.example.org/vex/product.openvex.json
- url: https://vendor.example.com/vex/all.cdx.json
sha256: 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08
auth:
header: Authorization
credentialRef: vendor-vex-token
EOF
Fields
Paths use dots for nesting and [] for the items of a list. Required means required whenever the parent object is present. A default is what the server uses when the field is left out.
| Field | Type | Required | Default | Allowed values | Description |
|---|---|---|---|---|---|
apiVersion |
string | yes | exactly vulnetix.com/v1 |
The document format version. Every kind in this release is vulnetix.com/v1. | |
kind |
string | yes | exactly VexSource |
Always VexSource. | |
metadata |
object | yes | no other keys | ||
metadata.name |
string | yes | pattern ^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$ |
The object’s name, unique per kind within a tenant. It is the natural key: plan, apply, export and the Terraform provider all address an object by kind and name. | |
metadata.org |
string | no | format uuid |
The tenant (organization UUID) the document belongs to. When set, plan and apply refuse to run against any other tenant. | |
metadata.labels |
object | no | map of string to string (length 0 to 256); keys match ^[a-z0-9]([a-z0-9._/-]{0,61}[a-z0-9])?$ |
Free key/value labels. Stored with the object, never interpreted by the server. | |
metadata.annotations |
object | no | map of string to string (length 0 to 4096) | Free key/value notes for people and tools, such as a ticket link. | |
spec |
object | yes | no other keys | ||
spec.format |
string | no | auto |
openvex, cyclonedx, auto |
openvex: OpenVEX 0.2.0. cyclonedx: CycloneDX VEX 1.4 to 1.7 (vulnerabilities[].analysis). auto: decided per document. |
spec.scope |
object | no | no other keys | Which findings the statements may suppress. Left out, the whole tenant. | |
spec.scope.org |
boolean | no | exactly true |
The whole tenant. | |
spec.scope.repos |
array of string | no | 1 to any items; items unique; each item: pattern ^[^\s/]+(/[^\s/]+)+$ |
||
spec.scope.products |
array of string | no | 1 to any items; items unique; each item: pattern ^urn:tei:[a-z0-9-]+:.+, or format uuid |
TEA products, by TEI or uuid. | |
spec.trust |
object | no | no other keys | ||
spec.trust.requireSignature |
boolean | no | false |
Refuse a document that is not signed. | |
spec.trust.allowedAuthors |
array of string | no | 1 to any items; items unique; each item: length 1 to any | Only statements by these authors (the VEX author field) are used. | |
spec.refresh |
object | no | no other keys | When the documents are fetched again: every interval, or when a webhook says they changed. | |
spec.refresh.interval |
string | no | pattern ^[1-9][0-9]*(m|h|d)$ |
A whole number of minutes, hours or days: 30m, 6h, 1d. | |
spec.refresh.webhook |
boolean | no | exactly true |
||
spec.onError |
string | no | keep-last |
keep-last, clear |
When a fetch fails: keep-last keeps the suppressions from the last good fetch; clear removes them. |
spec.tea |
object | no | no other keys | VEX artifacts from a TEA collection, on the Vulnetix TEA publisher or any TEA server. Name exactly one of product, productRelease or collection. | |
spec.tea.product |
string | no | pattern ^urn:tei:[a-z0-9-]+:.+, or format uuid |
A TEA identifier (urn:tei:…) or a uuid. | |
spec.tea.productRelease |
string | no | pattern ^urn:tei:[a-z0-9-]+:.+, or format uuid |
A TEA identifier (urn:tei:…) or a uuid. | |
spec.tea.collection |
string | no | pattern ^urn:tei:[a-z0-9-]+:.+, or format uuid |
A TEA identifier (urn:tei:…) or a uuid. | |
spec.tea.server |
string | yes | pattern ^https://; format uri |
The TEA API root, or the host whose /.well-known/tea discovery names it. | |
spec.s3 |
object | no | no other keys | Documents in an S3 bucket, read through a cross-account role whose external id is the tenant uuid (the cloud onboarding trust pattern), or from an S3-compatible endpoint (R2, MinIO). Name exactly one of prefix or key. | |
spec.s3.bucket |
string | yes | pattern ^[a-z0-9][a-z0-9.-]{1,61}[a-z0-9]$ |
||
spec.s3.prefix |
string | no | Every object under this prefix. | ||
spec.s3.key |
string | no | length 1 to any | One object. | |
spec.s3.region |
string | no | pattern ^[a-z]{2}(-[a-z]+)+-[0-9]$ |
||
spec.s3.roleArn |
string | no | pattern ^arn:aws[a-z-]*:iam::[0-9]{12}:role/.+$ |
The role to assume. Required unless endpoint is set. | |
spec.s3.externalId |
string | no | length 2 to any | The external id the role’s trust policy requires. Defaults to the tenant uuid. | |
spec.s3.endpoint |
string | no | pattern ^https://; format uri |
An S3-compatible endpoint instead of AWS. | |
spec.s3.credentialRef |
string | no | pattern ^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$ |
With endpoint: the VaultEntry holding the access key for it. | |
spec.git |
object | no | no other keys | Documents in a git repository over HTTPS (GitHub, GitHub Enterprise Server, GitLab, Gitea, Forgejo or any git server). A matching ForgeConnection is used when there is one. | |
spec.git.url |
string | yes | pattern ^https://; format uri |
||
spec.git.ref |
string | no | length 1 to any | A branch, tag or commit. Defaults to the default branch. | |
spec.git.paths |
array of string | yes | 1 to any items; each item: length 1 to any | Globs, relative to the repository root, selecting the documents. | |
spec.git.credentialRef |
string | no | pattern ^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$ |
The metadata.name of a VaultEntry holding a credential. The value is read from the tenant’s vault when it is needed and is never copied into the referring object. | |
spec.path |
object | no | no other keys | A file or directory, absolute or relative to the config or repository root. Read by the CLI only: at scan time it applies locally, and config apply uploads a snapshot so server views match. | |
spec.path.path |
string | yes | length 1 to any | ||
spec.urls |
array of string or object | no | 1 to any items | Plain HTTPS URLs, each fetched with ETag and If-Modified-Since. | |
spec.urls[].url |
string | yes | pattern ^https://; format uri |
||
spec.urls[].sha256 |
string | no | pattern ^[a-f0-9]{64}$ |
Refuse the document unless its SHA-256 matches. | |
spec.urls[].auth |
object | no | no other keys | A request header carrying a credential from the vault. | |
spec.urls[].auth.header |
string | yes | pattern ^[A-Za-z0-9-]+$ |
||
spec.urls[].auth.credentialRef |
string | yes | pattern ^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$ |
The metadata.name of a VaultEntry holding a credential. The value is read from the tenant’s vault when it is needed and is never copied into the referring object. |
Rules
Conditions the schema enforces beyond each field’s own type. vulnetix config validate and the engine’s plan report a document that breaks one.
| On | Rule |
|---|---|
spec |
Exactly one of tea, s3, git, path or urls is set. |
spec.scope |
Exactly one of these holds: (1) org is required, repos is not allowed and products is not allowed; (2) org is not allowed and At least one of repos or products is set.. |
spec.refresh |
Exactly one of interval or webhook is set. |
spec.tea |
Exactly one of product, productRelease or collection is set. |
spec.s3 |
When endpoint is set: credentialRef is required. Otherwise: roleArn is required and credentialRef is not allowed. |
spec.s3 |
Exactly one of prefix or key is set. |
Applying this kind
- Command.
vulnetix config apply -f <file>; the CLI line above says from which release. Plan first withvulnetix config plan: it shows each object as create, update, delete or no change, with aplanHashthat apply then holds to. Apply writes in one transaction. - Manager. Each object records the manager that applied it (
terraform,consoleorgitops:<repo>).--prunedeletes only objects its own manager owns. See The manager and the config engine. - Order. Applied after
VaultEntry, so a document that refers to one bymetadata.namecan be in the same apply. Deleted before them. - Status. The latest fetch: status
ok,partialorerror, document, statement and suppression counts, and per-document errors. The phases the engine reports are explained under status phases.
What plan refuses today
The schema accepts these, and plan blocks them with the condition unsupported:
| Field | Why |
|---|---|
spec.trust.requireSignature: true |
The server does not verify signatures on fetched VEX documents. Narrow trust with trust.allowedAuthors instead. |
spec.scope.products |
Findings do not record the TEA product they belong to, so the scope could not be enforced. Use scope.repos. |
spec.s3.endpoint |
An S3-compatible store is not supported yet. Use roleArn on AWS. |
A path source plans with the warning cli_only: the server never fetches it. The guide has the rest.
Terraform and OpenTofu
The resource is vulnetix_vex_source in the vulnetix/resolve provider. Its arguments are the spec in snake case, beside name, labels and annotations from metadata. The Minimal and Advanced HCL are above. The provider’s own reference is vulnetix_vex_source.
Import an object that already exists by its name:
# Import an existing VexSource by its name (metadata.name).
terraform import vulnetix_vex_source.local_vex local-vex
Install, authentication and how state is read: Terraform and OpenTofu.
More examples
examples/VexSource/sources.yaml from Vulnetix/config-schemas:
# yaml-language-server: $schema=https://github.com/Vulnetix/config-schemas/releases/latest/download/VexSource.schema.json
apiVersion: vulnetix.com/v1
kind: VexSource
metadata:
name: vendor-tea
spec:
format: auto
scope:
products: ["urn:tei:uuid:products.acme.example:7f3c1a52-1b8e-4d0e-9c3f-2a6b8e5d4c10"]
trust:
requireSignature: true
allowedAuthors: [security@acme.example]
refresh: { interval: 6h }
onError: keep-last
tea:
product: 7f3c1a52-1b8e-4d0e-9c3f-2a6b8e5d4c10
server: https://tea.acme.example
---
# yaml-language-server: $schema=https://github.com/Vulnetix/config-schemas/releases/latest/download/VexSource.schema.json
apiVersion: vulnetix.com/v1
kind: VexSource
metadata:
name: vex-bucket
spec:
format: openvex
refresh: { webhook: true }
s3:
bucket: acme-vex-statements
prefix: openvex/
region: us-east-1
roleArn: arn:aws:iam::123456789012:role/VulnetixVexRead
---
apiVersion: vulnetix.com/v1
kind: VexSource
metadata:
name: platform-repo
spec:
scope:
repos: [acme/payments-api, acme/ledger]
git:
url: https://github.com/acme/security-advisories.git
ref: main
paths: ["vex/**/*.openvex.json"]
credentialRef: github-advisories-token
---
apiVersion: vulnetix.com/v1
kind: VexSource
metadata:
name: local-vex
spec:
format: cyclonedx
path:
path: .vulnetix/vex.cdx.json
---
apiVersion: vulnetix.com/v1
kind: VexSource
metadata:
name: upstream-urls
spec:
refresh: { interval: 1d }
onError: clear
urls:
- https://downloads.example.org/vex/product.openvex.json
- url: https://vendor.example.com/vex/all.cdx.json
sha256: 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08
auth:
header: Authorization
credentialRef: vendor-vex-token
examples/VexSource/unsupported-features.yaml from Vulnetix/config-schemas:
# Fields the VexSource schema accepts and a plan blocks as `unsupported` until
# the server can honour them. This file validates against the schema but is not
# an applicable example: minimal.yaml and advanced.yaml are. Move a field back
# into advanced.yaml when the engine supports it.
#
# trust.requireSignature The server does not verify signatures on fetched
# VEX documents yet.
# scope.products Findings do not record the TEA product they belong
# to, so a product scope cannot be enforced yet.
# s3.endpoint, credentialRef
# An S3-compatible store (R2, MinIO) has no vault
# shape for its access key yet. Use roleArn on AWS.
#
# yaml-language-server: $schema=https://github.com/Vulnetix/config-schemas/releases/latest/download/VexSource.schema.json
apiVersion: vulnetix.com/v1
kind: VexSource
metadata:
name: signed-vendor-tea
spec:
format: auto
scope:
products: ["urn:tei:uuid:products.acme.example:7f3c1a52-1b8e-4d0e-9c3f-2a6b8e5d4c10"]
trust:
requireSignature: true
allowedAuthors: [security@acme.example]
refresh: { interval: 6h }
tea:
product: 7f3c1a52-1b8e-4d0e-9c3f-2a6b8e5d4c10
server: https://tea.acme.example
---
# yaml-language-server: $schema=https://github.com/Vulnetix/config-schemas/releases/latest/download/VexSource.schema.json
apiVersion: vulnetix.com/v1
kind: VexSource
metadata:
name: vex-r2-object
spec:
format: openvex
refresh: { interval: 30m }
s3:
bucket: acme-vex-public
key: products/ledger/ledger.openvex.json
endpoint: https://0123456789abcdef0123456789abcdef.r2.cloudflarestorage.com
credentialRef: r2-vex-reader
Check a file with vulnetix config validate -f <file>. See Validate documents. In an editor, start the file with the schema comment.