PQC Status
Guida

Generare una CBOM CycloneDX in CI

Una pipeline pratica: raccogliere, unire, validare, archiviare e confrontare una distinta crittografica CycloneDX 1.6 a ogni build.

· 8 min

Una CBOM CycloneDX (cryptographic bill of materials, distinta base crittografica) è un documento CycloneDX i cui componenti descrivono asset crittografici: algoritmi, protocolli, certificati e materiale crittografico. Produrne una in integrazione continua è soprattutto una questione di collegamenti: eseguire i rilevatori su codice sorgente, dipendenze, immagini container ed endpoint di test, unire i risultati in un unico documento CycloneDX 1.6, validarlo rispetto allo schema, quindi archiviarlo e confrontarlo con la build precedente. La parte difficile è essere onesti su ciò che una pipeline di build può effettivamente vedere. Per il concetto in sé, partite dalla nostra introduzione alla CBOM.

Dove risiedono gli asset crittografici nel modello CycloneDX 1.6

CycloneDX 1.6 ha introdotto il tipo di componente cryptographic-asset. Ciascuno di questi componenti contiene un oggetto cryptoProperties, e il suo campo assetType determina quale gruppo di proprietà si applica. Esistono quattro tipi di asset.

assetTypeGruppo di proprietàContenuto tipico
algorithmalgorithmPropertiesPrimitiva (kem, signature, pke, hash, mac, block cipher), identificatore del set di parametri, modalità, padding, curva, funzioni crittografiche, livello di sicurezza quantistica NIST
certificatecertificatePropertiesNome del soggetto, nome dell'emittente, date di validità, formato del certificato, riferimenti all'algoritmo di firma e alla chiave pubblica del soggetto
protocolprotocolPropertiesTipo di protocollo (tls, ssh, ipsec e altri), versione, cipher suite con i relativi identificatori, riferimenti agli algoritmi utilizzati
related-crypto-materialrelatedCryptoMaterialPropertiesChiavi, segreti, token, digest, vettori di inizializzazione, con dimensione, stato e date del ciclo di vita

Altri due campi svolgono il vero lavoro di inventario. Il campo oid associa un algoritmo al suo identificatore di oggetto, quando lo conoscete. E nell'array dependencies, il campo provides indica che un componente software implementa un asset crittografico. È così che una CBOM risponde alla domanda che un auditor pone davvero: quale applicazione usa questo algoritmo, e dove?

{
  "bomFormat": "CycloneDX",
  "specVersion": "1.6",
  "serialNumber": "urn:uuid:4e1e1f2a-0000-0000-0000-000000000000",
  "version": 1,
  "metadata": {
    "timestamp": "2026-10-19T06:12:00Z",
    "component": {
      "type": "application",
      "bom-ref": "payments-api@1.42.0",
      "name": "payments-api",
      "version": "1.42.0"
    }
  },
  "components": [
    {
      "type": "cryptographic-asset",
      "bom-ref": "crypto/algorithm/ml-kem-768",
      "name": "ML-KEM-768",
      "cryptoProperties": {
        "assetType": "algorithm",
        "algorithmProperties": {
          "primitive": "kem",
          "parameterSetIdentifier": "768",
          "cryptoFunctions": ["keygen", "encapsulate", "decapsulate"],
          "nistQuantumSecurityLevel": 3
        }
      }
    },
    {
      "type": "cryptographic-asset",
      "bom-ref": "crypto/protocol/tls-1.3",
      "name": "TLS 1.3",
      "cryptoProperties": {
        "assetType": "protocol",
        "protocolProperties": {
          "type": "tls",
          "version": "1.3",
          "cipherSuites": [
            { "name": "TLS_AES_256_GCM_SHA384", "identifiers": ["0x13", "0x02"] }
          ],
          "cryptoRefArray": ["crypto/algorithm/ml-kem-768"]
        }
      }
    }
  ],
  "dependencies": [
    { "ref": "payments-api@1.42.0", "provides": ["crypto/protocol/tls-1.3"] }
  ]
}

ML-KEM è il meccanismo di incapsulamento delle chiavi standardizzato in NIST FIPS 203; il suo set di parametri 768 si colloca nella categoria di sicurezza quantistica NIST 3. È nei componenti di protocollo che compaiono i gruppi di scambio di chiavi ibridi, ad esempio X25519MLKEM768, il cui codepoint 0x11EC è elencato nel registro IANA dei parametri TLS.

Rilevamento statico e comportamento osservato

Un job CI vede un repository, un lockfile e un'immagine. Non vede un handshake negoziato. Trattare le due cose come se fossero la stessa è il modo più comune in cui una CBOM diventa fuorviante.

