증거 유효성 검증

DevSecOps 아키텍처에서는 CI 파이프라인 중에 수집된 증거를 배포 전에 검증하여 자산이 규정 준수 요구 사항을 충족하는지 확인해야 합니다. 이 검증 프로세스는 품질 게이트 역할을 하여 규정을 준수하지 않는 에셋이 무대 또는 프로덕션 환경에 배포되는 것을 방지합니다.

증거 수집은 DevSecOps 참조 아키텍처의 필수적인 측면입니다:

  • CI 파이프라인은 자산에 대해 수행된 모든 스캔 또는 단계에 대한 증거를 수집합니다
  • CD 파이프라인은 CI 파이프라인에서 생성된 에셋을 배포합니다
  • CC 파이프라인은 CD 파이프라인으로 배포된 자산을 스캔합니다

증거 유효성 검사는 두 가지 작동 모드를 지원합니다:

  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- 증거의 출처
      • 이름- 환경 이름(예: ci-pipeline, stage, prod)
      • 지역- 지리적 지역 (선택 사항)
    • 대상_환경- 증거가 검증된 곳
      • 이름- 환경 이름(예: stage, prod)
      • 지역- 지리적 지역 (선택 사항)
    • 필수- 증거가 success 상태여야 하며, 누락, 보류 또는 실패한 경우 배포를 차단합니다
      • 도구- 증거 수집을 위한 도구 유형(예: SonarQube, owasp-zap, *)
    • required_if_present- 증거가 존재하면 success 상태여야 하며, failure 상태에서만 실패, success, pending, 또는 missing
      • 도구- 증거 수집을 위한 도구 유형(예: SonarQube, owasp-zap, *)
    • 권장- 증거가 누락/보류/실패한 경우 파이프라인에서 경고를 기록하지만 배포를 차단하지는 않습니다
      • 도구- 증거 수집을 위한 도구 유형(예: SonarQube, owasp-zap, *)

CI 파이프라인에서 수집된 증거는 구성 파일에서 원본 필드가 ci-pipeline 로 설정되어 있어야 합니다.

증거 선언 수준(필수, 필수_if_present, 권장)에 대한 자세한 설명은 구성 파일 모드 섹션을 참조하세요.

구성 파일을 사용한 증거 유효성 검사

툴체인에서 구성 파일 모드를 구현하려면 다음 구성 단계를 따르세요:

1단계: 증거 유효성 검사 활성화

CD 및 CC 파이프라인 환경 속성에서 다음 변수를 설정하여 배포 파이프라인에서 증거 유효성 검사 기능을 사용하도록 설정합니다:

opt-in-evidence-checks=1

2단계: 유효성 검사 파일 경로 구성하기

pipeline-config-repo 에서 구성 파일의 경로를 설정합니다:

evidence-checks-config-path=validation.json

evidence-checks-config-path 이 정의되지 않은 경우 시스템은 pipeline-config-repo 에서 <region>.<target>.validation.json, <target>.validation.json, 또는 validation.json 이라는 이름의 파일을 자동으로 검색합니다.

3단계: 구성 확인

파이프라인이 실행 중이면 다음 단계에 따라 구성 파일에 기반한 증거 유효성 검사가 활성화되어 있는지 확인합니다:

  1. 액세스 파이프라인- 변경 사항과 관련된 특정 CD 파이프라인 실행으로 이동합니다
  2. 작업 찾기- prod-change-request 레이블이 지정된 작업을 찾아 change-request 단계를 선택합니다
  3. 테이블 검토- 다음 키워드를 검색하여 중요한 테이블 두 개를 찾습니다:
    • 자산 범위 표: Current pipeline scope 검색(첫 번째 표)
    • 증거 확인 표: PRE-DEPLOYMENT 검색(두 번째 표)

이 표가 표시되면 구성 파일에 기반한 증거 유효성 검사가 사용 설정되어 있음을 확인합니다.

참고: 파이프라인 평가는 구성 파일을 활용하여 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

마스터에서 프로덕션으로 프로모션{: caption="사용 사례 2. 프로모션:master 에게 stage 에게 prod " caption-side="하단"}

