Skip to content

DevSecOps guide

Software supply chain security checklist: SBOM, SLSA, signing, curation and runner hardening

A practical checklist for securing your software supply chain: SBOMs, SLSA provenance, signing, package curation, scanning, runner hardening and incident response.

By Spreeze team · Published · 6 min read

Securing your software supply chain means controlling four things: what goes into your software (dependencies), how it is built (pipelines and runners), how you prove what you shipped (SBOMs, provenance and signatures), and how fast you can respond when something upstream is compromised. This checklist breaks those into concrete steps you can assign to owners and tick off. It is tool-neutral where possible, with notes on where GitLab and JFrog features fit.

Work through it in order. The early sections give the most protection for the least effort.

1. Know what you ship: SBOMs

A software bill of materials (SBOM) is the ingredient list for an application. It is the single most useful artefact when a new vulnerability is announced, because it lets you answer “are we affected?” in minutes rather than days.

  • Generate an SBOM for every application at build time, not after release.
  • Use a standard format. CycloneDX and SPDX are the common choices.
  • Store the SBOM with the build artefact and keep it for the life of the release.
  • Include transitive dependencies, not just the ones in your manifest.
  • Benchmark your SBOM content against CISA’s 2025 minimum elements. CISA published these as draft, voluntary guidance in August 2025, building on the 2021 NTIA minimum elements.
  • Decide who receives SBOMs: your own security team, customers who ask, or both.

Tool notes. GitLab’s dependency scanning (Ultimate) can generate CycloneDX SBOMs per directory and scan them, including transitive dependencies. JFrog Xray generates SBOMs covering direct and indirect dependencies for artefacts stored in Artifactory.

2. Control what comes in: curation and dependency scanning

Most supply chain attacks arrive through a dependency, not your own code.

  • Route all package downloads through a single internal repository manager (for example JFrog Artifactory or Sonatype Nexus Repository) instead of letting builds reach public registries directly.
  • Block or quarantine packages that fail policy before developers can use them.
  • Hold brand-new package versions for a short period so the community can flag poisoned releases.
  • Scan dependencies for known vulnerabilities and licence issues on every merge request.
  • Assess the health of critical open-source projects you depend on. OpenSSF Scorecard provides security scores for GitHub and GitLab repositories.
  • Pin versions and commit lockfiles.

Tool notes. JFrog Curation blocks risky packages at the point of request and can serve the highest compliant version automatically. It supports policies on severity, licence and package age, including an immaturity policy that holds new versions for 14 days. Xray continuously scans repositories, builds and container images, including Docker image layers. In GitLab, dependency scanning is an Ultimate feature. See our JFrog Xray page and supply chain security service.

3. Keep secrets out of code

  • Turn on secret detection in every pipeline.
  • Block secrets at push time where your platform supports it. GitLab’s secret push protection (Ultimate) blocks keys and API tokens from being pushed.
  • Use short-lived credentials and OIDC federation from CI to cloud providers instead of long-lived keys in CI variables.
  • Store remaining secrets in a vault, scoped to protected branches and environments.
  • Rotate any secret that has ever been committed, even if the commit was deleted.

4. Harden your build platform and runners

Your CI runners can read source code, secrets and signing material. Treat them as production systems. GitLab’s runner security guidance is a good baseline:

  • Avoid Docker privileged mode. A privileged job can gain root on the host.
  • Use the shell executor only for trusted builds, because jobs run with the runner user’s permissions.
  • Prefer ephemeral runners, so each job gets a clean environment. With autoscaling, limit each VM to one build.
  • Dedicate separate runners to privileged or deployment jobs and restrict them to protected branches.
  • Place runners in their own network segment, block inbound SSH from the internet and filter access to cloud metadata endpoints.
  • On shared runners, set the image pull policy to always rather than if-not-present.
  • Patch runner hosts like any other server and remove stale SSH keys and credentials.

5. Prove how it was built: SLSA provenance

SLSA (Supply-chain Levels for Software Artifacts) defines a build track with increasing guarantees:

LevelWhat it means
Build L0No guarantees
Build L1The build platform automatically produces provenance describing how the artefact was built
Build L2Builds run on a hosted platform that generates and signs the provenance, and consumers validate it
Build L3A hardened platform isolates builds from each other and keeps signing secrets away from user-defined build steps

From the SLSA v1.2 specification (checked 13 October 2026).

  • Set a target level per application. L2 is a sensible first goal.
  • Generate provenance automatically. GitLab documents that GitLab Runner can produce a SLSA Level 2 compliant provenance statement for build artefacts.
  • Verify provenance before deployment, not just generate it.
  • Plan for L3 only where risk justifies it, because it needs isolated, hardened builders.

