Cloud Build 파이프라인의 일부로 On-Demand Scanning을 사용하면 컨테이너 이미지에 미리 정의된 수준과 일치하는 심각도의 취약점이 있는 경우 빌드를 차단할 수 있습니다.
이 튜토리얼에서는 Cloud Build를 사용하여 소스 코드에서 컨테이너 이미지를 빌드하고, 취약점을 검사하고, 취약점의 심각도 수준을 확인하고, 특정 심각도 수준의 취약점이 없는 경우 이미지를 Artifact Registry에 푸시하는 방법을 보여줍니다.
이 튜토리얼에서는 새 Google Cloud 프로젝트를 만들고 격리된 환경에서 단계를 완료하는 것이 좋습니다.
소스 파일 준비
이 튜토리얼에서는 Dockerfile에서 이미지를 빌드합니다. Dockerfile은 Docker가 이미지를 빌드하기 위한 안내가 포함된 소스 파일입니다.
터미널을 열고
ods-tutorial
라는 새 디렉터리를 만든 후 디렉터리로 이동합니다.mkdir ods-tutorial && cd ods-tutorial
다음 콘텐츠로
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 저장소 만들기
API를 사용 설정한 동일한 프로젝트로 프로젝트 ID를 설정합니다.
gcloud config set project PROJECT_ID
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"
저장소가 성공적으로 생성되었는지 확인합니다.
gcloud artifacts repositories list
빌드 및 스캔
이 섹션에서는 빌드 구성 파일을 사용하여 빌드 파이프라인을 실행합니다. 빌드 구성 파일은 사양에 따라 여러 작업을 수행하는 방법을 Cloud Build에 지시합니다.
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_ID
및SEVERITY
값은 빌드 명령어에서 스크립트로 전달됩니다.차단할 취약점
SEVERITY
수준을 지정하고 빌드를 시작합니다.SEVERITY
에 다음 값을 사용할 수 있습니다.CRITICAL
HIGH
MEDIUM
LOW
정규 표현식을 사용하여 심각도를 여러 개 지정할 수 있습니다.
다음 예에서는
CRITICAL
및HIGH
심각도 값을 모두 지정합니다. 이렇게 하면 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에서 제공하는 무료 온라인 교육을 참고하세요. 안전한 소프트웨어 개발을 참고하세요.