証拠の検証

DevSecOps アーキテクチャでは、CIパイプラインで収集されたエビデンスは、アセットがコンプライアンス要件を満たしていることを保証するために、デプロイ前に検証されなければならない。 この検証プロセスは、品質ゲートとして機能し、非準拠の資産がステージや本番環境に配備されるのを防ぐ。

エビデンスの収集は、 DevSecOps 参照アーキテクチャの不可欠な側面である:

  • CIパイプラインは、資産に対して実行されたすべてのスキャンまたはステップのエビデンスを収集する
  • CDパイプラインは、CIパイプラインによって生成されたアセットをデプロイする
  • CCパイプラインは、CDパイプラインによって展開された資産をスキャンする

エビデンスの検証は、2つの動作モードをサポートしている:

  1. デフォルト・ゲーティング・モードの使用
  2. 構成ファイルの使用

デフォルト・ゲーティング・モード

デフォルトでは、エビデンスが以下のいずれかの状態にある場合、デプロイはブロックされる:

  • 保留- 証拠収集中
  • 失敗- 証拠収集に失敗した、またはコンプライアンス検査に合格しなかった

このモードは、配備を進める前に、収集されたすべての証拠が成功状態にあることを確実にするために、厳格なゲーティングを提供する。

設定ファイルモード

設定ファイル・モードは、専用の設定ファイルを通じて、証拠検証のための柔軟でカスタマイズ可能なフレームワークを提供します。 このモードでは、以下の操作が可能です:

  • 環境(開発、ステージ、プロッド)ごとに特定のエビデンス要件を定義する
  • エビデンス宣言レベルを設定し、配備の動作を制御する:
    • recommended
    • required
    • required_if_present
  • アセットタイプ(イメージ、コミット、成果物など)ごとに異なる検証ルールを設定する
  • 昇格時に複数の環境からのエビデンスがどのように評価されるかをコントロールする

これで、設定ファイルモードでも OPA(Open Policy Agent)ポリシーを用いた評価がサポートされるようになりました。 詳細については、「 OPA を使用したデプロイメント・ゲーティング 」を参照してください。

エビデンス宣言レベルの理解

1.推奨モード:

コンプライアンス・チェックが「推奨」とマークされている場合、それはブロッカーではなく、警告の役割を果たす。 これは、次のことを意味します:

  • チェックに失敗してもパイプラインの実行は継続される
  • パイプラインはコンプライアンス状況を可視化するが、自動的な失敗を強制することはない
  • フラグが付けられたすべての問題を調査し、解決する責任があります
  • すべてのコンプライアンス・チェックの不合格または欠落は、CIプロセス中に対処し、修正されなければならない

このアプローチでは、 責任共有モデルを重視している。パイプラインはコンプライアンスの可視化と推奨を提供するが、チームはCIプロセスで必要なエビデンスが生成されることを積極的に確認し、本番導入前にギャップに対処しなければならない。

2.必須モード:

証拠は success。 証拠がない、保留中、または失敗した場合、配備はブロックされる。

3.モードがある場合は必須:

証拠が存在する場合は、 success。 このモードだ:

  • エビデンスステータスが failure
  • 証拠が success、 pending、または missing
  • 実行時にパスしなければならないオプションのスキャンに便利です

エビデンスの集約

エビデンスの集約とは、複数のサービス環境(開発、ステージ、プロダクション)にまたがるコンプライアンスエビデンスを収集、評価し、アプリケーションレベルのコンプライアンスを総合的に判断するプロセスである。 CI/CDパイプラインの実行中、さまざまなコンプライアンスツールが、さまざまなアセットタイプ(イメージ、コミット、成果物)のエビデンスを収集する。 証拠はサービス環境ごとに別々に追跡され、システムは設定ファイルで定義されたルールに基づいて結果を集計します。 全体的な遵守状況は、収集されたすべての証拠を設定された要件に照らして評価することによって決定される。