6. Sign what you release

  • Sign container images and release artefacts.
  • Verify signatures at deployment, for example with an admission controller in Kubernetes.
  • Prefer keyless signing with short-lived certificates where available, so there is no long-lived signing key to steal.

Tool notes. On GitLab.com, GitLab documents Sigstore keyless signing with Cosign for container images and build artefacts using CI ID tokens. Self-Managed instances need a self-hosted Sigstore setup for the same approach.

7. Enforce, do not just report

Scanners that produce reports nobody reads add little protection.

  • Make security scans mandatory through policy, not optional per project.
  • Require security approval when a merge request introduces a high-severity finding.
  • Track mean time to remediate by severity, and review it monthly.
  • Give developers fixes, not just findings: upgrade paths, compliant versions, clear ownership.

Tool notes. GitLab Ultimate’s security policies (scan execution and merge request approval policies) turn scanning into a control. Our comparison of GitLab Premium vs Ultimate explains what each tier includes.

8. Be ready for the next incident

When a widely used package is compromised, speed matters more than perfection.

  • Write a one-page playbook: who decides, who searches, who communicates.
  • Be able to search all SBOMs and your repository manager for a package and version within an hour.
  • Know how to block a package version centrally in your repository manager.
  • Have a process to revoke and rotate CI tokens, deploy keys and cloud credentials quickly.
  • Rehearse once a year with a tabletop exercise based on a real past incident.
  • Record what you learned and update this checklist.

Where to start

If you can only do three things this quarter: route dependencies through a repository manager, generate SBOMs on every build, and harden your runners. Those three cover most of the practical risk and none requires a premium tier.

When you are ready to compare repository managers, read our Artifactory vs Nexus comparison. For help putting this checklist into practice, see our DevSecOps services.

Spreeze is an authorised GitLab partner (Open track) and a JFrog partner. We can assess your current pipeline against this checklist and quote any licences needed in USD or ZAR (your choice). Request a quote.

GITLAB is a trademark of GitLab Inc. JFrog and Artifactory are trademarks of JFrog Ltd. Other names are trademarks of their respective owners.

Get GitLab, JFrog, Microsoft and DevSecOps licensing news by email

About two emails a month. Price changes, licensing rules and security alerts that matter to African buyers.

Sources

  1. SLSA v1.2: Build track basics
  2. CISA: 2025 Minimum Elements for a Software Bill of Materials (draft)
  3. OpenSSF Scorecard
  4. GitLab Docs: SLSA provenance
  5. GitLab Docs: Signing examples (Sigstore)
  6. GitLab Docs: Dependency scanning
  7. GitLab Docs: Secret push protection
  8. GitLab Runner Docs: Security
  9. JFrog Xray
  10. JFrog Curation

FAQ

Frequently asked questions

Can't see your question? Ask us directly. We reply within one business day.

What is the first thing to do if we have no supply chain controls today?
Get an inventory. Generate an SBOM for each application you ship and keep it with the build. Without knowing what is inside your software you cannot answer whether you are affected when the next big vulnerability is announced.
What SLSA level should we aim for?
Build L2 is a realistic first target for most teams: builds run on a hosted platform that generates and signs provenance. GitLab documents that its runner can produce a SLSA Level 2 compliant provenance statement. Level 3 needs a hardened, isolated build platform.
Do we need GitLab Ultimate or JFrog Xray for this?
Not for everything. SBOM generation, signing with Cosign and runner hardening can be done on any tier. Ultimate and Xray add managed scanning, policy enforcement and reporting, which matter most when you have many projects and an audit to pass.
Is there an official SBOM standard?
CycloneDX and SPDX are the common formats. CISA published draft 2025 minimum elements for an SBOM in August 2025, building on the 2021 NTIA minimum elements. It is voluntary guidance, but a useful benchmark.

Quotation desk

Need help applying this?

Ask a specialist. We can quote the licences, check your edition and seat count, or scope the implementation.

  • Quotes in USD or ZAR, your choice, with VAT shown separately
  • Vendor-authorised supply, with renewal reminders
  • Edition and seat-count advice before you buy
  • Reseller enquiries handled confidentially

Prefer to talk?

Call 010 003 7197, WhatsApp +27 78 810 9342 or email hello@spreeze.co.za.

Monday to Friday, 08:00 to 17:00 SAST

1 · Who you are
2 · What you need

We reply within one business day (SAST). Quotes are subject to vendor pricing and availability; VAT is shown separately.