Skip to main content

Command Palette

Search for a command to run...

Software Bills of Delivery: Beyond SBOMs with Component Models

How modern software supply chains use component models to track dependencies, artifacts, and metadata across distributed systems, moving beyond traditional SBOMs to comprehensive delivery tracking.

Updated
7 min read
Software Bills of Delivery: Beyond SBOMs with Component Models
M

Senior Freelancer & Technical Lead

Working as a Golang developer since 2020. Working as a mobile developer since 2013.

Focussed on architecture, testability and clean code. Open minded & product driven. Based in Rhede, available world-wide

Traditional Software Bills of Materials (SBOMs) have served as the foundation for software supply chain transparency, but they're showing their limitations in today's complex, distributed environments. While SBOMs catalog components and dependencies, they fall short of tracking the complete delivery lifecycle across cloud-native architectures. Enter Software Bills of Delivery and component models—a more comprehensive approach that tracks not just what's in your software, but how it moves through your entire delivery pipeline.

The SBOM Foundation and Its Limits

A Software Bill of Materials is a formal record of all software component parts and software dependencies used in application development and delivery. The National Telecommunications and Information Administration (NTIA) has established baseline requirements for SBOM creation and delivery, making them increasingly mandatory for government contracts and enterprise software.

SBOMs excel at providing a snapshot of components at build time. They answer critical questions like "What open source libraries are we using?" and "Do we have any known vulnerabilities?" But they struggle with the dynamic nature of modern software delivery:

  • Static snapshots vs. dynamic environments: SBOMs capture a point-in-time view, but container images, serverless functions, and microservices change constantly
  • Limited artifact tracking: They focus on source dependencies but miss runtime artifacts, configuration files, and deployment metadata
  • Deployment context gaps: SBOMs don't track where components are deployed, how they're configured, or their runtime relationships

These limitations become critical when you're managing hundreds of microservices across multiple clusters, each with their own dependency chains and deployment patterns.

Component Models: The Next Evolution

Component models extend beyond traditional SBOMs by treating software artifacts as first-class entities with rich metadata throughout their lifecycle. The Open Component Model (OCM) offers a practical solution for the delivery of software artifacts, providing a standardized way to describe, package, and transport software components with their complete context.

Unlike SBOMs, component models track:

  • Artifact provenance: Complete build and deployment history
  • Runtime dependencies: Not just compile-time dependencies, but actual runtime relationships
  • Configuration metadata: Environment-specific settings and their sources
  • Delivery pipelines: How components move through CI/CD systems
  • Deployment topology: Where components run and how they communicate

This comprehensive tracking enables what we call "Software Bills of Delivery"—living documents that evolve with your software as it moves through environments.

Software Bills of Delivery in Practice

A Software Bill of Delivery goes beyond listing components to track the complete delivery journey. Here's what this looks like in a real cloud-native environment:

# Example component descriptor with delivery metadata
apiVersion: delivery.appetizer.io/v1
kind: ComponentDelivery
metadata:
  name: user-service-v2.1.3
  namespace: production
spec:
  component:
    name: user-service
    version: 2.1.3
    source:
      repository: github.com/company/user-service
      commit: abc123def456
      buildTime: "2024-01-15T10:30:00Z"

  artifacts:
    - type: container
      name: user-service
      digest: sha256:8f8a8b8c8d8e8f...
      registry: registry.company.com

    - type: helm-chart
      name: user-service-chart
      version: 2.1.3
      repository: oci://registry.company.com/charts

    - type: config
      name: database-config
      source: vault://secrets/user-service/db

  dependencies:
    runtime:
      - name: postgres
        version: "14.9"
        location: cluster-db.production.svc.cluster.local

      - name: redis
        version: "7.2"
        location: elasticache.us-west-2.amazonaws.com

    buildtime:
      - name: golang
        version: "1.21.5"

      - name: gorilla/mux
        version: "v1.8.0"

  deployment:
    environments:
      - name: staging
        deployedAt: "2024-01-15T14:20:00Z"
        status: successful
        replicas: 2

      - name: production
        deployedAt: "2024-01-15T16:45:00Z"
        status: successful
        replicas: 5

    pipeline:
      buildId: "build-456789"
      approvals:
        - approver: security-team
          timestamp: "2024-01-15T12:00:00Z"
        - approver: platform-team
          timestamp: "2024-01-15T14:00:00Z"

This delivery manifest captures not just what components exist, but their complete journey through your delivery pipeline.

Implementing Component Models for Supply Chain Security

Modern software supply chain security requires tracking components across their entire lifecycle. Here's how component models address key security concerns:

Provenance Tracking

Component models maintain cryptographic proof of artifact origins:

type ComponentProvenance struct {
    BuildSystem   string            `json:"buildSystem"`
    SourceRepo    string            `json:"sourceRepo"`
    CommitHash    string            `json:"commitHash"`
    Builder       string            `json:"builder"`
    BuildTime     time.Time         `json:"buildTime"`
    Attestations  []Attestation     `json:"attestations"`
    Signatures    []Signature       `json:"signatures"`
}

type Attestation struct {
    Type      string    `json:"type"`      // "build", "test", "security-scan"
    Result    string    `json:"result"`    // "pass", "fail", "warning"
    Details   string    `json:"details"`
    Timestamp time.Time `json:"timestamp"`
    Verifier  string    `json:"verifier"`
}

Runtime Dependency Resolution

Unlike static SBOMs, component models track actual runtime dependencies:

# Runtime dependency discovery
runtimeDependencies:
  discovered:
    - service: payment-api
      version: "1.4.2"
      protocol: https
      endpoint: payment-api.internal:443
      discoveredAt: "2024-01-15T16:50:00Z"

  declared:
    - service: user-db
      version: "14.9"
      protocol: postgresql
      endpoint: user-db.production:5432

  external:
    - service: stripe-api
      endpoint: api.stripe.com
      version: "2023-10-16"
      sla: "99.9%"

Vulnerability Correlation

Component models enable precise vulnerability tracking across deployments:

{
  "vulnerabilityReport": {
    "component": "user-service:2.1.3",
    "scanTime": "2024-01-15T17:00:00Z",
    "findings": [
      {
        "cve": "CVE-2024-0001",
        "severity": "high",
        "affectedArtifacts": [
          "container:user-service@sha256:8f8a8b8c8d8e8f"
        ],
        "deploymentImpact": [
          {
            "environment": "production",
            "instances": 5,
            "exposure": "internal-only",
            "mitigations": ["network-policy", "pod-security-policy"]
          }
        ]
      }
    ]
  }
}

Distributed Systems and Component Relationships

In distributed architectures, understanding component relationships becomes crucial. Component models map these relationships explicitly:

Service Mesh Integration

componentRelationships:
  upstreamServices:
    - name: api-gateway
      traffic: "100%"
      protocol: http/2

  downstreamServices:
    - name: user-db
      queries: ["SELECT", "UPDATE", "INSERT"]
      connectionPool: 10

    - name: notification-service
      protocol: grpc
      async: true

  sidecarComponents:
    - name: envoy-proxy
      version: "1.28.0"
      config: istio-proxy-config

    - name: datadog-agent
      version: "7.49.0"
      config: monitoring-config

Cross-Cluster Dependencies

Modern applications span multiple clusters and cloud providers. Component models track these distributed relationships:

crossClusterDependencies:
  - component: shared-cache
    cluster: us-west-2-cache
    endpoint: redis.shared.company.internal
    latency: "< 5ms"

  - component: analytics-pipeline
    cluster: data-processing
    protocol: kafka
    topics: ["user-events", "audit-logs"]

  - component: cdn
    provider: cloudflare
    endpoints: ["cdn.company.com"]
    cachePolicies: ["static-assets", "api-responses"]

Automation and Tooling

Component models shine when integrated into automated workflows. Here's how to implement automated delivery tracking:

CI/CD Integration

#!/bin/bash
# Build pipeline integration
set -e

# Build the component
docker build -t user-service:${BUILD_ID} .

# Generate component descriptor
cat > component-descriptor.yaml <<EOF
apiVersion: ocm.software/v3alpha1
kind: ComponentVersion
metadata:
  name: user-service
  version: ${BUILD_ID}
spec:
  provider: company.com
  sources:
    - name: source
      type: git
      access:
        type: github
        repoUrl: github.com/company/user-service
        ref: ${GIT_COMMIT}
  resources:
    - name: image
      type: ociImage
      access:
        type: ociRegistry
        imageReference: registry.company.com/user-service:${BUILD_ID}
EOF

# Sign and upload
ocm add resources component-descriptor.yaml
ocm sign component-descriptor.yaml --private-key=${SIGNING_KEY}
ocm transfer component component-descriptor.yaml ${OCI_REGISTRY}

Runtime Discovery

Automated discovery keeps component models current:

func discoverRuntimeDependencies(ctx context.Context, podName string) (*RuntimeDependencies, error) {
    // Network traffic analysis
    connections, err := analyzeNetworkConnections(podName)
    if err != nil {
        return nil, err
    }

    // Service mesh integration
    envoyConfig, err := getEnvoyConfiguration(podName)
    if err != nil {
        return nil, err
    }

    // DNS resolution tracking
    dnsQueries, err := analyzeDNSQueries(podName)
    if err != nil {
        return nil, err
    }

    return &RuntimeDependencies{
        NetworkConnections: connections,
        ServiceMeshRoutes:  envoyConfig.Routes,
        DNSResolutions:     dnsQueries,
        DiscoveredAt:       time.Now(),
    }, nil
}

Security Benefits and Compliance

Component models provide significant security advantages over traditional SBOMs:

Compliance Automation

CISA's SBOM requirements focus on transparency, but component models enable automated compliance checking:

complianceChecks:
  - policy: "no-high-severity-vulnerabilities"
    status: "enforced"
    lastCheck: "2024-01-15T18:00:00Z"

  - policy: "signed-artifacts-only"
    status: "enforced"
    exceptions: []

  - policy: "approved-base-images"
    status: "warning"
    violations:
      - component: "legacy-service"
        reason: "using deprecated base image"

Supply Chain Attack Detection

Component models enable sophisticated attack detection:

type SupplyChainAnomaly struct {
    Type        string    `json:"type"`
    Component   string    `json:"component"`
    Description string    `json:"description"`
    Severity    string    `json:"severity"`
    DetectedAt  time.Time `json:"detectedAt"`
}

func detectAnomalies(current, previous *ComponentModel) []SupplyChainAnomaly {
    var anomalies []SupplyChainAnomaly

    // Unexpected dependency changes
    for _, dep := range current.Dependencies {
        if !containsDependency(previous.Dependencies, dep) {
            anomalies = append(anomalies, SupplyChainAnomaly{
                Type:        "unexpected-dependency",
                Component:   current.Name,
                Description: fmt.Sprintf("New dependency added: %s", dep.Name),
                Severity:    "medium",
                DetectedAt:  time.Now(),
            })
        }
    }

    // Build environment changes
    if current.BuildEnvironment.Builder != previous.BuildEnvironment.Builder {
        anomalies = append(anomalies, SupplyChainAnomaly{
            Type:        "builder-change",
            Component:   current.Name,
            Description: "Build environment changed",
            Severity:    "high",
            DetectedAt:  time.Now(),
        })
    }

    return anomalies
}

Implementation Roadmap

Moving from SBOMs to component models requires a phased approach:

Phase 1: SBOM Enhancement

Start by enriching existing SBOMs with delivery metadata. Integrate SBOM generation directly into CI/CD pipelines and add deployment context.

Phase 2: Component Model Adoption

Implement component descriptors alongside SBOMs. Begin tracking artifact relationships and deployment topology.

Phase 3: Runtime Integration

Deploy discovery agents to automatically update component models with runtime dependencies and actual service relationships.

Phase 4: Advanced Analytics

Implement anomaly detection, compliance automation, and predictive security analysis based on component model data.

The Future of Software Supply Chain Transparency

Software Bills of Delivery represent the evolution from static documentation to dynamic, living records of software components and their relationships. By implementing component models, organizations gain unprecedented visibility into their software supply chains, enabling proactive security, automated compliance, and confident deployment practices.

The shift from SBOMs to comprehensive component models isn't just about better documentation—it's about building software supply chains that are transparent, secure, and resilient by design. As distributed systems become more complex, this level of visibility becomes essential for maintaining security and operational excellence.

Component models provide the foundation for the next generation of software supply chain security tools, enabling organizations to move from reactive vulnerability management to proactive risk prevention. The question isn't whether to adopt this approach, but how quickly you can implement it to stay ahead of emerging threats and compliance requirements.