Cloud Build 파이프라인의 일부로 On-Demand Scanning을 사용하면 컨테이너 이미지에 사전 정의된 수준과 일치하는 심각도의 취약점이 있는 경우 빌드를 차단할 수 있습니다.
이 튜토리얼에서는 Cloud Build를 사용하여 소스 코드에서 컨테이너 이미지를 빌드하고, 취약점을 검사하고, 취약점의 심각도 수준을 확인하고, 특정 심각도 수준의 취약점이 없는 경우 이미지를 Artifact Registry에 푸시하는 방법을 보여줍니다.
이 튜토리얼에서는 새 Google Cloud 프로젝트를 만들고 격리된 환경에서 단계를 완료하는 것이 좋습니다.
목표
- Cloud Build로 이미지를 빌드합니다.
- On-Demand Scanning으로 빌드된 이미지를 스캔합니다.
- 허용 가능한 취약점 수준을 평가합니다.
- Artifact Registry에 이미지를 저장합니다.
비용
이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.
프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요.
이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.
시작하기 전에
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the On-Demand Scanning, Cloud Build, and Artifact Registry APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the On-Demand Scanning, Cloud Build, and Artifact Registry APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
필요한 역할
Cloud Build에서 사용하는 서비스 계정에는 다음 역할이 필요합니다.
On-Demand Scanning 관리자 (
roles/ondemandscanning.admin
)Artifact Registry 작성자 (
roles/artifactregistry.writer
)
기본 Cloud Build 서비스 계정에는 동일한 프로젝트의 Artifact Registry 저장소에 필요한 권한이 있습니다. 저장소가 Cloud Build에 사용하는 프로젝트와 동일한 프로젝트에 있는 경우 주문형 검사 관리자 역할만 부여하면 됩니다.
Cloud Build에 사용자 제공 서비스 계정을 사용하는 경우 두 가지 역할을 모두 부여해야 합니다.
소스 파일 준비
이 튜토리얼에서는 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
위치
- 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에서 제공하는 무료 온라인 교육을 참고하세요. 안전한 소프트웨어 개발을 참고하세요.
삭제
이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.
프로젝트 삭제
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
개별 리소스 삭제
저장소를 삭제하기 전에, 보관할 이미지를 다른 위치에서 사용할 수 있는지 확인합니다.
저장소를 삭제하려면 다음 안내를 따르세요.
콘솔
Google Cloud 콘솔에서 저장소 페이지를 엽니다.
저장소 목록에서
ods-build-repo
저장소를 선택합니다.삭제를 클릭합니다.
gcloud
ods-build-repo
저장소를 삭제하려면 다음 명령어를 실행합니다.
gcloud artifacts repositories delete ods-build-repo --location=us-central1