Cloud Build 파이프라인에서 On-Demand Scanning 사용

Cloud Build 파이프라인의 일부로 On-Demand Scanning을 사용하면 컨테이너 이미지에 미리 정의된 수준과 일치하는 심각도의 취약점이 있는 경우 빌드를 차단할 수 있습니다.

이 튜토리얼에서는 Cloud Build를 사용하여 소스 코드에서 컨테이너 이미지를 빌드하고, 취약점을 검사하고, 취약점의 심각도 수준을 확인하고, 특정 심각도 수준의 취약점이 없는 경우 이미지를 Artifact Registry에 푸시하는 방법을 보여줍니다.

이 튜토리얼에서는 새 Google Cloud 프로젝트를 만들고 격리된 환경에서 단계를 완료하는 것이 좋습니다.

소스 파일 준비

이 튜토리얼에서는 Dockerfile에서 이미지를 빌드합니다. Dockerfile은 Docker가 이미지를 빌드하기 위한 안내가 포함된 소스 파일입니다.

  1. 터미널을 열고 ods-tutorial라는 새 디렉터리를 만든 후 디렉터리로 이동합니다.

    mkdir ods-tutorial && cd ods-tutorial
    
  2. 다음 콘텐츠로 Dockerfile라는 파일을 만듭니다.

    # Debian10 image
    FROM gcr.io/google-appengine/debian10:latest
    
    # Ensures that the built image is always unique
    RUN apt-get update && apt-get -y install uuid-runtime && uuidgen > /IAMUNIQUE
    

Artifact Registry 저장소 만들기

  1. API를 사용 설정한 동일한 프로젝트로 프로젝트 ID를 설정합니다.

    gcloud config set project PROJECT_ID
    
  2. us-central1 위치에 ods-build-repo라는 Docker 저장소를 만듭니다.

    gcloud artifacts repositories create ods-build-repo --repository-format=docker \
    --location=us-central1 --description="Repository for scan and build"
    
  3. 저장소가 성공적으로 생성되었는지 확인합니다.

    gcloud artifacts repositories list
    

빌드 및 스캔

이 섹션에서는 빌드 구성 파일을 사용하여 빌드 파이프라인을 실행합니다. 빌드 구성 파일은 사양에 따라 여러 작업을 수행하는 방법을 Cloud Build에 지시합니다.

  1. ods-tutorial/ 폴더에서 다음 콘텐츠가 포함된 cloudbuild.yaml 파일을 만듭니다.

    steps:
       - id: build
         name: gcr.io/cloud-builders/docker
         entrypoint: /bin/bash
         args:
         - -c
         - |
           docker build -t us-central1-docker.pkg.dev/$_PROJECT_ID/ods-build-repo/ods-test:latest -f ./Dockerfile . &&
           docker image inspect us-central1-docker.pkg.dev/$_PROJECT_ID/ods-build-repo/ods-test:latest --format \
           '{{index .RepoTags 0}}@{{.Id}}' > /workspace/image-digest.txt &&
           cat image-digest.txt
       - id: scan
         name: gcr.io/google.com/cloudsdktool/cloud-sdk
         entrypoint: /bin/bash
         args:
         - -c
         - |
           gcloud artifacts docker images scan us-central1-docker.pkg.dev/$_PROJECT_ID/ods-build-repo/ods-test:latest \
           --format='value(response.scan)' > /workspace/scan_id.txt
       - id: severity check
         name: gcr.io/google.com/cloudsdktool/cloud-sdk
         entrypoint: /bin/bash
         args:
         - -c
         - |
           gcloud artifacts docker images list-vulnerabilities $(cat /workspace/scan_id.txt) \
           --format='value(vulnerability.effectiveSeverity)' | if grep -Exq $_SEVERITY; \
           then echo 'Failed vulnerability check' && exit 1; else exit 0; fi
       - id: push
         name: gcr.io/cloud-builders/docker
         entrypoint: /bin/bash
         args:
         - -c
         - |
           docker push us-central1-docker.pkg.dev/$_PROJECT_ID/ods-build-repo/ods-test:latest
    images: ['us-central1-docker.pkg.dev/$_PROJECT_ID/ods-build-repo/ods-test:latest']
    
    

    이 파일에는 이전에 Artifact Registry에서 만든 위치와 저장소가 포함되어 있습니다. 다른 값을 사용하기로 한 경우 그에 따라 cloudbuild.yaml 파일을 수정합니다. PROJECT_IDSEVERITY 값은 빌드 명령어에서 스크립트로 전달됩니다.

  2. 차단할 취약점 SEVERITY 수준을 지정하고 빌드를 시작합니다.

    SEVERITY에 다음 값을 사용할 수 있습니다.

    • CRITICAL
    • HIGH
    • MEDIUM
    • LOW

    정규 표현식을 사용하여 심각도를 여러 개 지정할 수 있습니다.

    다음 예에서는 CRITICALHIGH 심각도 값을 모두 지정합니다. 이렇게 하면 Cloud Build에 HIGH 심각도 수준 이상으로 분류된 취약점을 확인하도록 지시합니다.

    gcloud builds submit --substitutions=_PROJECT_ID=PROJECT_ID,_SEVERITY='"CRITICAL|HIGH"' \
    --config cloudbuild.yaml
    

    WHERE

    • PROJECT_ID는 프로젝트 ID입니다.
    • SEVERITY을 사용하면 차단할 심각도 수준을 설정할 수 있습니다. 온디맨드 스캔에서 지정된 심각도 수준과 일치하는 취약점을 발견하면 빌드가 실패합니다.