主なメリットは次のとおりです。

  • 環境固有のバリデーション :異なる環境は、異なるエビデンス要件を持ちうる(例えば、ステージはプロッドよりも少ないチェックを必要とするかもしれない)
  • 柔軟な構成 :環境ごとに、どのエビデンスタイプが必須、推奨、条件付きで必要かをカスタマイズできる
  • プロモーション・ゲーティング :以前の環境で必要な証拠がない、または失敗した場合、本番環境へのデプロイメントをブロックします
  • 監査証跡 :コンプライアンスレポートのために、すべての環境で完全な証拠履歴を維持します

次の図は、エビデンスがどのように環境を通じて流れ、どのように集約されるかが配備の即応性を決定することを示している:

エビデンスの集約
環境を超えたエビデンスの集約とゲーティング

設定ファイル セクション

配備前のチェック

  • CIパイプラインによって生成されたエビデンスを検証する
  • これらのチェックに基づくゲート展開
  • すべてのチェックに合格した場合、変更要求を自動承認する
  • チェックに失敗した場合、デプロイメントをブロックする( emergency の変更要求を除く)
  • 変更要求の一部としてコンフィグファイルを追加する

配備後のチェック:

  • CDパイプラインで作成されたエビデンスを検証する
  • これらのチェックに基づいてパイプラインを評価する

設定ファイルのルール構造

設定ファイルは、以下のJSON構造を使って検証ルールを定義する。 各エビデンスタイプは、アセットタイプと環境に基づく複数のルールを持つことができる:

構造:

  • 証拠タイプID- 例 com.ibm.static-scan
    • ルール
    • 資産タイプ- 例: image commit、 artifact
    • source_environments- 証拠の出所
      • name- 環境名(例: ci-pipeline、 stage、 prod )
      • 地域- 地理的地域(任意)
    • target_environments- エビデンスが検証される場所
      • name- 環境名(例: stage、 prod )
      • 地域- 地理的地域(任意)
    • required- エビデンスが success の状態で存在すること。不足、保留、失敗した場合はデプロイをブロックする
      • ツール- 証拠収集のためのツールタイプ(例: SonarQube、 owasp-zap、 * )
    • required_if_present- エビデンスが存在する場合、 success の状態でなければならない。 failure の状態でのみ失敗する。 success、 pending、または missing
      • ツール- 証拠収集のためのツールタイプ(例: SonarQube、 owasp-zap、 * )
    • 推奨- エビデンスが見つからない/保留中/失敗した場合、パイプラインは警告をログに記録する
      • ツール- 証拠収集のためのツールタイプ(例: SonarQube、 owasp-zap、 * )

CIパイプラインで収集された証拠は、設定ファイルでそのオリジンフィールドを ci-pipeline。

エビデンス宣言レベル(required、required_if_present、recommended)の詳細説明については、 設定ファイルモードの セクションを参照のこと。

設定ファイルによる証拠検証

ツールチェインにコンフィギュレーション・ファイル・モードを実装するには、以下の設定ステップに従ってください:

ステップ1:エビデンスの検証を有効にする

CDおよびCCパイプライン環境のプロパティで以下の変数を設定し、デプロイメント・パイプラインでエビデンス検証機能を有効にします:

opt-in-evidence-checks=1

ステップ2:検証ファイルパスの設定

pipeline-config-repo に設定ファイルへのパスを設定する:

evidence-checks-config-path=validation.json

evidence-checks-config-path が定義されていない場合、システムは自動的に <region>.<target>.validation.json、 <target>.validation.json、または validation.json という名前のファイルを pipeline-config-repo の中から探す。

ステップ 3: 設定の確認

パイプラインが実行されたら、以下の手順に従って、設定ファイルに基づくエビデンス検証が有効になっていることを確認する:

  1. アクセスパイプライン- 変更に関連する特定のCDパイプラインの実行に移動します
  2. Locate Task- prod-change-request というラベルのタスクを見つけ、 change-request のステップを選択する
  3. 表を見直す- これらのキーワードで検索して、2つの重要な表を見つける:
    • 資産スコープ表 : Current pipeline scope を検索(最初のテーブル)
    • エビデンスチェック表 PRE-DEPLOYMENT を検索する(第2表)

