Skip to content

Feature Request: Container Image Signing, SBOM, and Attestation (attempt 2) #93

@smecsia

Description

@smecsia

Feature Request: Container Image Signing, SBOM, and Attestation

Requested by: Everworker DevSecOps Team
Date: 2026-02-03
Priority: High
Category: Security / Supply Chain Integrity


Executive Summary

We request the addition of optional container image signing, SBOM generation, and attestation capabilities to Simple Container CLI. This feature would enable organizations to meet modern software supply chain security requirements (NIST SP 800-218, SLSA, Executive Order 14028) directly within their existing sc workflows.


Business Justification

Compliance Requirements

Organizations are increasingly required to demonstrate software supply chain security:

Standard Requirement Current Gap
NIST SP 800-218 (SSDF) PS.1.1 - Generate and maintain SBOMs for distributed software No native SBOM support
NIST SP 800-218 (SSDF) PS.3.1 - Archive and protect build artifacts No cryptographic signing
SLSA Level 2+ Signed provenance for builds No provenance attestation
Executive Order 14028 Software supply chain security for federal contractors Missing signing/SBOM
CIS Docker Benchmark 5.3.1 - Sign container images Not available
CIS Docker Benchmark 5.3.4 - Maintain SBOM for images Not available

Customer Impact

  • AWS Marketplace requires signed artifacts for listing
  • Enterprise customers require SBOM for procurement
  • Government contracts mandate EO 14028 compliance
  • Security audits increasingly require supply chain attestation

Feature Specification

1. Image Signing (Cosign/Sigstore Integration)

Configuration

# sc stack configuration
signing:
  enabled: true                          # Enable/disable signing (default: false)
  provider: sigstore                     # Signing provider (sigstore, notation, custom)
  keyless: true                          # Use keyless signing via OIDC (recommended)
  # OR explicit key configuration:
  # privateKey: ${secret:cosign-private-key}
  # publicKey: ${secret:cosign-public-key}

  verify:
    enabled: true                        # Verify signatures after signing
    oidc-issuer: "https://token.actions.githubusercontent.com"
    identity-regexp: "^https://github.com/myorg/.*$"

CLI Commands

# Sign an image after build/push
sc image sign --image docker.example.com/myapp:v1.0.0

# Sign with explicit key
sc image sign --image docker.example.com/myapp:v1.0.0 --key cosign.key

# Verify signature
sc image verify --image docker.example.com/myapp:v1.0.0

# Sign all images in a stack
sc stack sign -s mystack -e production

Implementation Notes

  • Recommended Tool: Cosign v3.0.2+
  • Keyless Signing: Use Sigstore/Fulcio for OIDC-based keyless signing
  • Transparency Log: Signatures recorded in Rekor for public auditability
  • CI/CD Integration: Requires id-token: write permission in GitHub Actions

2. SBOM Generation

Configuration

sbom:
  enabled: true                          # Enable/disable SBOM generation (default: false)
  format: cyclonedx-json                 # cyclonedx-json, spdx-json, syft-json
  generator: syft                        # syft (recommended), trivy, or custom

  attach:
    enabled: true                        # Attach SBOM as in-toto attestation to image
    sign: true                           # Sign the SBOM attestation

  output:
    local: ./sbom/                       # Save SBOM locally
    registry: true                       # Push to registry as attestation

CLI Commands

# Generate SBOM for an image
sc sbom generate --image docker.example.com/myapp:v1.0.0 --format cyclonedx-json

# Generate and attach SBOM as attestation
sc sbom attach --image docker.example.com/myapp:v1.0.0 --sbom sbom.json

# Generate SBOM for all images in a stack
sc stack sbom -s mystack -e production --output ./sboms/

# Verify SBOM attestation
sc sbom verify --image docker.example.com/myapp:v1.0.0

Implementation Notes

  • Recommended Tool: Syft v1.41.0+
  • Component Coverage: Syft detects 6,000+ components vs 2,000 for alternatives
  • Format: CycloneDX JSON recommended for broad tooling compatibility
  • Attestation Format: in-toto predicate type for OCI registry storage

3. SLSA Provenance Attestation

Configuration

provenance:
  enabled: true                          # Enable/disable provenance (default: false)
  version: "1.0"                         # SLSA provenance version

  builder:
    id: "https://github.com/myorg/myrepo"

  metadata:
    include-env: false                   # Include (sanitized) environment variables
    include-materials: true              # Include source materials (git refs)

CLI Commands

# Generate and attach SLSA provenance
sc provenance attach --image docker.example.com/myapp:v1.0.0 \
  --source-repo github.com/myorg/myrepo \
  --git-sha abc123 \
  --workflow-name "Release"

# Verify provenance
sc provenance verify --image docker.example.com/myapp:v1.0.0

Implementation Notes

  • SLSA Version: v1.0 provenance format
  • Builder Identity: Derived from CI/CD environment (GitHub Actions, GitLab CI, etc.)
  • Non-falsifiable: Requires keyless signing with OIDC identity

4. Vulnerability Scanning Integration

Configuration

security:
  scan:
    enabled: true                        # Enable vulnerability scanning (default: false)
    tools:
      - name: grype                      # Primary scanner
        required: true                   # Fail if scanner fails
        fail-on: critical                # Fail on critical vulnerabilities (optional)
      - name: trivy                      # Validation scanner (defense in depth)
        required: true

    upload:
      defectdojo:
        enabled: true
        url: https://defectdojo.example.com
        api-key: ${secret:defectdojo-api-key}