AssetCosa può stabilire un job staticoCosa stabilisce solo l'osservazione
Chiamate ad algoritmi nel vostro codiceI punti di chiamata, con file e riga, più i set di parametri scritti come costantiSe quel percorso di codice viene eseguito in produzione
Librerie crittograficheLibreria e versione dal lockfile o dall'immagine, che delimitano ciò che è possibileQuale provider o modalità FIPS viene caricato a runtime
Scambio di chiavi TLS e cipher suiteSolo le direttive nei file di configurazione presenti nel repositoryIl gruppo e la suite effettivamente negoziati, inclusi i valori predefiniti a monte
CertificatiFile di certificato, truststore e keystore distribuiti nell'immagine, con validità e algoritmo di firmaLa catena servita da un endpoint attivo e i certificati emessi dopo la build
Chiavi e durateDimensioni dichiarate, parametri di rotazione nella configurazioneStato e date delle chiavi conservati in un key manager o in un HSM
Endpoint di terze parti che chiamateAl massimo i nomi hostCiò che quegli endpoint offrono, che non controllate

Registrate la differenza nel documento. Mantenete i fatti derivati staticamente nel componente stesso, con il percorso del file nelle occorrenze delle evidenze del componente, e mantenete i fatti misurati in protocolProperties e certificateProperties prodotti da un job di probing. Compilate sempre metadata.tools, affinché il lettore sappia quale rilevatore ha formulato quale affermazione.

Schema di una pipeline

1. Dichiarare il perimetro

Prima che qualsiasi strumento venga eseguito, decidete cosa copre una CBOM: un componente distribuibile, una versione, un ambiente. Un unico file che descrive dodici servizi invecchia male e non può essere confrontato in modo utile.

2. Raccogliere in parallelo

  1. Scansione di sorgenti e dipendenze: un analizzatore statico sul repository e sui lockfile, che emette asset di tipo algoritmo con le posizioni delle evidenze.
  2. Scansione dell'immagine o del filesystem: ispezionare l'artefatto prodotto alla ricerca di librerie crittografiche, bundle di certificati, keystore e file di configurazione.
  3. Probe degli endpoint osservati: solo sullo staging, confermare ciò che viene realmente negoziato.
# TLS: does the staging endpoint negotiate a hybrid group?
# requires OpenSSL 3.5 or later for the ML-KEM groups
openssl s_client -connect staging.example.com:443 \
  -groups X25519MLKEM768 </dev/null | grep "Negotiated TLS1.3 group"

# SSH: which key agreement algorithms does this client build support?
ssh -Q kex

# SSH: confirm the server accepts the post-quantum hybrid key agreement
ssh -o KexAlgorithms=mlkem768x25519-sha256 -o BatchMode=yes \
  git@staging.example.com true

L'algoritmo mlkem768x25519-sha256 è stato aggiunto in OpenSSH 9.9 ed è diventato l'accordo di chiave predefinito in OpenSSH 10.0, secondo le note di rilascio di OpenSSH. Eseguite i probe sullo staging, mai in produzione, e mantenete un fallback classico come X25519 dopo il gruppo ibrido in ogni configurazione server che modificate.

3. Unire, marcare e validare

Unite i documenti parziali in uno solo, quindi fate fallire il job se il risultato non è valido rispetto allo schema. La CLI di CycloneDX fa entrambe le cose.

cyclonedx merge \
  --input-files static.cbom.json image.cbom.json observed.cbom.json \
  --output-file cbom.json

cyclonedx validate --input-file cbom.json --fail-on-errors

Marcate metadata.timestamp, la versione del componente e lo SHA del commit. Una CBOM senza provenienza è un'opinione.

Archiviare e confrontare la CBOM

Pubblicate il file come artefatto di build per la tracciabilità, e conservate una copia normalizzata per componente in un repository dedicato o in un server BOM, così che lo storico sia interrogabile. La normalizzazione conta più dell'archiviazione: ordinate i componenti, usate valori bom-ref stabili che non contengano il numero di build, ed escludete il timestamp dal diff. Altrimenti ogni build appare come una modifica.

# extract a stable, sorted view of the cryptographic assets
jq -S '[.components[]
       | select(.type == "cryptographic-asset")
       | {name, assetType: .cryptoProperties.assetType,
          primitive: .cryptoProperties.algorithmProperties.primitive}]
       | sort_by(.name)' cbom.json > current.view.json

diff -u previous.view.json current.view.json

