đ SĂ€kra din Software Supply Chain: SĂ„ automatiserar du SBOM med Microsoft Sbom Tool och CycloneDX
I en tid dĂ€r cyberattacker allt oftare riktas mot mjukvarukedjan (Software Supply Chain) har begreppet SBOM (Software Bill of Materials) gĂ„tt frĂ„n att vara ett âbra att haâ till ett absolut krav. Att veta exakt vilka komponenter, öppna kĂ€llkodspaket och beroenden din applikation bestĂ„r av Ă€r grundbulten i modern applikationssĂ€kerhet.
Om du rör dig i .NET-ekosystemet finns det framför allt tvÄ kraftfulla spÄr för att generera SBOM:s: Microsofts officiella Microsoft.Sbom.Tool (som fokuserar pÄ SPDX-formatet) och CycloneDX-dotnet (som levererar det branschstandardiserade CycloneDX-formatet).
HÀr gÄr vi igenom hur verktygen fungerar, hur du kör dem lokalt, hur du automatiserar dem i din CI/CD-pipeline, och hur du vÀljer rÀtt vÀg för din organisation.
Del 1: Microsoft.Sbom.Tool â Det officiella spĂ„ret
Microsofts officiella SBOM-verktyg Àr en cross-platform CLI skrivet i .NET som Àr designat för att vara extremt skalbart. Det Àr samma verktyg som Microsoft sjÀlva anvÀnder internt för att signera och validera sina produkter. Verktyget producerar i dagslÀget filer i SPDX (Software Package Data Exchange)-formatet.
Köra lokalt
Du kan enkelt installera verktyget globalt via dotnet CLI eller ladda ner binÀren direkt frÄn GitHub.
# Installera som ett globalt dotnet-verktyg
dotnet tool install --global Microsoft.Sbom.Tool
För att generera en SBOM för ditt projekt kör du kommandot sbom-tool generate. HÀr Àr ett typiskt exempel:
sbom-tool generate \
-BuildDropPath "./bin/Release/net10.0/publish" \
-BuildComponentPath "./" \
-PackageName "MinApplikation" \
-PackageVersion "1.0.0" \
-Owner "MittFöretag" \
-NamespaceUri "https://mittforetag.se/sbom/minapplikation/1.0.0" \
-ManifestDirPath "./sbom-output"
-BuildDropPath: Mappen dÀr dina fÀrdiga binÀrer ligger (det som ska distribueras). Verktyget hashar dessa filer.-BuildComponentPath: Mappen dÀr kÀllkoden och dina projektfiler (.csproj,packages.config) finns. Verktyget skannar dessa efter beroenden.-ManifestDirPath: Det katalog safeguards dÀr den fÀrdigamanifest.json(SPDX-filen) hamnar.
Automatisera i CI/CD (GitHub Actions)
Att köra detta manuellt hÄller sjÀlvklart inte i lÀngden. SÄ hÀr integrerar du Microsoft.Sbom.Tool i ett GitHub Actions-workflow efter att du har byggt eller publicerat din applikation:
- name: Publish Application
run: dotnet publish -c Release -o ./publish
- name: Install SBOM Tool
run: dotnet tool install --global Microsoft.Sbom.Tool
- name: Generate SBOM
run: |
sbom-tool generate \
-BuildDropPath "./publish" \
-BuildComponentPath "./" \
-PackageName "$" \
-PackageVersion "1.0.$" \
-Owner "SoftArch Corp" \
-NamespaceUri "https://github.com/$/sbom/$" \
-ManifestDirPath "./publish/_manifest"
- name: Upload Build Artifacts
uses: actions/upload-artifact@v4
with:
name: published-app-with-sbom
path: ./publish
Del 2: OWASP CycloneDX â Branschstandardiserad flexibilitet
Medan Microsofts verktyg fokuserar pÄ SPDX, föredrar mÄnga sÀkerhetsteam CycloneDX-formatet, vilket Àr OWASP:s flaggskeppsformat för just Supply Chain-sÀkerhet. Det Àr ofta mer lÀtthanterligt i JSON-format och har ett enormt ekosystem av verktyg kring sig (sÄsom Dependency-Track).
Inom .NET-vÀrlden hanterar vi detta pÄ tvÄ sÀtt: via CLI-verktyget för automatisering, eller programmatiskt via NuGet-paket.
Alternativ A: Globalt CLI-verktyg (cyclonedx-dotnet)
Detta Àr det snabbaste sÀttet att generera en CycloneDX-fil för en hel solution eller ett specifikt projekt.
# Installera verktyget
dotnet tool install --global CycloneDX
# Generera en JSON-fil baserad pÄ din lösning
dotnet cyclonedx MinLosning.sln -o ./sbom-output -f json
Detta skapar en bom.json i mÄlmappen som innehÄller alla dina transienta och direkta NuGet-beroenden, kompletta med PURL (Package URL) och licensinformation.
Alternativ B: Programmatiskt med CycloneDX.Models
Om du bygger egna interna verktyg, plattformar eller vill ha total kontroll över hur din SBOM genereras (kanske vill du slÄ ihop data frÄn flera kÀllor eller lÀgga till egna metadata), kan du anvÀnda NuGet-paketet CycloneDX.Core och CycloneDX.Models.
HÀr Àr ett exempel pÄ hur du skapar en CycloneDX SBOM direkt i C#-kod:
using System;
using System.IO;
using System.Collections.Generic;
using CycloneDX.Models;
using CycloneDX.Json;
// 1. Skapa grundmodellen för din BOM
var bom = new Bom
{
SpecVersion = SpecificationVersion.v1_5,
SerialNumber = $"urn:uuid:{Guid.NewGuid()}",
Version = 1,
Metadata = new Metadata
{
Timestamp = DateTime.UtcNow,
Component = new Component
{
Type = Component.ComponentType.Application,
Name = "MinArkitektur.CoreAPI",
Version = "2.1.0",
Description = "Huvud-API för affÀrslogik"
}
},
Components = new List<Component>()
};
// 2. LÀgg till komponenter/beroenden (hÀr hÄrdkodat, men kan loopas frÄn t.ex. en filskanning)
bom.Components.Add(new Component
{
Type = Component.ComponentType.Library,
Name = "Newtonsoft.Json",
Version = "13.0.3",
Purl = "pkg:nuget/Newtonsoft.Json@13.0.3",
Licenses = new List<LicenseChoice>
{
new LicenseChoice { License = new License { Id = "MIT" } }
}
});
// 3. Serialisera till JSON-format enligt standarden
string jsonOutput = BomSerializer.Serialize(bom);
// 4. Spara filen
File.WriteAllText("BomCustom.json", jsonOutput);
Console.WriteLine("CycloneDX SBOM har genererats programmatiskt!");
Best Practices: Hur tar man fram SBOM pÄ bÀsta sÀtt?
Att bara dumpa en JSON-fil i en mapp gör ingen sÀkrare. För att Supply Chain Security ska fungera i praktiken bör du applicera följande strategier:
1. Automatisera tidigt och konsekvent
Generera alltid din SBOM i din Release-pipeline. Den ska skapas i samband med att din artefakt byggs, sÄ att du garanterat vet att det som hamnar i produktion matchar din SBOM exakt.
2. Signera din SBOM
En SBOM gÄr att manipulera. Genom att signera din SBOM (exempelvis med verktyg som Cosign eller via interna certifikat i din pipeline) kan konsumenten (eller ditt produktionskluster) verifiera att filen inte har Àndrats efter att den skapades i den sÀkra CI-miljön.
3. Integrera med kontinuerlig sÄrbarhetsskanning
Att titta i en rĂ„ JSON-fil Ă€r opraktiskt. LĂ€s in dina genererade SBOM-filer i ett centralt verktyg som OWASP Dependency-Track eller Trivy. Dessa verktyg matchar kontinuerligt din SBOM mot kĂ€nda sĂ„rbarhetsdatabaser (CVE:er). Det betyder att om en ny sĂ„rbarhet upptĂ€cks i ett paket du anvĂ€nde för sex mĂ„nader sedan, fĂ„r du ett larm direkt â utan att du behöver bygga om applikationen.
4. VĂ€lj format strategiskt
- VĂ€lj SPDX (
Microsoft.Sbom.Tool) om du levererar programvara till myndigheter eller enterprise-kunder som har strikta krav pÄ Microsoft-kompatibilitet eller specifika upphandlingar dÀr SPDX krÀvs. - VÀlj CycloneDX (
cyclonedx-dotnet) om du vill ha maximal flexibilitet, ett modernare JSON-stöd och smidig integration med moderna open-source sÀkerhetsverktyg.
Sammanfattning
Att införa SBOM Àr inte svÄrt i .NET-ekosystemet tack vare verktygen vi har tillgÄng till idag. Genom att lÀgga till nÄgra rader i dina GitHub Actions eller Azure DevOps-pipelines kan du automatiskt generera kompletta innehÄllsförteckningar över din mjukvara. Det skyddar inte bara dina kunder, utan ger Àven ditt eget team full koll pÄ er tekniska skuld och licenshantering.
Börja med att installera CycloneDX eller Microsoft.Sbom.Tool lokalt idag och se vad dina applikationer egentligen innehÄller!