Convalida della prova in corso

Nell'architettura DevSecOps, le prove raccolte durante la pipeline CI devono essere convalidate prima del deployment per garantire che gli asset soddisfino i requisiti di conformità. Questo processo di convalida agisce come un cancello di qualità, impedendo agli asset non conformi di essere distribuiti in ambienti di produzione o di stage.

La raccolta delle prove è un aspetto essenziale dell'architettura di riferimento DevSecOps:

  • La pipeline CI raccoglie le evidenze per tutte le scansioni o i passaggi eseguiti sugli asset
  • La pipeline CD distribuisce gli asset prodotti dalla pipeline CI
  • La pipeline CC analizza gli asset distribuiti dalla pipeline CD

La convalida delle prove supporta due modalità di funzionamento:

  1. Utilizzo della modalità di gating predefinita
  2. Utilizzo di un file di configurazione

Modalità di gating predefinita

Per impostazione predefinita, la distribuzione è bloccata se una prova si trova in uno dei seguenti stati:

  • In attesa- La raccolta delle prove è in corso
  • Fallimento- La raccolta delle prove non è andata a buon fine o il controllo di conformità non è stato superato

Questa modalità prevede un controllo rigoroso per garantire che tutte le prove raccolte siano in uno stato di successo prima di procedere alla distribuzione.

Modalità file di configurazione

La modalità file di configurazione fornisce un quadro flessibile e personalizzabile per la convalida delle prove attraverso un file di configurazione dedicato. Questa modalità consente di:

  • Definire requisiti di prova specifici per ambiente (dev, stage, prod)
  • Impostare i livelli di dichiarazione delle prove per controllare il comportamento della distribuzione:
    • recommended
    • required
    • required_if_present
  • Configurare regole di convalida diverse per i vari tipi di risorse (come immagini, commit o artefatti)
  • Controllare il modo in cui le prove provenienti da ambienti multipli vengono valutate durante la promozione

Ora la modalità file di configurazione supporta anche la valutazione tramite le policy OPA (Open Policy Agent). Per ulteriori informazioni, consultare la sezione " Controllo delle fasi di distribuzione tramite OPA ".

Comprendere i livelli di dichiarazione delle prove

1. Modalità consigliata:

Quando i controlli di conformità sono contrassegnati come "raccomandati", servono come avvertimenti piuttosto che come blocchi. Questo significa che:

  • L'esecuzione della pipeline continua anche quando i controlli falliscono
  • La pipeline fornisce visibilità sullo stato di conformità, ma non impone il fallimento automatico
  • Siete responsabili dell'investigazione e della risoluzione di tutti i problemi segnalati
  • Tutti i controlli di conformità mancanti o insufficienti devono essere affrontati e risolti durante il processo di CI

Questo approccio enfatizza un modello di responsabilità condivisa: la pipeline fornisce visibilità e raccomandazioni sulla conformità, ma i team devono assicurarsi attivamente che i loro processi di CI generino le prove richieste e risolvano eventuali lacune prima della distribuzione in produzione.

2. Modalità richiesta:

Le prove devono essere presenti nello stato success. La distribuzione è bloccata se la prova è mancante, in sospeso o fallita.

3. Richiesto se la modalità è presente:

Le prove devono essere in success stato, se esistono. Questa modalità:

  • Fallisce solo se lo stato delle prove è failure
  • Passa se le prove sono success, pending, o missing
  • Utile per le scansioni opzionali che devono passare quando vengono eseguite

Aggregazione delle prove

L'aggregazione delle prove è il processo di raccolta e valutazione delle prove di conformità in più ambienti di servizio (dev, stage, prod) per determinare la conformità complessiva a livello di applicazione. Durante l'esecuzione della pipeline CI/CD, vari strumenti di conformità raccolgono prove per diversi tipi di risorse (immagini, commit, artefatti). Le prove vengono monitorate separatamente per ogni ambiente di servizio e il sistema aggrega i risultati in base alle regole definite nel file di configurazione. Lo stato di conformità generale viene determinato valutando tutte le prove raccolte rispetto ai requisiti configurati.