CLI Commands

# Scan an image
sc image scan --image docker.example.com/myapp:v1.0.0

# Scan with specific tools
sc image scan --image docker.example.com/myapp:v1.0.0 --tools grype,trivy

# Scan all images in a stack
sc stack scan -s mystack -e production

Integrated Workflow Example

Combined Release Workflow

# sc stack configuration for production releases
release:
  signing:
    enabled: true
    keyless: true

  sbom:
    enabled: true
    format: cyclonedx-json
    attach: true

  provenance:
    enabled: true

  security:
    scan:
      enabled: true
      tools:
        - name: grype
          required: true
        - name: trivy
          required: true

CLI Usage

# Full release with signing, SBOM, provenance, and scanning
sc release create -s mystack -e production --version 2026.1.7

# This would automatically:
# 1. Build and push images
# 2. Generate SBOM for each image (Syft)
# 3. Scan images for vulnerabilities (Grype + Trivy)
# 4. Sign images with Cosign (keyless)
# 5. Attach SBOM as signed attestation
# 6. Attach SLSA provenance as signed attestation
# 7. Upload scan results to DefectDojo
# 8. Create Git tag and release notes

NIST SP 800-218 Compliance Mapping

SSDF Practice Requirement Simple Container Feature
PW.1.3 Review code before deploying Pre-deploy vulnerability scanning
PS.1.1 Generate and maintain SBOMs sc sbom generate
PS.3.1 Archive and protect build artifacts Signed images + Rekor transparency log
PS.3.2 Verify integrity before use sc image verify, sc sbom verify
RV.1.1 Identify known vulnerabilities sc image scan with dual-toolchain
RV.1.3 Continuously monitor for vulnerabilities DefectDojo integration

SLSA Compliance Mapping

SLSA Level Requirement Simple Container Feature
Level 1 Build process fully scripted sc CLI automation
Level 2 Version control + signed provenance Git integration + sc provenance attach
Level 3 Hardened build platform + non-falsifiable provenance Keyless signing via OIDC

Implementation Recommendations

Tool Versions (Tested)

Tool Version Purpose
Cosign 3.0.2 Image signing (via cosign-installer v4.0.0)
Syft 1.41.0 SBOM generation (6,265 components)
Grype 0.106.0 Primary vulnerability scanning
Trivy 0.68.2 Validation scanning (defense in depth)

Performance Considerations

Based on our production experience with 9 services:

Operation Sequential Parallel Recommendation
SBOM Generation 31s/image 31s total Parallelize per-service
Signing 40s/image 40s total Parallelize with 0.5s stagger (OIDC rate limits)
Scanning 89s/image 58s/image Run Grype + Trivy in parallel

Error Handling

  • Retry Logic: Implement exponential backoff for transient failures (network, registry)
  • Required vs Optional: Allow configuration of which steps are required vs best-effort
  • Fail-Fast: Option to stop on first failure or continue and report all failures

Alternative Approaches Considered

Option A: Shell Script Wrapper (Current Approach)

We currently implement signing in a 2,400-line bash script (release-images.sh). This works but has drawbacks:

  • Complex maintenance
  • Limited reusability across projects
  • No standardized configuration

Option B: Native Simple Container Integration (Requested)

Integrated into sc CLI with YAML configuration:

  • Consistent user experience
  • Declarative configuration
  • Reusable across all projects
  • Maintained by Simple Container team

Option C: Separate Plugin

A plugin architecture could work but adds complexity for a security-critical feature.

Recommendation: Option B - Native integration provides the best security and user experience.


Questions for Simple Container Team

  1. Configuration Location: Should signing config be per-stack, per-environment, or global?
  2. Secrets Management: How should signing keys/credentials be securely stored?
  3. CI/CD Detection: Can sc auto-detect CI environment for OIDC configuration?
  4. Registry Support: Which registries should be tested (ECR, Harbor, DockerHub, etc.)?
  5. Timeline: What is the feasibility for inclusion in the next major release?

Reference Implementation

We have a working implementation in our release-images.sh script that demonstrates:

  • Parallel signing of 9 services (80% faster than sequential)
  • Dual-toolchain scanning (Syft+Grype + Trivy)
  • SBOM generation and attestation
  • SLSA provenance attachment
  • AWS Marketplace ECR publishing with signing
  • Helm chart signing

We are happy to share this implementation as a reference and collaborate on the Simple Container integration.


Appendix: NIST SP 800-218 SSDF Reference

NIST Special Publication 800-218 - Secure Software Development Framework (SSDF)

Key practices addressed by this feature request:

  • PS (Protect Software): Protect all forms of code from unauthorized access and tampering
  • PW (Produce Well-Secured Software): Produce well-secured software with minimal security vulnerabilities
  • RV (Respond to Vulnerabilities): Identify residual vulnerabilities and respond appropriately

Full document: https://csrc.nist.gov/publications/detail/sp/800-218/final

FYI @Cre-eD

Metadata

Metadata

Assignees

No one assigned

    Labels

    featureTriggers Simple Forge's Product Manager role to start working on the issue

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions