튜토리얼: SBOM 형식으로 종속성 목록 내보내기

Tier: Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated

종속성 스캐닝 출력은 CycloneDX JSON 형식으로 내보낼 수 있습니다.

이 튜토리얼에서는 파이프라인에 대한 CycloneDX JSON SBOM을 생성한 후, 이를 CI 작업 아티팩트로 업로드하는 방법을 보여줍니다.

시작하기 전에

종속성 스캐닝을 설정하세요. 자세한 지침은 종속성 스캐닝 튜토리얼을 참조하십시오.

구성 파일 생성

  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" \
      "https://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 \
        https://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" \
        "https://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)
        # JSON이 생성되면 상태는 200입니다.
        # JSON 작업이 실행 중일 때 상태는 202입니다.
        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:
      image: alpine
      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로 이동하여 최신 파이프라인이 성공적으로 완료되었는지 확인합니다.

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