Vantaggi chiave:

  • Convalida specifica per l'ambiente: Ambienti diversi possono avere requisiti di prova diversi (ad esempio, uno stadio può richiedere meno controlli di un prod)
  • Configurazione flessibile: Personalizzare i tipi di prove necessarie, consigliate o condizionate per ogni ambiente
  • Gating di promozione: Bloccare le distribuzioni in produzione se le prove richieste mancano o sono fallite negli ambienti precedenti
  • Traccia di controllo: Mantenere la cronologia completa delle prove in tutti gli ambienti per i rapporti di conformità

Il diagramma seguente illustra come le prove fluiscono attraverso gli ambienti e come l'aggregazione determina la prontezza di impiego:

aggregazione delle evidenze
Aggregazione delle evidenze e gating tra gli ambienti

Sezioni del file di configurazione

Controlli preliminari allo schieramento:

  • Convalidare le prove prodotte dalla pipeline CI
  • L'implementazione del gate si basa su questi controlli
  • Approvazione automatica della richiesta di modifica se tutti i controlli sono stati superati
  • Bloccare il deployment se i controlli falliscono (tranne che per le richieste di modifica di emergency )
  • Aggiungere il file di configurazione come parte della richiesta di modifica

Controlli post-dispiegamento:

  • Convalidare le prove prodotte dalla pipeline di CD
  • Valutare la pipeline in base a questi controlli

Struttura delle regole del file di configurazione

Il file di configurazione utilizza la seguente struttura JSON per definire le regole di validazione. Ogni tipo di prova può avere più regole in base ai tipi di asset e agli ambienti:

Struttura:

  • ID del tipo di prova- Esempio: com.ibm.static-scan
    • regole
    • Tipo di attività- Esempi: image, commit, artifact
    • ambienti_di_fonte- Dove ha origine la prova
      • name- Nome dell'ambiente (ad esempio, ci-pipeline, stage, prod)
      • regione- Area geografica (facoltativo)
    • ambienti_di_target- Dove le prove vengono convalidate
      • nome- Nome dell'ambiente (ad esempio, stage, prod)
      • regione- Area geografica (facoltativo)
    • required- Le prove devono essere presenti nello stato success ; blocca l'installazione se manca, è in attesa o non è riuscita
      • Strumento- Tipo di strumento per la raccolta delle prove (ad esempio, SonarQube, owasp-zap, *)
    • required_if_present- L'evidenza deve essere nello stato success se esiste; fallisce solo con lo stato failure ; passa se success, pending, o missing
      • Strumento- Tipo di strumento per la raccolta delle prove (ad esempio, SonarQube, owasp-zap, *)
    • consigliato- La pipeline registra gli avvisi se le prove sono mancanti, in sospeso o fallite; non blocca la distribuzione
      • Strumento- Tipo di strumento per la raccolta delle prove (ad esempio, SonarQube, owasp-zap, *)

Le prove raccolte nella pipeline CI devono avere il campo origine impostato su ci-pipeline nel file di configurazione.

Per spiegazioni dettagliate sui livelli di dichiarazione delle prove (required, required_if_present, recommended), vedere la sezione Modalità del file di configurazione.

Convalida delle prove tramite file di configurazione

Per implementare la modalità file di configurazione nella vostra catena di strumenti, seguite i seguenti passi di configurazione:

Passo 1: attivare la convalida delle prove

Nelle proprietà dell'ambiente delle pipeline CD e CC, impostare la seguente variabile per abilitare la funzione di convalida delle prove nelle pipeline di distribuzione:

opt-in-evidence-checks=1

Passo 2: Configurare il percorso del file di convalida

Impostate il percorso del vostro file di configurazione in pipeline-config-repo:

evidence-checks-config-path=validation.json

Se evidence-checks-config-path non è definito, il sistema cerca automaticamente un file con il nome <region>.<target>.validation.json, <target>.validation.json, o validation.json nella cartella pipeline-config-repo.