これらの表が表示されていれば、設定ファイルに基づく証拠検証が有効になっていることが確認できる。

注: CDパイプラインとCCパイプラインの両方でチェックが有効になっている場合も、設定ファイルを利用してパイプライン評価が行われる。

さまざまな展開トポロジー

以下の例は、さまざまな配備トポロジーでエビデンスの検証がどのように機能するかを示している。 それぞれのトポロジーは、ある環境で収集された証拠が、後続の環境に昇格する際にどのように検証されるかを示している。

サービス環境:

  • master または dev- 開発
  • stage- プリプロダクション(最近サポートされた)
  • prod- 製造

master から prod

マスターからプロッドプロモーションへ {: caption="使用例1。 昇進 master に prod" キャプションサイド="下"}

** Manual Promotion Trigger および Manual CD Trigger**

名前 値
source-environment master
target-environment prod
target-environment-purpose production

設定ルールのサンプル:

{
  "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": []
    }
  ]
}

master から stage に昇格し、さらに以下のようになった。 prod

master to prod Promotion{: caption="使用例 2. 昇進 master に stage に prod" キャプションサイド="下"}

** Manual Promotion Trigger および 環境の特性 Manual CD Trigger stage**

名前 値
source-environment master
target-environment stage
target-environment-purpose pre_prod

** Manual Promotion Trigger および 環境の特性 Manual CD Trigger prod**

名前 値
source-environment stage
target-environment prod
target-environment-purpose production

設定ルールのサンプル:

{
  "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": []
    }
  ]
}

master 、 stage(us-east) 、 stage(us-south)。 prod(us-south)

マスターからプロッドプロモーションへ {: caption="ユースケース3。 昇進 master に stage(us-east) に stage(us-south) そして prod(us-south)" キャプションサイド="下"}

** Manual Promotion Trigger および 環境の特性 Manual CD Trigger stage(us-east)**

名前 値
source-environment master
target-environment stage
target-environment-purpose pre_prod
region us-east

** Manual Promotion Trigger および 環境の特性 Manual CD Trigger stage(us-south)**

名前 値
source-environment master
target-environment stage
target-environment-purpose pre_prod
region us-south

** Manual Promotion Trigger および 環境の特性 Manual CD Trigger prod(us-south)**

名前 値
source-environment master
target-environment stage
target-environment-purpose production
region us-south
source-regions us-south

設定ルールのサンプル:

{
  "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": []
    }
  ]
}

DevSecOps ステージのデフォルトツール値

アセットタイプ(コンテナイメージ、ソースコードコミット、デプロイメント成果物など)が異なれば、必要な証拠も異なる。 設定ファイルにより、各資産タイプについて収集しなければならない証拠タイプを指定することができ、システムは、適切な証拠が対応するツールによって収集されたことを検証します。

エビデンス・タイプ ID デフォルトでサポートされるツール 成果物タイプ
com.ibm.branch_protection cocoa-branch-protection レポ(コミット)
com.ibm.unit_tests jest レポ(コミット)
com.ibm.detect_secrets detect-secrets レポ(コミット)
com.ibm.code_vulnerability_scan アプリの場合: cra-tf, cra, mend
IaC: tfsec、 checkov
レポ(コミット)
com.ibm.code_bom_check cra-bom, mend-bom レポ(コミット)
com.ibm.code_cis_check cra-cis レポ(コミット)
com.ibm.peer_review peer-review レポ(コミット)
com.ibm.static_scan アプリの場合: sonarqube, gosec
IaC: の場合 terraform-fmt, terraform-validate、 tflint
レポ(コミット)
com.ibm.cloud.image_signing artifact-signing アーティファクト(イメージ)
com.ibm.acceptance_tests jest 人工物(ヘルム、画像、チャート)
com.ibm.dynamic_scan owasp-zap, owasp-zap-ui アーティファクト(イメージ)
com.ibm.cloud.image_vulnerability_scan va, sysdig, xray 成果物
com.ibm.prod_change_request gitlab 人工物(ヘルム、画像、チャート)
com.ibm.close_change_request gitlab 人工物(ヘルム、画像、チャート)