결과 이해하기

SEVERITY 값을 CRITICAL|HIGH으로 설정하면 요청 시 스캔에서 취약점을 스캔한 후 HIGH 수준과 더 심각한 CRITICAL 수준에 취약점이 있는지 확인합니다. 이미지에서 일치하는 취약점이 발견되지 않으면 빌드가 성공하고 Cloud Build가 이미지를 Artifact Registry로 푸시합니다.

출력은 다음과 비슷합니다.

DONE
--------------------------------------------------------------------------------------------------------------------------------------------

ID                                    CREATE_TIME                DURATION  SOURCE                                                                                         IMAGES                                                                        STATUS
abb3ce73-6ae8-41d1-9080-7d74a7ecd7bc  2021-03-15T06:50:32+00:00  1M48S     gs://ods-tests_cloudbuild/source/1615791031.906807-a648d10faf4a46d695c163186a6208d5.tgz  us-central1-docker.pkg.dev/ods-tests/ods-build-repo/ods-test (+1 more)  SUCCESS

온디맨드 스캔에서 이미지에 HIGH 또는 CRITICAL 취약점을 발견하면 scan 빌드 단계가 실패하고 후속 빌드 단계가 시작되지 않으며 Cloud Build가 Artifact Registry에 이미지를 푸시하지 않습니다.

출력은 다음과 비슷합니다.

Step #2 - "severity check": Failed vulnerability check
Finished Step #2 - "severity check"
ERROR
ERROR: build step 2 "gcr.io/cloud-builders/gcloud" failed: step exited with non-zero status: 1

이 튜토리얼에서는 샘플 소스 코드가 공개적으로 제공되는 Linux 배포판인 debian10:latest이므로 결과가 다를 수 있습니다. Linux 배포판 및 관련 취약점 데이터는 지속적으로 업데이트됩니다.

소프트웨어 공급망을 보호하는 데 도움이 되는 추가 Google Cloud 도구 및 권장사항에 대해 알아보려면 소프트웨어 공급망 보안을 참고하세요.

Linux 취약점 관리 권장사항에 대한 자세한 내용은 Linux Foundation에서 제공하는 무료 온라인 교육을 참고하세요. 안전한 소프트웨어 개발을 참고하세요.