Fase 3: Verifica della configurazione

Una volta che la pipeline è in esecuzione, verificare che la convalida delle prove basata sul file di configurazione sia abilitata seguendo questi passaggi:

  1. Pipeline di accesso: consente di accedere alla pipeline di CD specifica associata alla modifica
  2. Individua attività- Individuare l'attività denominata prod-change-request e selezionare il passo change-request
  3. Tabelle di revisione- Individuate due tabelle critiche cercando queste parole chiave:
    • Tabella dell'ambito delle attività: Ricerca di Current pipeline scope (prima tabella)
    • Tabella di controllo delle prove: Ricerca di PRE-DEPLOYMENT (seconda tabella)

Se si vedono queste tabelle, si conferma che la convalida delle prove basata sul file di configurazione è abilitata.

Nota: la valutazione della pipeline avviene anche quando il controllo è abilitato in entrambe le pipeline CD e CC, utilizzando il file di configurazione.

Varie topologie di distribuzione

I seguenti esempi dimostrano come funziona la convalida delle prove in diverse topologie di distribuzione. Ogni topologia mostra come le prove raccolte in un ambiente vengono convalidate quando si passa agli ambienti successivi.

Ambienti di servizio:

  • master o dev- Sviluppo
  • stage- Pre-produzione (supportata di recente)
  • prod- Produzione

Promozione da master a prod

da master a prod Promozione {: caption="Caso d'uso 1. Promozione da master A prod " lato-didascalia="fondo"}

Immobili a Manual Promotion Trigger e Manual CD Trigger

Nome valore
source-environment master
target-environment prod
target-environment-purpose production

Esempio di regola di configurazione:

{
  "evidence_type_id": "com.ibm.acceptance_tests",
  "rules": [
    {
      "asset_type": "image",
      "source_environments": [
        {
          "name": "ci-pipeline"
        }
      ],
      "target_environments": [
        {
          "name": "prod"
        }
      ],
      "required": [],
      "required_if_present": [
        {
          "name": "tool",
          "values": [
            "*"
          ],
          "description": "Acceptance tests must pass if they are run"
        }
      ],
      "recommended": []
    }
  ]
}

Promozione da master a stage e poi a prod

da master a prod Promotion{: caption="Caso d'uso 2. Promozione da master A stage A prod " lato-didascalia="fondo"}

Proprietà relative agli ambienti " Manual Promotion Trigger " e " Manual CD Trigger " stage

Nome valore
source-environment master
target-environment stage
target-environment-purpose pre_prod

Proprietà relative agli ambienti " Manual Promotion Trigger " e " Manual CD Trigger " prod

Nome valore
source-environment stage
target-environment prod
target-environment-purpose production

Esempio di regola di configurazione:

{
  "evidence_type_id": "com.ibm.acceptance_tests",
  "rules": [
    {
      "asset_type": "image",
      "source_environments": [
        {
          "name": "ci-pipeline"
        },
        {
          "name": "stage"
        }
      ],
      "target_environments": [
        {
          "name": "stage"
        },
        {
          "name": "prod"
        }
      ],
      "required": [],
      "required_if_present": [
        {
          "name": "tool",
          "values": [
            "*"
          ],
          "description": "Acceptance tests must pass if they are run"
        }
      ],
      "recommended": []
    }
  ]
}

Promozione da master a stage(us-east) a stage(us-south) e poi a prod(us-south)

da master a prod Promozione {: caption="Caso d'uso 3. Promozione da master A stage(us-east) A stage(us-south) e poi a prod(us-south) " lato-didascalia="fondo"}

Proprietà relative agli ambienti " Manual Promotion Trigger " e " Manual CD Trigger " stage(us-east)

Nome valore
source-environment master
target-environment stage
target-environment-purpose pre_prod
region us-east

Proprietà relative agli ambienti " Manual Promotion Trigger " e " Manual CD Trigger " stage(us-south)

