On-Demand Scanning API를 사용하면 컴퓨터에 로컬로 저장된 이미지 또는 Artifact Registry 또는 Container Registry에 원격으로 저장된 이미지를 스캔할 수 있습니다. 주문형 스캔을 사용하여 CI/CD 파이프라인의 이미지를 스캔하여 시스템 취약점 및 Go 패키지 취약점을 검사한 후 레지스트리에 저장할지 결정할 수 있습니다. 가격 정보는 가격 책정 페이지를 참고하세요.
이 페이지에서는 컨테이너 이미지에서 시스템 취약점 및 Go 패키지 취약점을 수동으로 검사하는 방법을 설명합니다.
시작하기 전에
- 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 API.
- 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 API.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Google Cloud CLI 설치에 local-extract 구성요소 추가
Google Cloud CLI 구성요소 관리자 사용하기
구성요소 관리자는 스캔 명령어를 처음 실행할 때 필요한 구성요소를 설치하라는 메시지를 표시합니다.
시스템 패키지 관리자 사용하기
-
Debian/Ubuntu의 경우:
sudo apt install google-cloud-sdk-local-extract
-
Red Hat/Fedora/CentOS의 경우:
sudo dnf install google-cloud-sdk-local-extract
또는 이전 명령어에서
dnf
을yum
로 바꿀 수 있습니다.
-
Debian/Ubuntu의 경우:
- 주문형 스캔에서 사용할 사용자 또는 서비스 계정에 주문형 스캔 관리자 IAM 역할을 부여합니다. 프로젝트의 소유자 계정을 사용하여 검사를 실행하는 경우 이 단계를 건너뛰어도 됩니다.
컨테이너 이미지 스캔
로컬 스캔:
gcloud artifacts docker images scan IMAGE_URI \ [--location=(us,europe,asia)] [--async]
로컬 이미지의 경우 IMAGE_URI에 다음 형식 중 하나를 사용합니다.
REPOSITORY:TAG
REPOSITORY
원격 검사:
gcloud artifacts docker images scan IMAGE_URI \ --remote [--location=(us,europe,asia)] [--async]
원격 이미지의 경우 IMAGE_URI에 다음 형식 중 하나를 사용합니다.
HOSTNAME/PROJECT_ID/REPOSITORY_ID/IMAGE_ID@sha256:HASH
HOSTNAME/PROJECT_ID/REPOSITORY_ID/IMAGE_ID:HASH
HOSTNAME/PROJECT_ID/REPOSITORY_ID/IMAGE_ID
HOSTNAME/PROJECT_ID/IMAGE_ID@sha256:HASH
HOSTNAME/PROJECT_ID/IMAGE_ID:HASH
HOSTNAME/PROJECT_ID/IMAGE_ID
Artifact Registry의 이미지의 경우 IMAGE_URI에
REPOSITORY_ID
가 포함되어야 합니다.
로컬 및 원격 검사 모두에 다음과 같은 선택적 플래그를 사용할 수 있습니다.
--location
은 스캔이 실행되는 멀티 리전을 수동으로 선택하는 선택적 플래그입니다. 실제 위치와 더 가까운 멀티 리전을 선택하면 지연 시간이 최소화됩니다. 사용 가능한 위치는us
,europe
,asia
입니다. 기본 위치는us
입니다.--async
은 스캔 프로세스를 비동기식으로 실행하는 선택적 플래그입니다. 이 플래그를 생략하면 스캔 프로세스가 완료될 때까지 터미널이 차단됩니다.
동기식 검사
다음 예는 --async
플래그가 없는 동기 스캔의 출력을 보여줍니다.
$ gcloud artifacts docker images scan golang:1.17.6-alpine ✓ Scanning container image ✓ Locally extracting packages and versions from local container image ✓ Remotely initiating analysis of packages and versions ✓ Waiting for analysis operation to complete [projects/my-project/locations/us/operations/87d2e137-1d1c-4790-8e5e-daf6c96ae7d7] Done. done: true metadata: '@type': type.googleapis.com/google.cloud.ondemandscanning.v1.AnalyzePackagesMetadata createTime: '2022-01-11T16:58:11.711487Z' resourceUri: golang:1.16.13-alpine name: projects/my-project/locations/us/operations/87d2e137-1d1c-4790-8e5e-daf6c96ae7d7 response: '@type': type.googleapis.com/google.cloud.ondemandscanning.v1.AnalyzePackagesResponse scan: projects/my-project/locations/us/scans/2fe2bfb8-f0c5-4dd6-a8c8-38961869767a
스캔 이름을 사용하여 취약점 결과를 가져옵니다.
스캔 이름은 출력 메시지의 마지막 줄에 있는 scan
값입니다.
비동기 검사
다음 예는 비동기 스캔 실행의 출력을 보여줍니다.
$ gcloud artifacts docker images scan golang:1.17.6-alpine --async ✓ Scanning container image ✓ Locally extracting packages and versions from local container image ✓ Remotely initiating analysis of packages and versions Done. Check operation [projects/my-project/locations/us/operations/2e1a6b1f-16e5-4427-ac86-72c998a3dd16] for status. metadata: '@type': type.googleapis.com/google.cloud.ondemandscanning.v1.AnalyzePackagesMetadata createTime: '2022-01-11T16:58:11.711487Z' resourceUri: golang:1.16.13-alpine name: projects/my-project/locations/us/operations/2e1a6b1f-16e5-4427-ac86-72c998a3dd16
이렇게 하면 장기 실행 작업이 시작되고 터미널을 차단하지 않고 ID가 반환됩니다. 출력 메시지의 마지막 줄에 있는 name
값인 작업 ID를 사용하여 작업을 폴링합니다.
장기 실행 작업 폴링
비동기 스캔 명령어의 출력에서 작업 ID를 사용하여 작업 상태를 확인합니다.
gcloud artifacts docker images get-operation LRO_ID
여기서 LRO_ID는 장기 실행 작업 ID입니다.
비동기 스캔 섹션의 예를 계속 사용하여 작업 상태를 확인합니다.
$ gcloud artifacts docker images get-operation \ projects/my-project/locations/us/operations/2e1a6b1f-16e5-4427-ac86-72c998a3dd16 done: true metadata: '@type': type.googleapis.com/google.cloud.ondemandscanning.v1.AnalyzePackagesMetadata createTime: '2022-01-11T16:58:11.711487Z' resourceUri: golang:1.16.13-alpine name: projects/my-project/locations/us/operations/2e1a6b1f-16e5-4427-ac86-72c998a3dd16 response: '@type': type.googleapis.com/google.cloud.ondemandscanning.v1.AnalyzePackagesResponse scan: projects/my-project/locations/us/scans/2fe2bfb8-f0c5-4dd6-a8c8-38961869767a
출력에 done: true
줄이 포함되면 스캔 작업이 완료된 것입니다. 스캔 이름을 사용하여 취약점 결과를 가져옵니다.
이름은 출력 메시지의 마지막 줄에 있는 scan
의 값입니다.
스캔 결과 검색
스캔 작업이 완료된 후 스캔 결과를 가져오려면 다음 명령어를 사용하세요.
gcloud artifacts docker images list-vulnerabilities SCAN_NAME [--limit=X]
각 항목의 의미는 다음과 같습니다.
SCAN_NAME은 스캔 이름입니다. 스캔이 완료된 후 동기식 스캔을 실행하거나 장기 실행 작업을 폴링하면 출력의 마지막 줄에서 확인할 수 있습니다.
--limit=X
는 출력에 표시되는 발생 횟수를 제한하는 선택적 플래그입니다.X
은 숫자 값입니다.
예를 들면 다음과 같습니다.
createTime: '2022-01-11T16:58:11.972043Z' kind: VULNERABILITY name: projects/my-project/locations/us/occurrences/0c607d9b-aff4-4cde-86b7-e2c0a865aadd noteName: projects/goog-vulnz/notes/CVE-2021-38297 resourceUri: golang:1.16.13-alpine updateTime: '2022-01-11T16:58:11.972043Z' vulnerability: cvssScore: 7.5 effectiveSeverity: CRITICAL longDescription: Go before 1.16.9 and 1.17.x before 1.17.2 has a Buffer Overflow via large arguments in a function invocation from a WASM module, when GOARCH=wasm GOOS=js is used. packageIssue: - affectedCpeUri: cpe:/o:alpine:alpine_linux:3.15 affectedPackage: go affectedVersion: fullName: 1.16.13 kind: NORMAL name: 1.16.13 effectiveSeverity: CRITICAL fixedCpeUri: cpe:/o:alpine:alpine_linux:3.15 fixedPackage: go fixedVersion: fullName: 1.17.2 kind: NORMAL name: 1.17.2 packageType: GO_STDLIB relatedUrls: - label: More Info url: https://security-tracker.debian.org/tracker/CVE-2021-38297 - label: More Info url: https://access.redhat.com/security/cve/CVE-2021-38297 - label: More Info url: https://nvd.nist.gov/vuln/detail/CVE-2021-38297 severity: HIGH shortDescription: CVE-2021-38297
이 명령어의 출력은 Grafeas 형식의 발생 목록입니다. 이 경우 이미지에서 발견된 심각도가 높은 취약점 1개가 표시됩니다.
주문형 스캔은 다음 두 가지 유형의 Go 패키지 취약점을 식별합니다.
packageType:GO_STDLIB
. Go 표준 라이브러리 취약점 이는 취약점이 바이너리를 빌드하는 데 사용된 Go 도구 모음 또는 도구 모음과 번들로 제공된 표준 라이브러리에서 발견되었음을 나타냅니다. 빌드 도구 모음을 업그레이드하면 이 문제를 해결할 수 있습니다.packageType:GO
. 패키지 취약점으로 이동합니다. 서드 파티 패키지에서 취약점이 발견되었음을 나타냅니다. 종속 모듈을 업그레이드하면 이 문제를 해결할 수 있습니다.
스캔 작업이 완료된 후 48시간 동안 스캔 결과를 확인할 수 있습니다.
다음 단계
- Cloud Build 파이프라인에서 On-Demand Scanning API 사용하기
- Artifact Analysis를 사용하여 Artifact Registry에 저장된 이미지의 취약점 정보를 스캔하고 지속적으로 업데이트합니다.