name: inverse layout: true class: center, middle, inverse, title β
Andrew McNamara β’ Red Hat
Ralph Bean β’ Red Hat
.footnote[π slides: ralphbean.github.io/slides/oss-na/2025/provenance.html]
layout: false .left-column[ ## Meatspace Analogy ] .right-column[
.large[ You get this information stamped on packaging or included in the box. ]
]
.left-column[ ## Meatspace Analogy ## Software Reality ] .right-column[
.large[ Do you know its provenance? ]
.large[ We generally donβt get this with software today. ]
]
layout: false .left-column[ ## Meatspace Analogy ## Software Reality ## What is Provenance? ] .right-column[
For software artifacts (containers, packages, binaries):
.foonote[ Generally, provenance is the origin of something. ]
]
.left-column[ ## Meatspace Analogy ## Software Reality ## What is Provenance? ## Threats ] .right-column[

.footnote[*from the βSupply-chain Levels for Software Artifactsβ (SLSA) docs!]
]
.left-column[ ## Meatspace Analogy ## Software Reality ## What is Provenance? ## Threats ## Traditional Signing ] .right-column[
gpg --verify artifact.tar.gz.sig artifact.tar.gz
β
Identity: Who signed this?
β Context: What were they claiming when they signed it?
.large[ A signature just means βitβs goodβ
But good how? Good why? ]
]
template: inverse
layout: false .left-column[ ## Attestations ] .right-column[
.large[ An attestation is an βI solemnly swearβ¦β statement ]
Instead of just βitβs signedβ β βhereβs exactly what happenedβ
]
layout: false .left-column[ ## Attestations ## sigstore & cosign ] .right-column[
$ echo '{"hello": "world"}' > predicate.json
$ cosign attest \
--type custom \
--predicate predicate.json \
quay.io/rbean/test:oss-na
$ cosign verify-attestation \
--certificate-identity ralph.bean@gmail.com \
--certificate-oidc-issuer https://github.com/login/oauth \
quay.io/rbean/test:oss-na \
| jq '.payload | @base64d | fromjson'
layout: false .left-column[ ## Attestations ## sigstore & cosign ## systems ] .right-column[
| Β | π GitHub | π¦ Witness | π± Tekton |
|---|---|---|---|
| Source | β Detailed | β Detailed | β Detailed |
| Parameters | β Detailed | β Detailed | β Detailed |
| Materials | β Unclear | β Detailed | β Detailed |
| Signature | β In build | β In build | β οΈ External |
]
template: inverse
layout: false .left-column[ ## Konflux ] .right-column[
.large[ Open source, cloud native software factory focused on supply chain security. ]
.footnote[ Each step creates verifiable evidence ]
]
layout: false .left-column[ ## Konflux ## Doing Stuff ] .right-column[
]
.left-column[ ## Konflux ## Doing Stuff ## Policy Gates ] .right-column[
deny contains result if {
some required_task in _missing_tasks(current_required_tasks.tasks)
# Don't report an error if a task is required now, but not in the future
required_task in latest_required_tasks.tasks
result := lib.result_helper_with_term(
rego.metadata.chain(),
[_format_missing(required_task, false)],
required_task
)
}
Machine-readable policies decide what gets released.
]
.left-column[ ## Konflux ## Doing Stuff ## Policy Gates ## Innovation (last slide) ] .right-column[
.large[ One way: Make insecure things impossible ]
.large[ Another way: Define what βgoodβ looks like ]
]
template: inverse
Lock the Chef in the Kitchen: Enabling Accurate SBOMs Via Hermetic Builds
Who Are You Building For: Pipelines Have a Purpose
Building Trust Through Proactive Security - Key Parts of the Trusted Software Supply Chain
Who Are You Building For: Pipelines Have a Purpose
name: last-page template: inverse
Blog: How we use software provenance at Red Hat
sigstore project: sigstore.dev
in-toto Attestations: in-toto.io
SLSA Framework: slsa.dev
Conforma: conforma.dev
Try Konflux: konflux-ci.dev
slides: ralphbean.github.io/slides/oss-na/2025/provenance.html
name: inverse layout: true class: center, middle, inverse, title β
layout: false .left-column[ ## GitHub ] .right-column[
jobs:
build:
steps:
- uses: actions/checkout@v4
- name: Build
run: make build
- uses: actions/attest-build-provenance@v1
with:
subject-path: './dist/app'
β
Source: Commit SHA, repo URL
β
Workflow: Workflow file, inputs
β Materials: Which actions?
β Data plane: Signature happens in the workflow
layout: false .left-column[ ## GitHub ] .right-column[
If thereβs network, show:
IMAGE=quay.io/lucarval/festoji@sha256:b508f3da1ba56f258d72da91c8ce07950ced85f142d81974022f61211c4a445a
oras blob fetch "$IMAGE" --output - | \
jq '.dsseEnvelope.payload | @base64d | fromjson '
β
Source: Commit SHA, repo URL
β
Workflow: Workflow file, inputs
β Materials: Which actions?
β Data plane: Signature happens in the workflow
]
.left-column[ ## GitHub ## Witness ] .right-column[
witness run -s build -- make build
witness run -s test -- make test
witness run -s deploy -- kubectl apply -f app.yaml
β
Source: Commit SHA, repo URL
β
Detailed task execution: How was it called
β
Detailed materials: What was used
β Data plane: Signature happens in the workflow
]
.left-column[ ## GitHub ## Witness ] .right-column[
If thereβs network, show:
GITOID=ea3c0279f13820dba07aafc8d215971f32f3053bb41743e88a00e669eec6c64f
curl -s https://archivista.testifysec.io/download/$GITOID -- |
jq '.payload | @base64d | fromjson '
β
Source: Commit SHA, repo URL
β
Detailed task execution: How was it called
β
Detailed materials: What was used
β Data plane: Signature happens in the workflow
]
.left-column[ ## GitHub ## Witness ## Tekton ] .right-column[
apiVersion: tekton.dev/v1beta1
kind: TaskRun
metadata:
annotations:
chains.tekton.dev/signed: "true"
spec:
taskRef:
name: git-clone
params:
- name: url
value: https://github.com/example/repo
β
Source: Commit SHA, repo URL
β
Detailed task execution: How was it called
β
Detailed materials: What was used
β
Control plane: Payload doesnβt sign itself
]
.left-column[ ## GitHub ## Witness ## Tekton ] .right-column[
If thereβs network, show:
IMAGE=quay.io/bootc-devel/fedora-bootc-rawhide-standard:20250605-110837
cosign download attestation $IMAGE 2> /dev/null | \
jq '.payload | @base64d | fromjson '
β
Source: Commit SHA, repo URL
β
Detailed task execution: How was it called
β
Detailed materials: What was used
β
Control plane: Payload doesnβt sign itself
]