** 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
repo(커밋)
com.ibm.code_bom_check cra-bom, mend-bom repo(커밋)
com.ibm.code_cis_check cra-cis repo(커밋)
com.ibm.peer_review peer-review repo(커밋)
com.ibm.static_scan 앱의 경우: sonarqube, gosec
IaC: terraform-fmt, terraform-validate, tflint
repo(커밋)
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 | 아티팩트(헬름, 이미지 또는 차트) |

자주 묻는 질문(FAQ)

배포가 차단되었는데 그 이유를 어떻게 알 수 있나요?

배포가 차단된 경우 다음 단계에 따라 문제를 파악하세요:

  1. 액세스 파이프라인- 변경 사항과 관련된 특정 CD 파이프라인 실행으로 이동합니다
  2. 작업 찾기- prod-change-request 레이블이 지정된 작업을 찾아 change-request 단계를 선택합니다
  3. 테이블 검토- 다음 키워드를 검색하여 중요한 테이블 두 개를 찾습니다:
    • 자산 범위 표: Current pipeline scope 검색(첫 번째 표)
    • 증거 확인 표: PRE-DEPLOYMENT 검색(두 번째 표)

증거 확인 표에는 어떤 증거 항목이 missing 또는 failed 으로 배포가 차단되는 원인이 되는지 나와 있습니다.

증거 확인 표 이해

증거 확인 표에는 각 자산에 대한 증거의 유효성 검사 상태가 표시됩니다. 구조를 이해하면 규정 준수 문제를 해결하는 데 도움이 됩니다.

자산 테이블 구조:

  • ID 열입니다: 각 자산을 식별하는 기본 키
  • Full_id: 전체 자산 ID입니다.
  • type: 자산의 유형
  • URI 열: 유효성 검사 중인 실제 자산(이미지, 아티팩트 등)
  • 관계: 자산 ID는 증거 확인 테이블에서 외래 키(AssetId)로 사용됩니다

코코아 락커 증거 확인 명령 출력
자산 테이블

증거 확인 테이블 구조:

  • AssetId 열: 각 자산을 식별하는 외래 키
  • 증거 유형 ID: 필요한 규정 준수 증거를 지정합니다(예: 취약성 검사, 단위 테스트, 동료 검토)
  • 증거 출처: 증거의 출처를 표시합니다(일반적으로 ci-pipeline)
  • 상태: 상태: 각 자산에 대한 증거의 존재, 누락 또는 실패 여부를 표시합니다

코코아 락커 증거 확인 명령 출력
증거 확인 표

증거 요약 테이블 구조:

이 표에는 모든 자산에 대한 규정 준수 증거 요약이 표시되며 누락, 성공, 실패 또는 보류 중인 증거 항목의 수가 표시됩니다.

증거 요약 출력
증거 요약 표

누락되거나 실패한 증거를 수정하려면 어떻게 해야 하나요?

증거 확인 표에서 누락되었거나 실패한 증거를 확인한 후에는 이 의사 결정 트리를 사용하여 문제를 해결하세요. 특정 증거 유형(예: com.ibm.static_scan)과 자산 유형(예: image, commit)에 유의하세요.

질문: " [자산 유형에] 대한 [증거 유형을] 수집하도록 CI 파이프라인을 구성했나요?"

아니요(수집하지 않은 경우):

  • 물어보세요: "이것이 내 서비스에 유효한 규정 준수 요건인가요?"
    • 예, 유효합니다: CI 파이프라인에서 증거 수집 구현하기
    • 필요한 스캔 도구 또는 스크립트 추가
    • 적절한 증거 보고 메커니즘 구성
    • 증거가 올바른 자산에 연결되어 있는지 확인
    • 구현에 대한 자세한 내용은 자산 증거 수집 가이드를 참조하세요
    • 아니요, 해당되지 않습니다: 정당성 문서화 및 에스컬레이션
    • 보안 담당자에게 문의
    • 이 점검이 서비스에 적용되지 않는 이유를 설명하세요
    • 명확한 정당성 제공
    • 승인 후 구성 파일에서 확인란을 제거합니다

예인 경우(이전에 이 증거를 수집한 적이 있는 경우):

  • 증거 확인 표에 누락된 것으로 표시되는 이유를 조사합니다
  • 확인해야 할 잠재적 문제:
    • 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": []
        }
      ]
    }
  ]
}