Nome valore
source-environment master
target-environment stage
target-environment-purpose pre_prod
region us-south

Proprietà relative agli ambienti " Manual Promotion Trigger " e " Manual CD Trigger " prod(us-south)

Nome valore
source-environment master
target-environment stage
target-environment-purpose production
region us-south
source-regions us-south

Esempio di regola di configurazione:

{
  "evidence_type_id": "com.ibm.acceptance_tests",
  "rules": [
    {
      "asset_type": "image",
      "source_environments": [
        {
          "name": "ci-pipeline"
        },
        {
          "name": "stage",
          "region": "us-south"
        }
      ],
      "target_environments": [
        {
          "name": "stage",
          "region": "us-south"
        },
        {
          "name": "stage",
          "region": "us-east"
        },
        {
          "name": "prod",
          "region": "us-south"
        }
      ],
      "required": [],
      "required_if_present": [
        {
          "name": "tool",
          "values": [
            "*"
          ],
          "description": "Acceptance tests must pass if they are run"
        }
      ],
      "recommended": []
    }
  ]
}

Valori predefiniti dell'utensile per le fasi di DevSecOps

Tipi diversi di risorse (come immagini di container, commit di codice sorgente o artefatti di distribuzione) richiedono tipi diversi di prove. Il file di configurazione consente di specificare quali tipi di prove devono essere raccolte per ogni tipo di asset e il sistema convalida che le prove appropriate siano state raccolte dagli strumenti corrispondenti.

ID tipo di prova Strumento supportato predefinito Tipo di risorsa utente
com.ibm.branch_protection cocoa-branch-protection repo (commit)
com.ibm.unit_tests jest repo (commit)
com.ibm.detect_secrets detect-secrets repo (commit)
com.ibm.code_vulnerability_scan Per le applicazioni: cra-tf, cra, mend
Per IaC: tfsec, checkov
repo (commit)
com.ibm.code_bom_check cra-bom, mend-bom repo (commit)
com.ibm.code_cis_check cra-cis repo (commit)
com.ibm.peer_review peer-review repo (commit)
com.ibm.static_scan Per le applicazioni: sonarqube, gosec
Per IaC: terraform-fmt, terraform-validate, tflint
repo (commit)
com.ibm.cloud.image_signing artifact-signing Artefatto (immagine)
com.ibm.acceptance_tests jest Artefatto (timone, immagine o carta)
com.ibm.dynamic_scan owasp-zap, owasp-zap-ui Artefatto (immagine)
com.ibm.cloud.image_vulnerability_scan va, sysdig, xray Risorsa
com.ibm.prod_change_request gitlab Artefatto (timone, immagine o carta)
com.ibm.close_change_request gitlab Artefatto (timone, immagine o carta)

| com.ibm.cloud.slsa | tekton-chains | Artefatto (timone, immagine o carta) |

Domande frequenti (FAQ - Frequently Asked Questions)

La mia installazione è bloccata: come posso scoprirne il motivo?

Se l'installazione è bloccata, seguite questi passaggi per identificare il problema:

  1. Pipeline di accesso: consente di accedere alla pipeline di CD specifica associata alla modifica
  2. Individua attività- Individuare l'attività denominata prod-change-request e selezionare il passo change-request
  3. Tabelle di revisione- Individuate due tabelle critiche cercando queste parole chiave:
    • Tabella dell'ambito delle attività: Ricerca di Current pipeline scope (prima tabella)
    • Tabella di controllo delle prove: Ricerca di PRE-DEPLOYMENT (seconda tabella)

La Tabella di controllo delle prove mostra quali elementi di prova sono missing o failed, causando il blocco dell'implementazione.

Comprendere la tabella di controllo delle prove

La Tabella di controllo delle prove visualizza lo stato di convalida delle prove per ogni asset. La comprensione della sua struttura aiuta a risolvere i problemi di conformità.

