Prova
La raccolta delle prove è uno degli aspetti essenziali dell'architettura di riferimento dell' DevSecOps. La prova di conformità crea la traccia di controllo che i revisori cercano durante una verifica di conformità. Uno degli obiettivi di DevSecOps è la generazione automatizzata di prove e la loro archiviazione in archivi verificabili.
Il modo in cui le pipeline di DevSecOps gestiscono le prove (formato dei file e struttura degli armadietti) è il seguente:
- Prova v2 (prova basata sugli asset)
Creazione di prove
La prova differisce dalle risorse utente create dai passi della fase della pipeline, come i risultati del test dell'unità o i file XML o JSON. Ogni incarico deve riportare a diversi strumenti che gestiscono le prove come la creazione, la formattazione e la memorizzazione delle prove.
Qualsiasi test, controllo o scansione generica può produrre prove all'interno di una fase della pipeline utilizzando i passaggi all'interno degli strumenti DevSecOps o delle pipeline, come mostrato nell'immagine seguente. Gli strumenti DevSecOps devono essere in grado di ricevere il risultato dell'attività, creare le prove e archiviarle nell'archivio delle prove.
Il formato della prova contiene il risultato dell'incarico (riuscito o non riuscito), i collegamenti alle risorse utente create e i collegamenti a qualsiasi problema di incidente creato in base al risultato dell'attività.
Questi strumenti si concentrano solo sulla raccolta di prove e non modificano il comportamento del proprio processo di build. La pipeline di riferimento di DevSecOps non si interrompe a causa dei risultati falliti delle attività. Un'immagine può essere creata e distribuita con test e vulnerabilità non riusciti se esiste la prova dei controlli e degli errori, il team viene notificato, una richiesta di modifica creata durante la distribuzione mostra la prova di questi problemi e la richiesta di modifica viene approvata manualmente.
Flusso di prove
Il seguente diagramma mostra come viene gestita la prova e come essa scorre attraverso le fasi di integrazione continua e distribuzione continua.
Ogni elemento di prova raccolto nelle diverse fasi dell'architettura DevOps viene memorizzato in armadietti di prove controllabili. Durante la distribuzione, questa prova viene raccolta per creare un riepilogo delle prove salvato nel blocco delle prove alla fine dell'esecuzione della distribuzione.
Il riepilogo della prova è allegato alla richiesta di modifica, che viene inviata all'archivio della richiesta di modifica. Durante l'approvazione di una richiesta di modifica manuale, l'approvatore è a conoscenza di eventuali problemi rilevati durante la build.
Prova v2 (formato corrente)
Locker delle prove v2
Le prove sono memorizzate in una gerarchia piatta, in cui ogni elemento di prova è identificato dal proprio hash SHA256, che fornisce un livello di protezione dell'integrità (cioè, qualsiasi modifica del contenuto delle prove può essere rilevata). Poiché ogni prova è correlata a uno o più asset, gli algoritmi di sintesi delle prove scoprono le prove rilevanti in base agli asset.
L'unica gerarchia è la differenziazione del tipo e alcuni raggruppamenti di hash simili alla struttura degli oggetti hash Git.
Esempio
.
└── raw/
├── assets/
│ └── xx/
│ └── abcdef123456789/
│ ├── evidences/
│ │ ├── 00abcdef123456789
│ │ └── 01abcdef123456789
│ └── index.json
├── attachments/
│ ├── aa/
│ │ └── abcdef123456789/
│ │ └── content
│ └── ab/
│ └── abcdef123456789/
│ └── content
├── cd/
│ ├── c9b77749-fd59-4d32-bbdb-18e55db1615d/
│ └── summary.json
| └── evdience-checks.json
├── cc/
│ ├── absd7749-fd59-4d32-bbdb-18e55db1615d/
│ └── summary.json
| └── evdience-checks.json
└── evidences/
├── 00/
│ └── abcdef123456789/
│ └── index.json
└── 01 /
└── abcdef123456789/
└── index.json
Raccolta di prove v2
La prova v2 deve essere raccolta il più vicino possibile al processo che ha creato il risultato per una prova. Dopo ogni esecuzione di scansione, dopo ogni test, ad esempio.
Per la raccolta delle prove, lo script collect-evidence può essere utilizzato nelle pipeline DevSecOps.
Formato della prova v2
Una prova rappresenta il risultato di una scansione, un test e così via. La prova è sempre collegata ad almeno un singolo asset. Sono consentiti più asset, come una singola suite di test end-to-end che probabilmente esegue il test di più asset insieme.
Un asset rappresenta qualcosa che puoi testare, scansionare e così via, come un Git commit in un repository, un docker image o qualsiasi asset generic con un URI.
I tipi Evidence e Asset rappresentano lo schema degli elementi locker v2: prova e asset. Anche se lo schema utilizza la sintassi typescript, è possibile convertirlo per utilizzare lo schema JSON.
type SHA1 = string; // 40 character string representing a SHA-1 hash in hexadecimal format
type SHA256 = string; // 64 character string representing a SHA256 hash in hexadecimal format
type IssueURL = string; // Link to issues on a git service provide like GitHub or GitLab
type RepositoryURL = string; // Link to a git repository
type AssetURI = string; // URI of an Asset, like an image or a repository link and git hash
type FileName = string; // file basename of the attachment
interface Evidence {
version: 2;
id: SHA256;
date: string;
evidence_type_id: string;
evidence_type_version: string;
origin: {
// scope defines a contextual set for multiple evidence, usually a SHA256 identifier or a CI/CD run ID
scope: SHA256;
// any further IDs can be used to determine evidence origin, see example
[index: string]: string;
},
details: {
result: 'success' | 'failure' | 'pending';
tool: string;
// field "details" can have any arbitrary key-value pairs to provide metadata
[index: string]: string;
}
attachments: Record<string, string> | EvidenceAssetAttachment[];
assets: string[] | EvidenceAssetAttachment[];
issues: IssueURL[],
findings?: IncidentFinding[];
}
export interface IncidentFinding {
id: string;
url: string;
due_date: string;
first_found?: string;
severity: ("high", "medium", "low", "critical, "informational");
has_exempt: boolean;
found_status: ("new", "existing", "autoclosed", "readonly");
}
export interface EvidenceAssetAttachment {
url: string; // hash of the asset or attachment
hash: string; // complete url of the asset or attachment
uri?: string; // name of the asset
}
interface Asset {
version: 1;
id: SHA256;
uri: AssetURI;
date: string;
type: 'commit' | 'image' | 'generic';
origin: {
// any IDs can be used to determine asset origin, see example
[index: string]: string;
},
details: Record<string, string>,
// Assets can relate to each other, for example
// an Image Asset can relate to the Git Commit Asset
// it was built from on code level
related: SHA256[];
}
Esempio
Asset di esempio v2
{
"version": "1",
"id": "cdd3ee20188d2f5bfb7f14bdb9c7fa99b22184ca195d9fa0a953dfbe9b1769cb",
"uri": "https://github.com/<org-name>/e2e-hello-compliance-app-20220412084808399.git#8c2a65373cb4fd27bccff646e8bdf63d02cae856",
"origin": {
"toolchain_crn": "crn:v1:bluemix:public:toolchain:us-south:a/40111714589c4f7099032529b26a7a63:fd3f2bf6-00f1-417f-b1a2-7df894223115::",
"pipeline_run_id": "a5e89ecc-a413-4dcb-b129-ff870ef3be85",
"pipeline_id": "66b583d9-3d1b-4b34-9e3a-cb807bf0c5ab"
},
"details": {
"sha": "8c2a65373cb4fd27bccff646e8bdf63d02cae856",
"repository": "https://github.com/<org-name>/e2e-hello-compliance-app-20220412084808399.git"
},
"date": "2022-04-20T09:26:46.226Z",
"type": "commit",
"related": [
"26a0f02126461e6505d5001d50ac71e585c280479a01cc70e36397a784440bf8"
]
}
Prova di esempio v2
{
"version": "2",
"id": "3fd209270fbaf46137ec3966affac2a431a835e750301c7c44d583e0e426e29e",
"date": "2022-04-20T09:33:43.782Z",
"evidence_type_id": "com.ibm.code_vulnerability_scan",
"evidence_type_version": "1.0.0",
"details": {
"result": "failure",
"tool": "cra"
},
"origin": {
"toolchain_crn": "crn:v1:bluemix:public:toolchain:us-south:a/779c0808c946b9e15cc2e63013fded8c:68213c68-4794-4d5e-ab50-f33d0d6190e4::",
"pipeline_id": "c17f18a6-24dd-4949-abb7-2b374f4691b6",
"pipeline_run_id": "d7a88836-72a1-402b-bb28-701439a543ae",
"pipeline_run_url": "https://cloud.ibm.com/devops/pipelines/tekton/c17f18a6-24dd-4949-abb7-2b374f4691b6/runs/d7a88836-72a1-402b-bb28-701439a543ae/code-compliance-checks/run-stage/?env_id=ibm:yp:us-south",
"scope": "117458e26512b0308d93cf6852958e5e875294a982d2b4ea2e9f463b4551a846"
},
"assets": [
{
"hash": "cdd3ee20188d2f5bfb7f14bdb9c7fa99b22184ca195d9fa0a953dfbe9b1769cb",
"uri": "https://github.com/<org-name>/e2e-hello-compliance-app-20220412084808399.git#8c2a65373cb4fd27bccff646e8bdf63d02cae856",
"url": "https://s3.private.us-south.cloud-object-storage.appdomain.cloud/test/assets/cdd3ee20188d2f5bfb7f14bdb9c7fa99b22184ca195d9fa0a953dfbe9b1769cb/index.json"
}
],
"issues": [
"https://github.com/<org-name>/e2e-compliance-incident-issues-20220412084808401/issues/1",
"https://github.com/<org-name>/e2e-compliance-incident-issues-20220412084808401/issues/2",
"https://github.com/<org-name>/e2e-compliance-incident-issues-20220412084808401/issues/3",
],
"findings": [
{
"id": "CVE-2022-42011",
"due_date": "2024-04-20",
"severity": "medium",
"first_found": "2024-03-06",
"url": "https://github.com/<org-name>/e2e-compliance-incident-issues-20220412084808401/issues/3",
"found_status": "new",
"has_exempt": true
},
{
"id": "CVE-2022-42010",
"due_date": "2024-04-20",
"severity": "medium",
"first_found": "2024-03-06",
"url": "https://github.com/<org-name>/e2e-compliance-incident-issues-20220412084808401/issues/1",
"found_status": "existing",
"has_exempt": false
},
{
"id": "CVE-2023-34969",
"due_date": "2024-04-20",
"severity": "medium",
"first_found": "2024-03-06",
"url": "https://github.com/<org-name>/e2e-compliance-incident-issues-20220412084808401/issues/2",
"found_status": "existing",
"has_exempt": true
}
],
"attachments": [
{
"hash": "9a841ef856a5de813dbe440b102b9bff3ca1831630292cff7323c557704f386b",
"url": "https://s3.private.us-south.cloud-object-storage.appdomain.cloud/test/assets/9a841ef856a5de813dbe440b102b9bff3ca1831630292cff7323c557704f386b/index.json"
}
]
}
Riepilogo della prova v2
La pipeline DevSecOps crea un documento di sintesi delle prove. Questo documento contiene la più recente di tutte le prove create durante ciascuna delle build di integrazione continua che distribuisce un'immagine e la prova creata durante la distribuzione stessa. Il riepilogo viene creato per la richiesta di modifica richiesta per distribuire qualsiasi fase.
interface Summary {
version: '2.0'; // schema version
date: string; // ISO-8601, UTC, ie. YYYY-MM-DDThh:mm:ssZ
toolchain_crn: string; // CRN of the toolchain that generated the summary
pipeline_id: string; // ID of the pipeline that generated the summary
pipeline_run_id: string; // ID of the pipeline run that generated the summary
evidences: Evidence[];
}
Questo riepilogo non esegue alcuna aggregazione di risultati. Si tratta dei dati grezzi delle prove raccolte dall' v2, così come sono state trovate per le risorse correlate a una richiesta di modifica.