Creazione di asset e raccolta di prove in DevSecOps
Nel processo DevSecOps, per mantenere la conformità alla sicurezza è necessario tenere traccia di ciò che si costruisce, si testa e si distribuisce. La creazione di risorse e la raccolta di prove forniscono questa tracciabilità, garantendo che la sicurezza si integri perfettamente con ogni fase del ciclo di vita dello sviluppo del software. Questo approccio incarna il concetto di "sicurezza shift-left", in cui la sicurezza non è un ripensamento ma una parte intrinseca del processo di sviluppo.
Questa guida spiega come implementare la raccolta di prove basate sugli asset nelle vostre pipeline di DevSecOps. Seguendo queste pratiche, è possibile:
- Tracciate tutti gli artefatti prodotti nelle vostre pipeline CI/CD
- Raccogliere le prove delle scansioni di sicurezza e dei controlli di conformità
- Mantenere una traccia verificabile per la conformità normativa
- Automatizzare la gestione dei problemi e le richieste di modifica
Comprendere il flusso di lavoro
Il processo di raccolta delle risorse e delle prove segue tre fasi principali:
- Catturare le informazioni sulle risorse- Quando si creano artefatti (immagini, distribuzioni, ecc.), salvarne i metadati
- Registrare nell'inventario- Creare voci di inventario che tengano traccia dei beni in tutti gli ambienti
- Raccogliere prove- Collegare i risultati delle scansioni di sicurezza e i risultati dei test ad asset specifici
Questo flusso di lavoro garantisce che ogni artefatto della pipeline abbia una storia di conformità completa, dalla creazione alla distribuzione.
Che cos'è una risorsa?
In DevSecOps, un asset è un qualsiasi artefatto o entità che viene sottoposto a test e scansioni di sicurezza. Considerate un asset come il "soggetto" dei vostri controlli di conformità: è ciò che state testando, analizzando e infine distribuendo.
Tipi di attività comuni
Le attività possono assumere diverse forme nella vostra pipeline:
- Impegni sul codice sorgente- Il codice che viene costruito e testato
- Immagini del contenitore- Docker immagini prodotte dalle vostre compilazioni
- Artefatti di distribuzione- manifesti Kubernetes, grafici Helm o file di configurazione
- Esecuzione della pipeline- L'esecuzione della pipeline stessa
Il diagramma seguente mostra i vari tipi di asset supportati in DevSecOps:
Come identificare le attività
Ogni bene deve essere identificato in modo univoco e immutabile. Questo assicura che le prove raccolte per un asset si riferiscano sempre allo stesso esatto artefatto, anche se la pipeline viene eseguita più volte.
Formati di identificazione dei beni:
-
Commit Asset: repository e hash del commit
https://repo.url/org/repo#<COMMIT-SHA> -
Asset immagine: Docker immagine e relativo digest
docker://registry.URL/name@sha256:<SHA256-DIGEST> -
Asset della corsa della pipeline: ID della pipeline e della corsa
pipelinerun://<PIPELINE_ID>/<RUN_ID> -
Altre attività: Esempi completamente qualificati URL
- Impegnare l'asset con il nome del file (helm chart o file di configurazione):
https://repo.url/org/repo#<COMMIT-SHA>/<filename> - Bene artefatto:
<artifactory-url>/artifact.<filetype>
- Impegnare l'asset con il nome del file (helm chart o file di configurazione):
Usare identificatori immutabili (SHA dei commit, image digest) piuttosto che etichette mutabili (tag, branch) per garantire che le prove facciano sempre riferimento alla versione esatta dell'artefatto.
Che cos'è una prova?
L 'evidenza è una registrazione che dimostra che una specifica scansione di sicurezza, un test o un controllo di conformità sono stati eseguiti su un asset. Le voci di prova contengono:
- Il tipo di controllo eseguito (ad esempio, scansione delle vulnerabilità, test unitari)
- Lo strumento che ha eseguito il controllo (ad esempio, SonarQube, Jest)
- Lo stato del risultato (successo, fallimento, in attesa)
- Link ai risultati dettagliati, ai problemi e agli allegati
L'evidenza è un metadato che indica l'asset, lo strumento utilizzato per la raccolta e il risultato con gli eventuali allegati. Questo design consente di monitorare la conformità in più ambienti, mantenendo un'unica fonte di verità per ogni asset.
Standard di gestione dell'inventario
L'inventario funge da registro centrale di tutti i metadati delle risorse negli ambienti. Per garantire la coerenza e consentire la gestione automatizzata dei problemi, seguite questi standard di campo quando salvate gli asset e create le voci dell'inventario:
-
Tipo: Parole chiave riservate per indicare il tipo di artefatto:
commitper impegnare le attivitàimageper le risorse di immaginegenericper gli asset gestiti dalle condutture
Per qualsiasi altro tipo di artefatto, si può scegliere una stringa che indichi in modo appropriato il suo tipo intrinseco (ad esempio,
deploymentper i file di distribuzione,tarper i file tar). -
Nome: Mantenere un nome statico dell'artefatto per tutta l'esecuzione della pipeline. Evitare di incorporare elementi dinamici come gli hash dei commit nel nome per garantire la correttezza dei problemi di chiusura automatica.
Esempi:
us.icr.io/my-registry/my-app:20230828074614-master-commit-1@sha256:sha256-1my-app-202304211845444721_IKS_deployment
-
Provenienza: Fornire un dominio completamente qualificato URL per stabilire l'origine dell'artefatto.
Esempi:
us.icr.io/my-registry/my-app:20230828074614-master-commit-1@sha256:sha256-1
-
Digestione: Seguire lo schema regex: Iniziare con
sha256, seguito da due punti (:) e poi dall'hash SHA256 effettivo (sha256:<sha256>).Esempio:
sha256:sha256-1
-
Firma: Se l'artefatto è firmato, includere le informazioni relative alla firma.
L'applicazione di queste linee guida standardizzate migliora il processo di gestione dell'inventario, garantendo una traccia e un recupero accurati degli asset.
Implementazione del flusso di lavoro
Ora che avete capito i concetti, implementiamo il flusso di lavoro a tre fasi nella vostra pipeline.
Fase 1: Acquisizione delle informazioni sulle risorse
Quando la pipeline crea gli artefatti, catturare i loro metadati usando i comandi save_repo e save_artifact. Queste informazioni saranno utilizzate in seguito per creare voci di inventario e raccogliere prove.
Salvare le informazioni sul repository
Quando la pipeline controlla il codice sorgente, si usa il comando save_repo per registrare i dettagli del repository. Questo associa gli artefatti
di compilazione allo specifico commit che li ha prodotti.
Esempio:
save_repo app-repo \
url=<app_url> \
path=my-app \
commit=commit1 \
branch=master \
buildnumber=1
Salvare le informazioni sull'artefatto
Dopo aver creato gli artefatti (immagini, file di distribuzione, ecc.), usare il comando save_artifact per registrarne i dettagli. Questo cattura
il nome, il tipo, il digest e la provenienza dell'artefatto.
Quando usarlo:
- Dopo aver creato un'immagine Docker
- Dopo aver generato i manifesti di distribuzione
- Dopo aver creato qualsiasi artefatto che verrà distribuito
Esempio: Salvataggio di un'immagine Docker
Dopo che la pipeline ha creato e inviato un'immagine Docker:
save_artifact app-image \
name=us.icr.io/my-registry/my-app:20230828074614-master-commit-1@sha256:sha2561 \
type=image \
digest=sha256:sha2561 \
tags=mytag1 \
source=<source_url> \
signature=sign-1 \
provenance=us.icr.io/my-registry/my-app:20230828074614-master-commit-1@sha256:sha2561
Esempio: Salvataggio di un artefatto di distribuzione
Per gli artefatti non legati all'immagine, come i manifesti di Kubernetes o i grafici di Helm:
save_artifact artifact-1 \
name=my-app_IKS_deployment \
type=deployment \
signature=sign2 \
deployment_type=IKS \
provenance=<url>
Fase 2: creazione di voci d'inventario
Dopo aver acquisito le informazioni sugli asset, registrarli nell'inventario. L'inventario tiene traccia delle risorse in tutti gli ambienti e consente flussi di lavoro di promozione dallo sviluppo alla produzione.
Comprendere i parametri dell'inventario
Utilizzare il comando cocoa inventory add con i seguenti parametri:
| Argomento | Descrizione | Obbligatorio/Facoltativo | Note |
|---|---|---|---|
artifact |
Nome artefatto | [stringa] [obbligatorio] | Utilizzato per il soggetto nella gestione delle emissioni |
version |
La versione dell'applicazione | [stringa] [obbligatorio] | Versione della risorsa utente |
repository-url |
Il repository dell'applicazione | [stringa] [obbligatorio] | URL del repository in cui è stata creata questa risorsa |
pipeline-run-id |
L'ID dell'esecuzione della pipeline | [stringa] [obbligatorio] | Utilizzato per l'analisi delle prove nelle pipeline CD e CC |
commit-sha |
Il commit esatto della versione dell'applicazione | [stringa] [obbligatorio] | Commit SHA del repository URL dove è stata creata questa risorsa |
name |
Il nome dell'applicazione | [stringa] [obbligatorio] | Nome del file o voce dell'inventario per il bene |
build-number |
Il numero di build | [stringa] [obbligatorio] | Numero di build dell'asset, utilizzato per gli aggiornamenti degli insight |
type |
Tipo di artefatto: commit, image, generic, deployment, o altri tipi personalizzati |
[stringa] [obbligatorio] | Deve corrispondere al tipo salvato con il comando save_artifact |
app-artifacts |
Informazioni aggiuntive sul bene | [stringa] [opzionale] | Formato JSON per i metadati extra |
sha256 |
L'hash SHA256 dell'artefatto | [stringa] [obbligatorio] | Utilizzato per definire il percorso dell'asset nell'armadietto |
provenance |
L'indirizzo URL completamente qualificato in cui l'artefatto è memorizzato | [stringa] [obbligatorio] | Completare il sito URL per la localizzazione del manufatto |
signature |
La firma del manufatto | [stringa] [obbligatorio] | Utilizzato per verificare la firma dell'asset |
environment |
Il nome dell'ambiente in cui deve essere aggiunta la voce | [stringa] [opzionale] | Il ramo dell'inventario in cui viene aggiunta la voce (per impostazione predefinita è master) |
Creazione di voci di inventario
Gli esempi seguenti mostrano come creare voci di inventario per diversi tipi di beni. Si noti come i parametri corrispondano alle informazioni salvate in precedenza con save_artifact.
Esempio: Registrazione di un'immagine Docker nell'inventario
Questo esempio crea una voce di inventario per l'immagine Docker salvata in precedenza:
cocoa inventory add \
--artifact=us.icr.io/my-registry/my-app:20230828074614-master-commit-1@sha256:sha2561 \
--name=my-app \
--app-artifacts='{ "app": "my-app", "tags": "20230828074614-master-commit1" }' \
--signature=sign1 \
--provenance=us.icr.io/my-registry/my-app:20230828074614-master-commit-1@sha256:sha2561 \
--sha256=sha256:sha2561 \
--type=image \
--repository-url=<repo_url> \
--commit-sha=commit1 \
--version=commit1 \
--build-number=1 \
--pipeline-run-id=pipeline-run-1 \
--org=Org \
--repo=my-inventory-20230421184544472 \
--git-provider=github \
--git-token-path=./inventory-token \
--git-api-url=<api_url>
Esempio: Registrazione di un artefatto di distribuzione nell'inventario
Per gli artefatti di distribuzione, il processo è simile ma utilizza il tipo deployment:
cocoa inventory add \
--artifact=my-app_IKS_deployment \
--name=my-app_IKS_deployment \
--app-artifacts='{ "app": "my-app", "tags": "20230828074614-master-commit1" }' \
--signature=sign2 \
--provenance=<provenance_url> \
--sha256=sha256:sha2562 \
--type=deployment \
--repository-url=<repo_url> \
--commit-sha=commit1 \
--version=commit1 \
--build-number=1 \
--pipeline-run-id=pipeline-run-1 \
--org=Org \
--repo=my-inventory-20230421184544472 \
--git-provider=github \
--git-token-path=./inventory-token \
--git-api-url=<api_url>
Fase 3: raccogliere le prove
Quando la vostra pipeline esegue scansioni e test di sicurezza, raccogliete prove che colleghino i risultati a risorse specifiche. In questo modo si crea una traccia verificabile che mostra quali controlli sono stati eseguiti su ciascun artefatto.
Raccolta di prove per i beni
Utilizzare il comando collect-evidence dopo ogni scansione o test. Il parametro asset-key deve corrispondere alla chiave utilizzata quando si
salva l'asset con save_artifact o save_repo. Per informazioni dettagliate sul comando collect-evidence, compresi tutti i parametri, i formati degli strumenti supportati e l'uso della CLI, vedere lo
script collect-evidence.
Esempio: Raccolta di prove per i test sul codice sorgente
Per i test eseguiti sul repository del codice sorgente:
collect-evidence \
--tool-type "jest" \
--status "success" \
--evidence-type "com.ibm.unit_tests" \
--asset-type "repo" \
--asset-key "repo-1"
Esempio: Raccolta di prove per i test unitari su un artefatto
Dopo aver eseguito i test di accettazione, raccogliere le prove sugli artefatti:
collect-evidence \
--tool-type "jest" \
--status "success" \
--evidence-type "com.ibm.acceptance_tests" \
--asset-type "artifact" \
--asset-key "app-image"
Dopo aver eseguito i test di accettazione, raccogliere prove su più artefatti:
collect-evidence \
--tool-type "jest" \
--status "success" \
--evidence-type "com.ibm.acceptance_tests" \
--evidence-per-asset \
--assets "app-image:artifact" \
--assets "artifact-1:artifact"
Procedure consigliate
Utilizzare identificatori immutabili
Usare sempre gli SHA dei commit e i digest delle immagini piuttosto che i tag o i nomi dei rami. I riferimenti mutabili possono cambiare, interrompendo il legame tra prove e risorse.
Mantenere una denominazione coerente
Mantenere i nomi degli artefatti statici per tutta l'esecuzione della pipeline. Evitate di incorporare valori dinamici come i timestamp nel campo del nome per garantire il corretto tracciamento dei problemi e la chiusura automatica.
Abbinare i tipi di attività
Assicurarsi che il parametro type in cocoa inventory add corrisponda al tipo utilizzato in save_artifact. La mancata corrispondenza dei tipi può causare errori nella raccolta delle prove.
Provenienza di riferimento nelle distribuzioni
Nelle pipeline CD, utilizzare il campo provenance per scaricare gli artefatti piuttosto che il campo artifact. La provenienza URL fornisce la posizione completa e immutabile dell'artefatto.
Passi successivi
Ora che avete compreso la raccolta di prove basata sugli asset, potete farlo:
- Configurare la convalida delle prove nelle pipeline CD
- Impostare la gestione automatica delle modifiche
- Esplora i tipi di prove e i controlli di conformità
- Imparare a gestire l'inventario
Riutilizzo delle prove per un'esecuzione ottimizzata della pipeline
Per ottimizzare i tempi di esecuzione della pipeline e l'utilizzo delle risorse, è possibile abilitare il riutilizzo delle prove. Questa funzione consente di saltare le scansioni o i test quando l'asset (artefatto o repo) da analizzare non è cambiato dall'ultima scansione.
Per ulteriori informazioni sul riutilizzo delle evidenze, comprese le condizioni di riutilizzo, i periodi di validità e la configurazione avanzata, vedere Riutilizzo delle evidenze nelle pipeline PR e CI.
Nella pipeline del CD, la distribuzione deve fare riferimento a un campo di provenienza invece che a una risorsa utente per scaricare la risorsa utente