Struttura della tabella delle attività:

  • Colonna ID: Chiave primaria che identifica ogni asset
  • Full_id: Id completo della risorsa.
  • tipo: Tipo di bene
  • Colonna URI: L'asset effettivo (immagine, artefatto, ecc.) che viene convalidato
  • Relazione: L'ID del bene funge da chiave esterna (AssetId) nella tabella di controllo delle prove

Uscita del comando di controllo delle prove dell'armadietto del cacao
Asset Tabella

Struttura della tabella di controllo delle prove:

  • AssetId Colonna: chiave esterna che identifica ogni asset
  • EvidenceTypeId: Specifica quale prova di conformità è richiesta (ad esempio, scansione delle vulnerabilità, test unitari, revisione tra pari)
  • Origine delle prove: indica la provenienza delle prove (tipicamente ci-pipeline)
  • Stato: Mostra se la prova è presente, mancante o fallita per ogni asset

output del comando di controllo delle evidenze dell'armadietto del cacao
Controllo delle evidenze Tabella

Struttura della tabella riassuntiva delle prove:

Questa tabella visualizza il riepilogo delle prove di conformità per tutti gli asset e mostra quanti elementi di prova sono mancanti, riusciti, falliti o in sospeso.

Output del riassunto delle evidenze
Tabella riassuntiva delle evidenze

Come si risolvono le prove mancanti o fallite?

Una volta identificate le prove mancanti o fallite dalla Tabella di controllo delle prove, utilizzare questo albero decisionale per risolvere il problema. Si noti il tipo di prova specifica (ad esempio, com.ibm.static_scan) e il tipo di attività (ad esempio, image, commit).

Domanda: "Ho configurato la mia pipeline CI per raccogliere [il tipo di prova] per il [tipo di asset]?"

