이 문서에서는 Container Scanning API를 사용 설정하고, 이미지를 Artifact Registry에 푸시하고, 이미지에서 발견된 취약점 목록을 확인하는 방법을 설명합니다.
Artifact Analysis는 취약점 정보를 메모로 저장합니다. 이미지와 연결된 메모의 각 인스턴스에 대한 어커런스가 작성됩니다. 자세한 내용은 개요 및 가격 책정 문서를 참고하세요.
시작하기 전에
- 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 Artifact Registry and Container Scanning 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 Artifact Registry and Container Scanning APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
- Artifact Registry에 Docker 저장소를 만들고 Python 코드가 포함된 컨테이너 이미지를 저장소에 푸시합니다. Artifact Registry에 익숙하지 않다면 Docker 빠른 시작을 참고하세요.
Cloud Build를 사용하여 Python 애플리케이션을 빌드하고 컨테이너화하는 방법에 관한 자세한 내용은 Python 애플리케이션 빌드, 테스트, 컨테이너화를 참고하세요.
Artifact Analysis는 기존 이미지를 자동으로 스캔하지 않습니다. 기존 이미지를 스캔하려면 다시 푸시해야 합니다.
이미지 취약점 보기
Artifact Analysis는 새 이미지가 Artifact Registry에 업로드될 때 이를 스캔합니다. 이 스캔은 컨테이너의 패키지에 관한 정보를 추출합니다.
Google Cloud 콘솔, Google Cloud CLI 또는 Container Analysis API를 사용하여 Artifact Registry에서 이미지의 취약점 어커런스를 볼 수 있습니다. 이미지에 취약점이 있는 경우 세부정보를 가져올 수 있습니다.
Artifact Analysis는 지난 30일 동안 푸시 또는 가져온 이미지의 메타데이터만 업데이트합니다. Artifact Analysis는 30일이 지난 메타데이터를 보관처리합니다.보관처리된 메타데이터가 있는 이미지를 다시 스캔하려면 해당 이미지를 가져오세요. 메타데이터를 새로고침하는 데 최대 24시간이 걸릴 수 있습니다.
Google Cloud 콘솔에서 발생 횟수 보기
이미지의 취약점을 보려면 다음 단계를 따르세요.
저장소 목록을 가져옵니다.
저장소 목록에서 저장소를 클릭합니다.
이미지 목록에서 이미지 이름을 클릭합니다.
각 이미지 다이제스트의 취약점 합계가 취약점 열에 표시됩니다.
이미지의 취약점 목록을 보려면 취약점 열에 있는 링크를 클릭하세요.
스캔 결과 섹션에는 스캔된 패키지 유형, 총 취약점 수, 수정사항이 있는 취약점 수, 수정사항이 없는 취약점 수, 유효 심각도에 관한 요약이 표시됩니다.
취약점 표에는 발견된 각 취약점의 공통 취약점 및 노출(CVE) 이름, 실효 심각도, 공통 취약점 점수 체계 (CVSS) 점수, 수정사항 (제공되는 경우), 취약점이 포함된 패키지의 이름, 패키지 유형이 나열됩니다.
이러한 파일을 필터링하고 정렬하여 파일 확장자를 기준으로 특정 파일, 디렉터리 또는 파일 유형을 확인할 수 있습니다.
Google Cloud 콘솔에는 이 표에 최대 1,200개의 취약점이 표시됩니다. 이미지에 취약점이 1, 200개를 초과하는 경우 gcloud 또는 API를 사용하여 전체 목록을 확인해야 합니다.
특정 CVE에 대한 자세한 내용을 보려면 CVE 이름을 클릭합니다.
버전 번호, 영향을 받은 위치와 같은 취약점 발생 세부정보를 보려면 취약점 이름이 있는 행에서 보기 또는 해결됨 보기를 클릭합니다. 수정사항이 없는 취약점의 경우 링크 텍스트가 보기이고 수정사항이 적용된 취약점의 경우 해결됨 보기입니다.
gcloud를 사용하여 발생 횟수 보기
Artifact Registry에서 이미지의 발생 횟수를 보려면 다음 명령어를 실행합니다.
gcloud artifacts docker images list --show-occurrences \
LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID
각 항목의 의미는 다음과 같습니다.
- LOCATION은 저장소의 리전 또는 멀티 리전 위치입니다.
- PROJECT_ID는 Google Cloud 콘솔 프로젝트 ID입니다.
- REPOSITORY는 이미지가 저장된 저장소의 이름입니다.
IMAGE_ID는 저장소의 이미지 이름입니다. 이 명령어로 이미지 태그를 지정할 수는 없습니다.
기본적으로 이 명령어는 가장 최근의 이미지 10개를 반환합니다. 다른 수의 이미지를 표시하려면
--show-occurrences-from
플래그를 사용합니다. 예를 들어 다음 명령어는 가장 최근의 이미지 25개를 반환합니다.gcloud artifacts docker images list --show-occurrences-from=25 \ us-central1-docker.pkg.dev/my-project/my-repo/my-image
이미지 태그 또는 레이어의 취약점을 보려면 다음 명령어를 사용하세요.
gcloud artifacts docker images describe \
LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID:TAG \
--show-package-vulnerability
또는
gcloud artifacts docker images describe \
LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID@sha256:HASH \
--show-package-vulnerability
각 항목의 의미는 다음과 같습니다.
- LOCATION은 저장소의 리전 또는 멀티 리전 위치입니다.
- PROJECT_ID는 Google Cloud 콘솔 프로젝트 ID입니다.
- REPOSITORY는 이미지가 저장된 저장소의 이름입니다.
- IMAGE_ID는 저장소의 이미지 이름입니다.
- TAG는 정보를 얻을 이미지 태그입니다.
HASH는 이미지 다이제스트입니다.
Artifact Analysis는
packageType
를 포함한 결과를 반환합니다.
취약점 어커런스를 필터링하려면 다음 명령어를 사용하세요.
gcloud artifacts docker images list --show-occurrences \
LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID \
--occurrence-filter=FILTER_EXPRESSION
각 항목의 의미는 다음과 같습니다.
- LOCATION은 저장소의 리전 또는 멀티 리전 위치입니다.
- PROJECT_ID는 Google Cloud 콘솔 프로젝트 ID입니다.
- REPOSITORY는 이미지가 저장된 저장소의 이름입니다.
- IMAGE_ID는 저장소의 이미지 이름입니다.
- FILTER_EXPRESSION는 취약점 어커런스 필터링에 설명된 형식의 샘플 필터 표현식입니다.
API를 사용하여 발생 횟수 보기
프로젝트에서 어커런스 목록을 가져오려면 다음 명령어를 사용하세요.
curl -X GET -H "Content-Type: application/json" -H \
"Authorization: Bearer $(gcloud auth print-access-token)" \
https://containeranalysis.googleapis.com/v1/projects/PROJECT_ID/occurrences
프로젝트의 취약점 요약을 가져오려면 다음 명령어를 사용하세요.
curl -X GET -H "Content-Type: application/json" -H \
"Authorization: Bearer $(gcloud auth print-access-token)" \
https://containeranalysis.googleapis.com/v1/projects/PROJECT_ID/occurrences:vulnerabilitySummary
특정 발생에 대한 세부정보를 확인하려면 다음 단계를 따르세요.
curl -X GET -H "Content-Type: application/json" -H \
"Authorization: Bearer $(gcloud auth print-access-token)" \
https://containeranalysis.googleapis.com/v1/projects/PROJECT_ID/occurrences/OCCURRENCE_ID
Cloud Build에서 취약점 보기
Cloud Build를 사용하는 경우 Google Cloud 콘솔의 보안 통계 측면 패널에서 이미지 취약점도 확인할 수 있습니다.
보안 통계 측면 패널에서는 Artifact Registry에 저장된 아티팩트에 대한 빌드 보안 정보에 대한 대략적인 개요를 제공합니다. 측면 패널 및 Cloud Build를 사용하여 소프트웨어 공급망을 보호하는 방법에 대해 자세히 알아보려면 빌드 보안 통계 보기를 참고하세요.
어커런스 필터링
어커런스를 보기 전에 gcloud
명령어의 필터 문자열과 Artifact Analysis API를 사용하여 어커런스를 필터링할 수 있습니다. 다음 섹션에서는 지원되는 검색 필터를 설명합니다.
특정 유형의 어커런스 보기
kind
값을 사용하여 발생 유형별로 필터링할 수 있습니다. 사용 가능한 종류를 참고하세요.
다음 예는 이미지의 배포 어커런스로 필터링하는 방법을 보여줍니다.
gcloud
gcloud CLI에서 다음을 실행합니다.
gcloud artifacts docker images list --show-occurrences \
--occurrence-filter='kind="DEPLOYMENT"' --format=json \
LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID
각 항목의 의미는 다음과 같습니다.
API
API 쿼리에서 다음 필터 표현식을 사용합니다.
kind="DEPLOYMENT" AND resourceUrl="RESOURCE_URL"
각 항목의 의미는 다음과 같습니다.
DEPLOYMENT
는 어커런스의 종류입니다.- RESOURCE_URL은
https://LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID@sha256:HASH
형식의 이미지 전체 URL입니다.
hasPrefix
함수를 사용하여 더 넓은 범위로 필터링할 수 있습니다.
예를 들어 다음 필터는 여러 이미지에서 특정 종류의 어커런스를 필터링합니다.
kind="NOTE_KIND" AND has_prefix(resourceUrl, "RESOURCE_URL_PREFIX")
각 항목의 의미는 다음과 같습니다.
- RESOURCE_URL_PREFIX는 리소스 URL의 하위 문자열을 지정합니다.
- 이미지의 모든 버전을 필터링하려면 이미지 다이제스트를 생략합니다.
https://LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID@
형식을 사용합니다. - 프로젝트의 모든 이미지를 필터링하려면 리소스 위치와 프로젝트만 지정하세요.
https://LOCATION-docker.pkg.dev/PROJECT_ID/
형식을 사용합니다.
- 이미지의 모든 버전을 필터링하려면 이미지 다이제스트를 생략합니다.
취약점 어커런스 보기
이미지의 취약점 어커런스 목록을 검색하려면 VULNERABILITY
어커런스 유형으로 필터링하면 됩니다.
gcloud
gcloud CLI에서 다음을 실행합니다.
gcloud artifacts docker images list \
--show-occurrences \
--occurrence-filter='kind="VULNERABILITY"' \
--format=json \
LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID
각 항목의 의미는 다음과 같습니다.
API
API 쿼리에서 다음 필터 표현식을 사용합니다.
GET https://containeranalysis.googleapis.com/v1/projects/PROJECT_ID/occurrences?filter=kind%3D%22VULNERABILITY%22%20AND%20resourceUrl%3D%22ENCODED_RESOURCE_URL%22
각 항목의 의미는 다음과 같습니다.
- ENCODED_RESOURCE_URL는 이미지의 인코딩된 경로입니다. 인코딩에 관해 자세히 알아보려면 URL 인코딩을 참고하세요.
API 사용에 관한 자세한 내용은 projects.occurrences.get
를 참고하세요.
패키지 유형별 필터링
취약점 스캔 결과를 하나의 패키지 유형으로 제한하려면 다음 gcloud CLI 명령어를 실행합니다.
gcloud artifacts docker images list /
--show-occurrences /
--occurrence-filter='kind="VULNERABILITY" AND packageType="PACKAGE_TYPE"' /
LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID
각 항목의 의미는 다음과 같습니다.
VULNERABILITY
는 어커런스의 종류입니다.- PACKAGE_TYPE는 애플리케이션 언어 패키지 유형입니다.
사용 가능한 유형은
COMPOSER
,GO
,MAVEN
,NPM
,NUGET
,PYTHON
,RUBYGEMS
,RUST
입니다. - LOCATION은 저장소의 리전 또는 멀티 리전 위치입니다.
- PROJECT_ID는 Google Cloud 콘솔 프로젝트 ID입니다.
- REPOSITORY는 이미지가 저장된 저장소의 이름입니다.
- IMAGE_ID는 저장소의 이미지 이름입니다. 이 명령어로 이미지 태그를 지정할 수는 없습니다.
특정 메모와 연결된 이미지 보기
특정 메모 ID와 연결된 리소스 목록을 검색할 수 있습니다. 예를 들어 특정 CVE 취약점이 있는 이미지를 나열할 수 있습니다.
프로젝트에서 특정 메모와 연결된 모든 이미지를 나열하려면 다음 필터 표현식을 사용합니다.
gcloud
gcloud artifacts docker images list /
--show-occurrences /
--occurrence-filter='noteProjectId="goog-vulnz" AND noteId="NOTE_ID"' /
LOCATION-docker.pkg.dev/PROJECT_ID
각 항목의 의미는 다음과 같습니다.
goog-vulnz
는 Artifact Analysis 취약점 분석의PROVIDER_PROJECT_ID
입니다. 맞춤 프로젝트에서 Artifact Analysis를 사용하는 경우 이 값을 자체 제공업체 프로젝트 ID로 바꿀 수 있습니다.- LOCATION은 저장소의 리전 또는 멀티 리전 위치입니다.
- PROJECT_ID는 Google Cloud 콘솔 프로젝트 ID입니다.
- NOTE_ID는 메모의 ID입니다. 예를 들어 Artifact Analysis 스캔 결과에 취약점이 표시되면
CVE-2019-12345
와 유사한 CVE ID 형식이 사용되는 경우가 많습니다.
API
GET https://containeranalysis.googleapis.com/v1/projects/PROJECT_ID/occurrences?filter=noteProjectId%3D%22goog-vulnz%22%20AND%20resourceUrl%3D%22ENCODED_RESOURCE_URL%22%20AND%20noteId%3D%22NOTE_ID%22
각 항목의 의미는 다음과 같습니다.
goog-vulnz
는 Artifact Analysis 취약점 분석의PROVIDER_PROJECT_ID
입니다. 맞춤 프로젝트에서 Artifact Analysis를 사용하는 경우 이 값을 자체 제공업체 프로젝트 ID로 대체할 수 있습니다.- ENCODED_RESOURCE_URL는 이미지의 인코딩된 경로입니다. 인코딩에 관해 자세히 알아보려면 URL 인코딩을 참고하세요.
- NOTE_ID는 메모의 ID입니다. 예를 들어 Artifact Analysis 스캔 결과에 취약점이 표시되면
CVE-2019-12345
와 유사한 CVE ID 형식이 사용되는 경우가 많습니다.
특정 메모의 특정 이미지를 확인하려면 다음 필터 표현식을 사용합니다.
gcloud
gcloud artifacts docker images list /
--show-occurrences /
--occurrence-filter='noteProjectId="goog-vulnz" AND noteId="NOTE_ID"' /
LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID
위치
API
API 쿼리에 다음 필터 표현식을 추가합니다.
resourceUrl="RESOURCE_URL" AND noteProjectId="goog-vulnz" \ AND noteId="NOTE_ID"
각 항목의 의미는 다음과 같습니다.
- RESOURCE_URL은
https://LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID@sha256:HASH
형식의 이미지 전체 URL입니다. goog-vulnz
는 Artifact Analysis 취약점 분석의PROVIDER_PROJECT_ID
입니다. 맞춤 프로젝트에서 Artifact Analysis를 사용하는 경우 이 값을 자체 제공업체 프로젝트 ID로 바꿀 수 있습니다.- NOTE_ID는 메모의 ID입니다. 보안 관련 메모는 대개
CVE-2019-12345
형식입니다.
다음 단계
Pub/Sub 알림을 사용하여 취약점 및 기타 메타데이터에 관한 알림을 수신합니다.
Kritis 서명자와 Voucher를 사용하면 빌드 파이프라인의 일부로 Binary Authorization 증명을 만들 수 있습니다. 이러한 도구는 취약점 스캔 결과를 기반으로 Binary Authorization 증명을 만들 수 있습니다. 자세한 내용은 Kritis Signer로 증명 만들기 또는 Voucher로 증명 만들기를 참고하세요.