| com.ibm.cloud.slsa | tekton-chains |人工物(兜、画像、チャート)||||||

よくある質問

配備がブロックされています

配備がブロックされた場合は、次の手順に従って問題を特定してください:

  1. アクセスパイプライン- 変更に関連する特定のCDパイプラインの実行に移動します
  2. Locate Task- prod-change-request というラベルのタスクを見つけ、 change-request のステップを選択する
  3. 表を見直す- これらのキーワードで検索して、2つの重要な表を見つける:
    • 資産スコープ表 : Current pipeline scope を検索(最初のテーブル)
    • エビデンスチェック表 PRE-DEPLOYMENT を検索する(第2表)

エビデンスチェックテーブルは、どのエビデンスアイテムが missing または failed であるかを示し、配備がブロックされる原因となります。

エビデンスチェック表を理解する

エビデンス・チェック表には、各資産のエビデンスの検証状況が表示されます。 その構造を理解することは、コンプライアンス上の問題のトラブルシューティングに役立ちます。

資産テーブルの構造:

  • ID列 :各資産を識別する主キー
  • Full_id :完全なアセットID。
  • type: アセットの種類
  • URI列 :検証対象の実際のアセット(画像、アーティファクトなど
  • 関係 :アセットIDは、エビデンスチェックテーブルの外部キー(AssetId)として機能する

ココア・ロッカー証拠品チェック・コマンド出力
資産表

エビデンス・チェック・テーブルの構造:

  • AssetId 列 :各資産を識別する外部キー
  • EvidenceTypeId :どのコンプライアンス証拠が必要かを指定する(脆弱性スキャン、ユニットテスト、ピアレビューなど)
  • エビデンスの出所 :エビデンスの出所を示す(通常は ci-pipeline )
  • 状態 :各資産について、証拠が存在するか、存在しないか、または存在しないかを表示します

ココア・ロッカーのエビデンス・チェック・コマンド出力
エビデンス・チェック表

エビデンス総括表の構成:

この表は、全資産のコンプライアンス・エビデンス・サマリーを表示し、いくつのエビデンス項目が欠落、成功、失敗、または保留中であるかを示します。

エビデンスサマリー出力
エビデンスサマリー表

証拠の紛失や失敗を修正するには?

証拠チェック表から欠落または失敗した証拠を特定したら、このデシジョンツリーを使用して問題を解決する。 特定の証拠タイプ(例: com.ibm.static_scan )と資産タイプ(例: image、 commit )に注意。

質問 [「アセットタイプの] [エビデンスタイプを]収集するようにCIパイプラインを設定しましたか?

NOの場合(回収していない):

  • 質問してください:「これは私のサービスにとって有効なコンプライアンス要件ですか?
    • はい、有効です :CIパイプラインにエビデンス収集を導入する
    • 必要なスキャンツールやスクリプトを追加する
    • 適切な証拠報告メカニズムを設定する
    • 証拠が正しい資産にリンクされていることを確認する
    • 実施の詳細については、 「資産証拠収集ガイド」を 参照のこと
    • いいえ、該当しません :正当な理由を文書化し、エスカレーションする
    • セキュリティ担当者に連絡する
    • あなたのサービスにこのチェックが適用されない理由を説明してください
    • 明確な正当性を示す
    • 承認後、設定ファイルからチェックを削除する

YESの場合(以前にこの証拠を収集したことがある):

  • エビデンス・チェック表で欠番と表示されている理由を調査する
  • チェックすべき潜在的な問題
    • CIパイプラインでエビデンスが正しく生成されているか?
    • 正しい場所に報告されているか?
    • 資産IDは証拠に適切にリンクされているか?
    • CIパイプラインとCDパイプラインの間にタイミングや同期の問題はあるか?
    • エビデンス形式はバリデーション要件に適合しているか?
    • 証拠収集または報告に関連するエラーメッセージがないかパイプラインログをチェックする

リファレンス

サンプル設定ファイル

{
  "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": []
        }
      ]
    }
  ]
}