Decidete poi cosa significa una differenza. Controlli utili, in ordine crescente di gravità: compare un nuovo asset che nessuna build precedente aveva dichiarato; un algoritmo a chiave pubblica vulnerabile ai computer quantistici compare in un componente che prima non ne aveva; un gruppo pre-standard obsoleto, come un gruppo TLS Kyber in versione draft, compare in qualsiasi punto; un gruppo ibrido scompare da un servizio che lo aveva. Iniziate con un avviso, non con un fallimento, finché il rumore dei rilevatori non è compreso. Questo diff è la parte misurabile della crypto agility: mostra se la vostra superficie crittografica cambia intenzionalmente o per caso.

Limiti da mettere per iscritto

Cosa dimostra una CBOM generata in CI

Diversi testi richiedono un inventario della crittografia in uso. Il requisito 12.3.3 di PCI DSS v4.0.1 chiede che le cipher suite e i protocolli in uso siano documentati e riesaminati almeno ogni 12 mesi, includendo dove vengono utilizzati e una strategia documentata per i cambiamenti previsti nelle vulnerabilità crittografiche, ed è obbligatorio dal 31 marzo 2025 (PCI SSC document library). DORA, Regolamento delegato (UE) 2024/1774 della Commissione, richiede all'articolo 6 una politica di cifratura con disposizioni per l'aggiornamento o la modifica della tecnologia crittografica in funzione degli sviluppi della crittoanalisi, e all'articolo 7 la gestione delle chiavi lungo l'intero ciclo di vita oltre a un registro dei certificati per gli asset ICT che supportano funzioni essenziali o importanti (EUR-Lex). Per le agenzie federali statunitensi, OMB M-26-15 richiede un inventario crittografico automatizzato e aggiornato in modo continuo (M-26-15). La EU Coordinated Implementation Roadmap v1.1 indica un inventario crittografico tra i primi passi entro la fine del 2026, come orientamento coordinato per gli Stati membri e non come regolamento vincolante per le imprese.

La nostra interpretazione, chiaramente indicata come tale: nessuno di questi testi menziona CycloneDX, e una CBOM è un modo pratico per produrre e mantenere un tale inventario, non un formato obbligatorio. Costruite il file perché rende meno costosa la prossima decisione di migrazione, poi mappatelo sull'obbligo applicabile. Si tratta di un'informazione, non di una consulenza legale.

Prossimo passo: confrontare la CBOM con la realtà

Una CBOM generata in CI vi dice cosa contiene la vostra build. Non può dirvi cosa negoziano i vostri server. Colmate questo divario testando direttamente gli endpoint: analizzate il vostro dominio con PQC Status per vedere i gruppi ibridi ML-KEM, le versioni TLS e la catena di certificati effettivamente offerti a un client, quindi riportate questi valori osservati nelle protocolProperties e certificateProperties della vostra prossima CBOM, così che il documento rifletta sia il codice sia il comportamento.

Domande frequenti

Quale versione di CycloneDX serve per descrivere gli asset crittografici?

CycloneDX 1.6 è la prima versione con il tipo di componente cryptographic-asset e l'oggetto cryptoProperties. Ha inoltre aggiunto il campo provides nell'array dependencies, che collega un componente software agli asset crittografici che implementa. Le versioni precedenti possono solo approssimare questo risultato con proprietà generiche.

Una pipeline CI da sola può produrre un inventario crittografico completo?

No. L'analisi statica di sorgenti, dipendenze e immagini mostra ciò che è possibile, non ciò che viene eseguito: la configurazione risolta a runtime, i proxy a monte e gli endpoint di terze parti restano invisibili. Combinate la CBOM statica con dati osservati provenienti dai probe sugli endpoint e dai vostri sistemi di gestione delle chiavi e dei certificati. Registrate esplicitamente quali perimetri non sono stati coperti.

Con quale frequenza va rigenerata la CBOM?

Generatela a ogni build, poiché il costo è quasi nullo una volta che la pipeline esiste e il valore deriva dal diff tra le build. Gli obblighi di riesame sono distinti: il requisito 12.3.3 di PCI DSS v4.0.1 chiede una documentazione riesaminata almeno ogni 12 mesi, e OMB M-26-15 chiede alle agenzie federali statunitensi un inventario automatizzato e aggiornato in modo continuo.

Una CBOM soddisfa da sola un requisito normativo?

Una CBOM è un formato, e nessuno dei testi che monitoriamo la menziona. PCI DSS, gli RTS DORA e la roadmap UE richiedono un inventario, una politica e, ai sensi dell'articolo 7 di DORA, un registro dei certificati. Una CBOM è un modo pratico per dimostrare la parte relativa all'inventario: questa è la nostra interpretazione, non una certificazione. Si tratta di un'informazione, non di una consulenza legale.