Se NO (non l'avete raccolto):

  • Chiedete: "Si tratta di un requisito di conformità valido per il mio servizio?"
    • Sì, è valido: Implementate la raccolta di prove nella vostra pipeline di CI
    • Aggiungere gli strumenti di scansione o gli script necessari
    • Configurare i corretti meccanismi di segnalazione delle prove
    • Assicurarsi che le prove siano collegate all'asset corretto
    • Per i dettagli sull'implementazione, consultare la Guida alla raccolta delle evidenze patrimoniali
    • NO, non è applicabile: Documentare la giustificazione e procedere all'escalation
    • Contattare il punto di riferimento per la sicurezza
    • Spiegare perché questo controllo non si applica al vostro servizio
    • Fornire una chiara giustificazione
    • Rimuovere il controllo dal file di configurazione dopo l'approvazione

Se SÌ (avete già raccolto questa prova in precedenza):

  • Indagare sul motivo per cui viene visualizzato come mancante nella Tabella di controllo delle prove
  • Potenziali problemi da controllare:
    • Le prove vengono generate correttamente nella vostra pipeline CI?
    • Viene segnalato alla posizione corretta?
    • L'ID dell'asset è collegato correttamente alla prova?
    • Ci sono problemi di tempistica o di sincronizzazione tra le pipeline CI e CD?
    • Il formato delle prove è compatibile con i requisiti di validazione?
    • Controllare i log della pipeline per verificare la presenza di messaggi di errore relativi alla raccolta delle prove o al reporting

Riferimenti

File di configurazione di esempio

{
  "version": "2.0",
  "pre-deployment": [
    {
      "evidence_type_id": "com.ibm.prod_change_request",
      "rules": [
        {
          "asset_type": "image",
          "source_environments": [
            {
              "name": "stage"
            }
          ],
          "target_environments": [
            {
              "name": "stage"
            },
            {
              "name": "prod"
            }
          ],
          "required": [],
          "required_if_present": [
            {
              "name": "tool",
              "values": [
                "*"
              ],
              "description": "Change request must be successful if present"
            }
          ],
          "recommended": []
        }
      ]
    },
    {
      "evidence_type_id": "com.ibm.acceptance_tests",
      "rules": [
        {
          "asset_type": "commit",
          "source_environments": [
            {
              "name": "ci-pipeline"
            },
            {
              "name": "stage"
            },
            {
              "name": "prod"
            }
          ],
          "target_environments": [
            {
              "name": "stage"
            },
            {
              "name": "prod"
            }
          ],
          "required": [],
          "required_if_present": [
            {
              "name": "tool",
              "values": [
                "*"
              ],
              "description": "Acceptance tests must pass if they are run"
            }
          ],
          "recommended": []
        },
        {
          "asset_type": "image",
          "source_environments": [
            {
              "name": "ci-pipeline"
            }
          ],
          "target_environments": [
            {
              "name": "stage"
            },
            {
              "name": "prod"
            }
          ],
          "required": [],
          "required_if_present": [
            {
              "name": "tool",
              "values": [
                "*"
              ],
              "description": "Acceptance tests must pass if they are run"
            }
          ],
          "recommended": []
        }
      ]
    },
    {
      "evidence_type_id": "com.ibm.branch_protection",
      "rules": [
        {
          "asset_type": "commit",
          "source_environments": [
            {
              "name": "ci-pipeline"
            }
          ],
          "target_environments": [
            {
              "name": "stage"
            },
            {
              "name": "prod"
            }
          ],
          "required": [],
          "required_if_present": [
            {
              "name": "tool",
              "values": [
                "*"
              ],
              "description": "Branch protection must be successful if present"
            }
          ],
          "recommended": []
        }
      ]
    },
    {
      "evidence_type_id": "com.ibm.cloud.slsa",
      "rules": [
        {
          "asset_type": "image",
          "source_environments": [
            {
              "name": "ci-pipeline"
            }
          ],
          "target_environments": [
            {
              "name": "stage"
            },
            {
              "name": "prod"
            }
          ],
          "required": [],
          "required_if_present": [
            {
              "name": "tool",
              "values": [
                "*"
              ],
              "description": "SLSA attestation must be successful if present"
            }
          ],
          "recommended": []
        }
      ]
    },
    {
      "evidence_type_id": "com.ibm.dynamic_scan",
      "rules": [
        {
          "asset_type": "image",
          "source_environments": [
            {
              "name": "ci-pipeline"
            }
          ],
          "target_environments": [
            {
              "name": "stage"
            },
            {
              "name": "prod"
            }
          ],
          "required": [],
          "required_if_present": [
            {
              "name": "tool",
              "values": [
                "owasp-zap"
              ],
              "description": "Dynamic scan must pass if OWASP ZAP is run"
            }
          ],
          "recommended": [
            {
              "name": "tool",
              "values": [
                "*"
              ],
              "description": "Other dynamic scan tools are recommended"
            }
          ]
        }
      ]
    },
    {
      "evidence_type_id": "com.ibm.cloud.verify_signature",
      "rules": [
        {
          "asset_type": "image",
          "source_environments": [
            {
              "name": "stage"
            },
            {
              "name": "prod"
            }
          ],
          "target_environments": [
            {
              "name": "stage"
            },
            {
              "name": "prod"
            }
          ],
          "required": [],
          "required_if_present": [
            {
              "name": "tool",
              "values": [
                "*"
              ],
              "description": "Signature verification must pass if present"
            }
          ],
          "recommended": []
        }
      ]
    },
    {
      "evidence_type_id": "com.ibm.cloud.image_vulnerability_scan",
      "rules": [
        {
          "asset_type": "image",
          "source_environments": [
            {
              "name": "ci-pipeline"
            }
          ],
          "target_environments": [
            {
              "name": "stage"
            },
            {
              "name": "prod"
            }
          ],
          "required": [],
          "required_if_present": [
            {
              "name": "tool",
              "values": [
                "*"
              ],
              "description": "Image vulnerability scan must pass if run"
            }
          ],
          "recommended": []
        }
      ]
    },
    {
      "evidence_type_id": "com.ibm.peer_review",
      "rules": [
        {
          "asset_type": "commit",
          "source_environments": [
            {
              "name": "stage"
            },
            {
              "name": "prod"
            }
          ],
          "target_environments": [
            {
              "name": "stage"
            },
            {
              "name": "prod"
            }
          ],
          "required": [],
          "required_if_present": [
            {
              "name": "tool",
              "values": [
                "*"
              ],
              "description": "Peer review must be successful if present"
            }
          ],
          "recommended": []
        }
      ]
    },
    {
      "evidence_type_id": "com.ibm.unit_tests",
      "rules": [
        {
          "asset_type": "commit",
          "source_environments": [
            {
              "name": "ci-pipeline"
            }
          ],
          "target_environments": [
            {
              "name": "stage"
            },
            {
              "name": "prod"
            }
          ],
          "required": [],
          "required_if_present": [
            {
              "name": "tool",
              "values": [
                "*"
              ],
              "description": "Unit tests must pass if they are run"
            }
          ],
          "recommended": []
        }
      ]
    },
    {
      "evidence_type_id": "com.ibm.static_scan",
      "rules": [
        {
          "asset_type": "commit",
          "source_environments": [
            {
              "name": "ci-pipeline"
            }
          ],
          "target_environments": [
            {
              "name": "stage"
            },
            {
              "name": "prod"
            }
          ],
          "required": [],
          "required_if_present": [
            {
              "name": "tool",
              "values": [
                "*"
              ],
              "description": "Static scan must pass if run"
            }
          ],
          "recommended": []
        }
      ]
    },
    {
      "evidence_type_id": "com.ibm.detect_secrets",
      "rules": [
        {
          "asset_type": "commit",
          "source_environments": [
            {
              "name": "ci-pipeline"
            }
          ],
          "target_environments": [
            {
              "name": "stage"
            },
            {
              "name": "prod"
            }
          ],
          "required": [],
          "required_if_present": [
            {
              "name": "tool",
              "values": [
                "*"
              ],
              "description": "Detect secrets scan must pass if run"
            }
          ],
          "recommended": []
        }
      ]
    },
    {
      "evidence_type_id": "com.ibm.code_vulnerability_scan",
      "rules": [
        {
          "asset_type": "commit",
          "source_environments": [
            {
              "name": "ci-pipeline"
            }
          ],
          "target_environments": [
            {
              "name": "stage"
            },
            {
              "name": "prod"
            }
          ],
          "required": [],
          "required_if_present": [
            {
              "name": "tool",
              "values": [
                "*"
              ],
              "description": "Code vulnerability scan must pass if run"
            }
          ],
          "recommended": []
        }
      ]
    },
    {
      "evidence_type_id": "com.ibm.code_cis_check",
      "rules": [
        {
          "asset_type": "commit",
          "source_environments": [
            {
              "name": "ci-pipeline"
            }
          ],
          "target_environments": [
            {
              "name": "stage"
            },
            {
              "name": "prod"
            }
          ],
          "required": [],
          "required_if_present": [
            {
              "name": "tool",
              "values": [
                "*"
              ],
              "description": "CIS check must pass if run"
            }
          ],
          "recommended": []
        }
      ]
    },
    {
      "evidence_type_id": "com.ibm.code_bom_check",
      "rules": [
        {
          "asset_type": "commit",
          "source_environments": [
            {
              "name": "ci-pipeline"
            }
          ],
          "target_environments": [
            {
              "name": "stage"
            },
            {
              "name": "prod"
            }
          ],
          "required": [],
          "required_if_present": [
            {
              "name": "tool",
              "values": [
                "*"
              ],
              "description": "BOM check must pass if run"
            }
          ],
          "recommended": []
        }
      ]
    },
    {
      "evidence_type_id": "com.ibm.network_compliance",
      "rules": [
        {
          "asset_type": "commit",
          "source_environments": [
            {
              "name": "ci-pipeline"
            }
          ],
          "target_environments": [
            {
              "name": "stage"
            },
            {
              "name": "prod"
            }
          ],
          "required": [],
          "required_if_present": [
            {
              "name": "tool",
              "values": [
                "*"
              ],
              "description": "Network compliance check must pass if run"
            }
          ],
          "recommended": []
        }
      ]
    },
    {
      "evidence_type_id": "com.ibm.pipeline_run_data",
      "rules": [
        {
          "asset_type": "generic",
          "source_environments": [
            {
              "name": "ci-pipeline"
            }
          ],
          "target_environments": [
            {
              "name": "stage"
            },
            {
              "name": "prod"
            }
          ],
          "required": [],
          "required_if_present": [
            {
              "name": "tool",
              "values": [
                "*"
              ],
              "description": "Pipeline run data must be successful if present"
            }
          ],
          "recommended": []
        }
      ]
    },
    {
      "evidence_type_id": "com.ibm.pipeline_logs",
      "rules": [
        {
          "asset_type": "generic",
          "source_environments": [
            {
              "name": "ci-pipeline"
            }
          ],
          "target_environments": [
            {
              "name": "stage"
            },
            {
              "name": "prod"
            }
          ],
          "required": [],
          "required_if_present": [
            {
              "name": "tool",
              "values": [
                "*"
              ],
              "description": "Pipeline logs must be successful if present"
            }
          ],
          "recommended": []
        }
      ]
    }
  ],
  "post-deployment": [
    {
      "evidence_type_id": "com.ibm.prod_change_request",
      "rules": [
        {
          "asset_type": "image",
          "source_environments": [
            {
              "name": "stage"
            }
          ],
          "target_environments": [
            {
              "name": "stage"
            },
            {
              "name": "prod"
            }
          ],
          "required": [],
          "required_if_present": [
            {
              "name": "tool",
              "values": [
                "*"
              ],
              "description": "Change request must be successful if present"
            }
          ],
          "recommended": []
        }
      ]
    },
    {
      "evidence_type_id": "com.ibm.acceptance_tests",
      "rules": [
        {
          "asset_type": "commit",
          "source_environments": [
            {
              "name": "stage"
            },
            {
              "name": "prod"
            }
          ],
          "target_environments": [
            {
              "name": "stage"
            },
            {
              "name": "prod"
            }
          ],
          "required": [],
          "required_if_present": [
            {
              "name": "tool",
              "values": [
                "*"
              ],
              "description": "Acceptance tests must pass if they are run"
            }
          ],
          "recommended": []
        },
        {
          "asset_type": "image",
          "source_environments": [
            {
              "name": "stage"
            },
            {
              "name": "prod"
            }
          ],
          "target_environments": [
            {
              "name": "stage"
            },
            {
              "name": "prod"
            }
          ],
          "required": [],
          "required_if_present": [
            {
              "name": "tool",
              "values": [
                "*"
              ],
              "description": "Acceptance tests must pass if they are run"
            }
          ],
          "recommended": []
        }
      ]
    },
    {
      "evidence_type_id": "com.ibm.pipeline_run_data",
      "rules": [
        {
          "asset_type": "generic",
          "source_environments": [
            {
              "name": "stage"
            },
            {
              "name": "prod"
            }
          ],
          "target_environments": [
            {
              "name": "stage"
            },
            {
              "name": "prod"
            }
          ],
          "required": [],
          "required_if_present": [
            {
              "name": "tool",
              "values": [
                "*"
              ],
              "description": "Pipeline run data must be successful if present"
            }
          ],
          "recommended": []
        }
      ]
    },
    {
      "evidence_type_id": "com.ibm.pipeline_logs",
      "rules": [
        {
          "asset_type": "generic",
          "source_environments": [
            {
              "name": "stage"
            },
            {
              "name": "prod"
            }
          ],
          "target_environments": [
            {
              "name": "stage"
            },
            {
              "name": "prod"
            }
          ],
          "required": [],
          "required_if_present": [
            {
              "name": "tool",
              "values": [
                "*"
              ],
              "description": "Pipeline logs must be successful if present"
            }
          ],
          "recommended": []
        }
      ]
    }
  ]
}