튜토리얼: SBOM 형식으로 의존성 디렉터리 내보내기

Tier: Ultimate Offering: GitLab.com, Self-Managed형, GitLab Dedicated

의존성 스캔 출력물은 CycloneDX JSON 형식으로 내보낼 수 있습니다.

이 튜토리얼에서는 파이프라인용 CycloneDX JSON SBOM을 생성한 다음 CI 작업 artifact로 업로드하는 방법을 보여줍니다.

시작하기 전에

의존성 스캐닝을 설정합니다. 자세한 지침은 의존성 스캐닝 튜토리얼을 참고하세요.

구성 파일 생성

  1. api 범위와 Developer 역할을 가진 개인 액세스 토큰을 생성합니다.
  2. 해당 토큰 값을 PRIVATE_TOKEN이라는 CI/CD 변수로 추가합니다.
  3. 다음 코드로 스니펫을 생성합니다.

    파일명: export.sh

    #! /bin/sh
       
    function create_export {
      curl --silent \
      --header "PRIVATE-TOKEN: $PRIVATE_TOKEN" \
      -X 'POST' --data "export_type=sbom" \
      "http://gitlab.com/api/v4/pipelines/$CI_PIPELINE_ID/dependency_list_exports" \
      | jq '.id'
    }
       
    function check_status {
      curl --silent \
        --header "PRIVATE-TOKEN: $PRIVATE_TOKEN" \
        --write-out "%{http_code}" --output /dev/null \
        http://gitlab.com/api/v4/dependency_list_exports/$1
    }
       
    function download {
      curl --header "PRIVATE-TOKEN: $PRIVATE_TOKEN" \
        --output "gl-sbom-merged-$CI_PIPELINE_ID.cdx.json" \
        "http://gitlab.com/api/v4/dependency_list_exports/$1/download"
    }
       
    function export_sbom {
      local ID=$(create_export)
         
      for run in $(seq 0 3); do
        local STATUS=$(check_status $ID)
        # 상태가 200이면 JSON이 생성된 것입니다.
        # 상태가 202이면 JSON 생성 작업이 실행 중입니다.
        if [ $STATUS -eq "200" ]; then
          download $ID
             
          exit 0
        elif [ $STATUS -ne "202" ]; then
          exit 1
        fi
           
        echo "JSON 생성 완료 대기 중"
        sleep 5
      done
         
      exit 1
    }
       
    export_sbom
    

    위 스크립트는 다음 단계에서 작동합니다.

    1. 현재 파이프라인용 CycloneDX SBOM 내보내기를 생성합니다.
    2. 해당 내보내기의 상태를 확인하고 완료되면 중지합니다.
    3. CycloneDX SBOM 파일을 다운로드합니다.
  4. 다음 코드를 사용하여 .gitlab-ci.yml을 업데이트합니다.

    export-merged-sbom:
      before_script:
        - apk add --update jq curl
      stage: .post
      script:
        - |
          curl --header "Authorization: Bearer $PRIVATE_TOKEN"
          --output export.sh --url "https://gitlab.com/api/v4/snippets/<SNIPPET_ID>/raw"
        - /bin/sh export.sh
      artifacts:
        paths:
          - "gl-sbom-merged-*.cdx.json"
    
  5. Build > Pipelines로 이동하여 최신 파이프라인이 성공적으로 완료되었는지 확인합니다.

작업 artifact에서 gl-sbom-merged-<pipeline_id>.cdx.json 파일이 있어야 합니다.