OS 패키지 자동 스캔

이 문서에서는 Container Scanning API를 사용 설정하고, 이미지를 Artifact Registry로 푸시하고, 이미지에서 발견된 취약점 목록을 확인하는 방법을 설명합니다.

Artifact Analysis는 Artifact Registry 및 Container Registry의 컨테이너 이미지에 대한 취약점 정보를 제공합니다(지원 중단됨). 메타데이터는 메모로 저장됩니다. 이미지와 연결된 메모의 각 인스턴스에 대한 어커런스가 작성됩니다. 자세한 내용은 개요가격 책정 문서를 참고하세요.

이 API를 사용 설정하면 Artifact Registry에서 언어 패키지 스캔도 사용 설정됩니다. 지원되는 패키지 유형을 참고하세요.

시작하기 전에

  1. 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.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Artifact Registry and Container Scanning APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  8. Make sure that billing is enabled for your Google Cloud project.

  9. Enable the Artifact Registry and Container Scanning APIs.

    Enable the APIs

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init
  12. Artifact Registry에 Docker 저장소를 만들고 컨테이너 이미지를 저장소에 푸시합니다. Artifact Registry에 익숙하지 않다면 Docker 빠른 시작을 참고하세요.

이미지 취약점 보기

Artifact Analysis는 새 이미지가 Artifact Registry에 업로드될 때 이를 스캔합니다. 이 스캔은 컨테이너의 시스템 패키지에 대한 정보를 추출합니다.

Google Cloud 콘솔, Google Cloud CLI 또는 Container Analysis API를 사용하여 레지스트리에서 이미지의 취약점 발생 횟수를 확인할 수 있습니다. 이미지에 취약점이 있는 경우 세부정보를 가져올 수 있습니다.

Artifact Analysis는 지난 30일 동안 푸시 또는 가져온 이미지의 메타데이터만 업데이트합니다. 30일 후에는 메타데이터가 더 이상 업데이트되지 않으며 결과가 비활성화됩니다. 또한 Artifact Analysis는 90일 넘게 비활성 상태인 메타데이터를 보관처리하며, 이러한 메타데이터는 Google Cloud 콘솔, gcloud 또는 API를 사용하여 사용할 수 없습니다. 비활성 또는 보관처리된 메타데이터가 있는 이미지를 다시 스캔하려면 해당 이미지를 가져오세요. 메타데이터를 새로고침하는 데 최대 24시간이 걸릴 수 있습니다.

Google Cloud 콘솔에서 발생 횟수 보기

이미지의 취약점을 보려면 다음 단계를 따르세요.

  1. 저장소 목록을 가져옵니다.

    저장소 페이지 열기

  2. 저장소 목록에서 저장소를 클릭합니다.

  3. 이미지 목록에서 이미지 이름을 클릭합니다.

    각 이미지 다이제스트의 취약점 합계가 취약점 열에 표시됩니다.

    취약점이 있는 이미지의 스크린샷

  4. 이미지의 취약점 목록을 보려면 취약점 열에 있는 링크를 클릭하세요.

    스캔 결과 섹션에는 스캔된 패키지 유형, 총 취약점 수, 수정사항이 있는 취약점 수, 수정사항이 없는 취약점 수, 유효 심각도에 관한 요약이 표시됩니다.

    취약점, 수정사항, 유효한 심각도가 포함된 스캔 결과 섹션의 스크린샷

    취약점 표에는 발견된 각 취약점의 공통 취약점 및 노출(CVE) 이름, 실효 심각도, 공통 취약점 점수 체계 (CVSS) 점수, 수정사항 (제공되는 경우), 취약점이 포함된 패키지의 이름, 패키지 유형이 나열됩니다.

    이러한 파일을 필터링하고 정렬하여 파일 확장자를 기준으로 특정 파일, 디렉터리 또는 파일 유형을 확인할 수 있습니다.

    Google Cloud 콘솔에는 이 표에 최대 1,200개의 취약점이 표시됩니다. 이미지에 취약점이 1, 200개를 초과하는 경우 gcloud 또는 API를 사용하여 전체 목록을 확인해야 합니다.

  5. 특정 CVE에 대한 자세한 내용을 보려면 CVE 이름을 클릭합니다.

  6. 버전 번호, 영향을 받은 위치와 같은 취약점 발생 세부정보를 보려면 취약점 이름이 있는 행에서 보기 또는 해결됨 보기를 클릭합니다. 수정사항이 없는 취약점의 경우 링크 텍스트가 보기이고 수정사항이 적용된 취약점의 경우 해결됨 보기입니다.

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

Container Registry

gcloud beta container images list-tags \
HOSTNAME/PROJECT_ID/IMAGE_ID

각 항목의 의미는 다음과 같습니다.

  • HOSTNAME은 멀티 리전 호스트 이름입니다.
    • gcr.io
    • asia.gcr.io
    • eu.gcr.io
    • us.gcr.io
  • PROJECT_ID는 이미지가 포함된 프로젝트의 ID입니다.
  • IMAGE_ID는 취약점을 확인할 이미지의 ID입니다. 이 명령어로 이미지 태그를 지정할 수는 없습니다.

기본적으로 이 명령어는 가장 최근의 이미지 10개를 반환합니다. 다른 수의 이미지를 표시하려면 --show-occurrences-from 플래그를 사용합니다. 예를 들어 이 명령어는 가장 최근의 이미지 25개를 반환합니다.

gcloud beta container images list-tags --show-occurrences-from=25 \
gcr.io/my-project/my-image

이미지 태그 또는 레이어의 취약점을 보려면 다음 명령어를 사용하세요.

Artifact Registry

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는 이미지 다이제스트입니다.

Container Registry

gcloud beta container images describe HOSTNAME/PROJECT_ID/IMAGE_ID@sha256:HASH \
--show-package-vulnerability

각 항목의 의미는 다음과 같습니다.

  • HOSTNAME은 멀티 리전 호스트 이름입니다.
    • gcr.io
    • asia.gcr.io
    • eu.gcr.io
    • us.gcr.io
  • PROJECT_ID는 이미지가 포함된 프로젝트의 ID입니다.
  • IMAGE_ID는 취약점을 확인할 이미지의 ID입니다.
  • HASH는 이미지 다이제스트입니다.

취약점 어커런스를 필터링하려면 다음 명령어를 사용하세요.

Artifact Registry

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취약점 어커런스 필터링에 설명된 형식의 샘플 필터 표현식입니다.

Container Registry

gcloud beta container images list-tags \
HOSTNAME/PROJECT_ID/IMAGE_ID --occurrence-filter=FILTER_EXPRESSION

각 항목의 의미는 다음과 같습니다.

  • HOSTNAME은 멀티 리전 호스트 이름입니다.
    • gcr.io
    • asia.gcr.io
    • eu.gcr.io
    • us.gcr.io
  • PROJECT_ID는 이미지가 포함된 프로젝트의 ID입니다.
  • IMAGE_ID는 취약점 어커런스를 확인할 이미지의 ID입니다.
  • FILTER_EXPRESSION취약점 어커런스 필터링에 설명된 형식의 샘플 필터 표현식입니다.

API 또는 코드를 사용하여 발생 횟수 보기

이미지의 어커런스를 보려면 적절한 스니펫을 사용하세요. 코드 스니펫은 Container Registry의 이미지 URL을 지정합니다. Artifact Registry를 사용하는 경우 다음 형식의 URL로 이미지를 지정합니다.

LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID

API

cURL 사용

프로젝트에서 어커런스 목록을 가져오려면 다음 명령어를 사용하세요.

 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

Java

아티팩트 분석용 클라이언트 라이브러리를 설치하고 사용하는 방법은 아티팩트 분석 클라이언트 라이브러리를 참고하세요. 자세한 내용은 Artifact Analysis Java API 참조 문서를 참고하세요.

Artifact Analysis에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

import com.google.cloud.devtools.containeranalysis.v1.ContainerAnalysisClient;
import io.grafeas.v1.GrafeasClient;
import io.grafeas.v1.Occurrence;
import io.grafeas.v1.ProjectName;
import java.io.IOException;
import java.lang.InterruptedException;

public class OccurrencesForImage {
  // Retrieves all the Occurrences associated with a specified image
  // Here, all Occurrences are simply printed and counted
  public static int getOccurrencesForImage(String resourceUrl, String projectId)
      throws IOException, InterruptedException {
    // String resourceUrl = "https://gcr.io/project/image@sha256:123";
    // String projectId = "my-project-id";
    final String projectName = ProjectName.format(projectId);
    final String filterStr = String.format("resourceUrl=\"%s\"", resourceUrl);

    // Initialize client that will be used to send requests. After completing all of your requests, 
    // call the "close" method on the client to safely clean up any remaining background resources.
    GrafeasClient client = ContainerAnalysisClient.create().getGrafeasClient();
    int i = 0;
    for (Occurrence o : client.listOccurrences(projectName, filterStr).iterateAll()) {
      // Write custom code to process each Occurrence here
      System.out.println(o.getName());
      i = i + 1;
    }
    return i;
  }
}

Go

아티팩트 분석용 클라이언트 라이브러리를 설치하고 사용하는 방법은 아티팩트 분석 클라이언트 라이브러리를 참고하세요. 자세한 내용은 Artifact Analysis Go API 참조 문서를 참고하세요.

Artifact Analysis에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.


import (
	"context"
	"fmt"
	"io"

	containeranalysis "cloud.google.com/go/containeranalysis/apiv1"
	"google.golang.org/api/iterator"
	grafeaspb "google.golang.org/genproto/googleapis/grafeas/v1"
)

// getOccurrencesForImage retrieves all the Occurrences associated with a specified image.
// Here, all Occurrences are simply printed and counted.
func getOccurrencesForImage(w io.Writer, resourceURL, projectID string) (int, error) {
	// Use this style of URL when you use Google Container Registry.
	// resourceURL := "https://gcr.io/my-project/my-repo/my-image"
	// Use this style of URL when you use Google Artifact Registry.
	// resourceURL := "https://LOCATION-docker.pkg.dev/my-project/my-repo/my-image"
	ctx := context.Background()
	client, err := containeranalysis.NewClient(ctx)
	if err != nil {
		return -1, fmt.Errorf("NewClient: %w", err)
	}
	defer client.Close()

	req := &grafeaspb.ListOccurrencesRequest{
		Parent: fmt.Sprintf("projects/%s", projectID),
		Filter: fmt.Sprintf("resourceUrl=%q", resourceURL),
	}
	it := client.GetGrafeasClient().ListOccurrences(ctx, req)
	count := 0
	for {
		occ, err := it.Next()
		if err == iterator.Done {
			break
		}
		if err != nil {
			return -1, fmt.Errorf("occurrence iteration error: %w", err)
		}
		// Write custom code to process each Occurrence here.
		fmt.Fprintln(w, occ)
		count = count + 1
	}
	return count, nil
}

Node.js

아티팩트 분석용 클라이언트 라이브러리를 설치하고 사용하는 방법은 아티팩트 분석 클라이언트 라이브러리를 참고하세요. 자세한 내용은 Artifact Analysis Node.js API 참조 문서를 참고하세요.

Artifact Analysis에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

/**
 * TODO(developer): Uncomment these variables before running the sample
 */
// const projectId = 'your-project-id', // Your GCP Project ID
// If you are using Google Container Registry
// const imageUrl = 'https://gcr.io/my-project/my-repo/my-image@sha256:123' // Image to attach metadata to
// If you are using Google Artifact Registry
// const imageUrl = 'https://LOCATION-docker.pkg.dev/my-project/my-repo/my-image@sha256:123' // Image to attach metadata to

// Import the library and create a client
const {ContainerAnalysisClient} = require('@google-cloud/containeranalysis');
const client = new ContainerAnalysisClient();

const formattedParent = client.getGrafeasClient().projectPath(projectId);

// Retrieves all the Occurrences associated with a specified image
const [occurrences] = await client.getGrafeasClient().listOccurrences({
  parent: formattedParent,
  filter: `resourceUrl = "${imageUrl}"`,
});

if (occurrences.length) {
  console.log(`Occurrences for ${imageUrl}`);
  occurrences.forEach(occurrence => {
    console.log(`${occurrence.name}:`);
  });
} else {
  console.log('No occurrences found.');
}

Ruby

아티팩트 분석용 클라이언트 라이브러리를 설치하고 사용하는 방법은 아티팩트 분석 클라이언트 라이브러리를 참고하세요. 자세한 내용은 Artifact Analysis Ruby API 참조 문서를 참고하세요.

Artifact Analysis에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

# resource_url = "The URL of the resource associated with the occurrence."
#                # e.g. https://gcr.io/project/image@sha256:123"
# project_id   = "The Google Cloud project ID of the occurrences to retrieve"

require "google/cloud/container_analysis"

# Initialize the client
client = Google::Cloud::ContainerAnalysis.container_analysis.grafeas_client

parent = client.project_path project: project_id
filter = "resourceUrl = \"#{resource_url}\""
count = 0
client.list_occurrences(parent: parent, filter: filter).each do |occurrence|
  # Process occurrence here
  puts occurrence
  count += 1
end
puts "Found #{count} occurrences"

Python

아티팩트 분석용 클라이언트 라이브러리를 설치하고 사용하는 방법은 아티팩트 분석 클라이언트 라이브러리를 참고하세요. 자세한 내용은 Artifact Analysis Python API 참조 문서를 참고하세요.

Artifact Analysis에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

from google.cloud.devtools import containeranalysis_v1


def get_occurrences_for_image(resource_url: str, project_id: str) -> int:
    """Retrieves all the occurrences associated with a specified image.
    Here, all occurrences are simply printed and counted."""
    # resource_url = 'https://gcr.io/my-project/my-image@sha256:123'
    # project_id = 'my-gcp-project'

    filter_str = f'resourceUrl="{resource_url}"'
    client = containeranalysis_v1.ContainerAnalysisClient()
    grafeas_client = client.get_grafeas_client()
    project_name = f"projects/{project_id}"

    response = grafeas_client.list_occurrences(parent=project_name, filter=filter_str)
    count = 0
    for o in response:
        # do something with the retrieved occurrence
        # in this sample, we will simply count each one
        count += 1
    return count

Cloud Build에서 발생 횟수 보기

Cloud Build를 사용하는 경우 Google Cloud 콘솔의 보안 통계 측면 패널에서 이미지 취약점도 확인할 수 있습니다.

보안 통계 측면 패널에서는 Artifact Registry에 저장된 아티팩트에 대한 빌드 보안 정보에 대한 대략적인 개요를 제공합니다. 측면 패널 및 Cloud Build를 사용하여 소프트웨어 공급망을 보호하는 방법에 대해 자세히 알아보려면 빌드 보안 통계 보기를 참고하세요.

어커런스 필터링

어커런스를 보기 전에 gcloud 명령어의 필터 문자열과 Artifact Analysis API를 사용하여 어커런스를 필터링할 수 있습니다. 다음 섹션에서는 지원되는 검색 필터를 설명합니다.

탐색 어커런스 보기

이미지를 Container Registry에 처음으로 내보내면 컨테이너 이미지의 초기 스캔에 대한 정보를 포함하는 탐색 어커런스가 생성됩니다.

이미지의 탐색 어커런스를 검색하려면 다음 필터 표현식을 사용하세요.

kind="DISCOVERY" AND resourceUrl="RESOURCE_URL"

다음 스니펫은 필터 표현식을 사용하여 이미지의 탐색 어커런스를 보는 방법을 보여줍니다. 코드 스니펫은 Container Registry의 이미지 URL을 지정합니다. Artifact Registry를 사용하는 경우 다음 형식의 URL로 이미지를 지정합니다.

LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID

gcloud

이미지의 탐색 어커런스를 보려면 다음 명령어를 사용하세요.

이 경우 명령어에 표현식이 직접 사용되지는 않지만 동일한 정보가 인수로 전달됩니다.

Artifact Registry:

gcloud artifacts docker images list --show-occurrences \
--occurrence-filter='kind="DISCOVERY"' --format=json \
LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID

Container Registry:

gcloud beta container images list-tags \
--occurrence-filter='kind="DISCOVERY"' --format=json HOSTNAME/PROJECT_ID/IMAGE_ID

API

탐색 어커런스를 검색하려면 필터 표현식을 아래와 같이 URL로 인코딩하고 GET 요청에 포함해야 합니다.

GET https://containeranalysis.googleapis.com/v1/projects/PROJECT_ID/occurrences?filter=kind%3D%22DISCOVERY%22%20AND%20resourceUrl%3D%22ENCODED_RESOURCE_URL%22

자세한 내용은 projects.occurrences.get API 엔드포인트를 참조하세요.

Java

아티팩트 분석용 클라이언트 라이브러리를 설치하고 사용하는 방법은 아티팩트 분석 클라이언트 라이브러리를 참고하세요. 자세한 내용은 Artifact Analysis Java API 참조 문서를 참고하세요.

Artifact Analysis에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

import com.google.cloud.devtools.containeranalysis.v1.ContainerAnalysisClient;
import io.grafeas.v1.GrafeasClient;
import io.grafeas.v1.Occurrence;
import io.grafeas.v1.ProjectName;
import java.io.IOException;
import java.lang.InterruptedException;

public class GetDiscoveryInfo {
  // Retrieves and prints the Discovery Occurrence created for a specified image
  // The Discovery Occurrence contains information about the initial scan on the image
  public static void getDiscoveryInfo(String resourceUrl, String projectId) 
      throws IOException, InterruptedException {
    // String resourceUrl = "https://gcr.io/project/image@sha256:123";
    // String projectId = "my-project-id";
    String filterStr = "kind=\"DISCOVERY\" AND resourceUrl=\"" + resourceUrl + "\"";
    final String projectName = ProjectName.format(projectId);

    // Initialize client that will be used to send requests. After completing all of your requests, 
    // call the "close" method on the client to safely clean up any remaining background resources.
    GrafeasClient client = ContainerAnalysisClient.create().getGrafeasClient();
    for (Occurrence o : client.listOccurrences(projectName, filterStr).iterateAll()) {
      System.out.println(o);
    }
  }
}

Go

아티팩트 분석용 클라이언트 라이브러리를 설치하고 사용하는 방법은 아티팩트 분석 클라이언트 라이브러리를 참고하세요. 자세한 내용은 Artifact Analysis Go API 참조 문서를 참고하세요.

Artifact Analysis에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.


import (
	"context"
	"fmt"
	"io"

	containeranalysis "cloud.google.com/go/containeranalysis/apiv1"
	"google.golang.org/api/iterator"
	grafeaspb "google.golang.org/genproto/googleapis/grafeas/v1"
)

// getDiscoveryInfo retrieves and prints the Discovery Occurrence created for a specified image.
// The Discovery Occurrence contains information about the initial scan on the image.
func getDiscoveryInfo(w io.Writer, resourceURL, projectID string) error {
	// Use this style of URL when you use Google Container Registry.
	// resourceURL := "https://gcr.io/my-project/my-repo/my-image"
	// Use this style of URL when you use Google Artifact Registry.
	// resourceURL := "https://LOCATION-docker.pkg.dev/my-project/my-repo/my-image"
	ctx := context.Background()
	client, err := containeranalysis.NewClient(ctx)
	if err != nil {
		return fmt.Errorf("NewClient: %w", err)
	}
	defer client.Close()

	req := &grafeaspb.ListOccurrencesRequest{
		Parent: fmt.Sprintf("projects/%s", projectID),
		Filter: fmt.Sprintf(`kind="DISCOVERY" AND resourceUrl=%q`, resourceURL),
	}
	it := client.GetGrafeasClient().ListOccurrences(ctx, req)
	for {
		occ, err := it.Next()
		if err == iterator.Done {
			break
		}
		if err != nil {
			return fmt.Errorf("occurrence iteration error: %w", err)
		}
		fmt.Fprintln(w, occ)
	}
	return nil
}

Node.js

아티팩트 분석용 클라이언트 라이브러리를 설치하고 사용하는 방법은 아티팩트 분석 클라이언트 라이브러리를 참고하세요. 자세한 내용은 Artifact Analysis Node.js API 참조 문서를 참고하세요.

Artifact Analysis에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

/**
 * TODO(developer): Uncomment these variables before running the sample
 */
// const projectId = 'your-project-id', // Your GCP Project ID
// If you are using Google Container Registry
// const imageUrl = 'https://gcr.io/my-project/my-repo/my-image:123' // Image to attach metadata to
// If you are using Google Artifact Registry
// const imageUrl = 'https://LOCATION-docker.pkg.dev/my-project/my-repo/my-image:123' // Image to attach metadata to

// Import the library and create a client
const {ContainerAnalysisClient} = require('@google-cloud/containeranalysis');
const client = new ContainerAnalysisClient();

const formattedParent = client.getGrafeasClient().projectPath(projectId);
// Retrieves and prints the Discovery Occurrence created for a specified image
// The Discovery Occurrence contains information about the initial scan on the image
const [occurrences] = await client.getGrafeasClient().listOccurrences({
  parent: formattedParent,
  filter: `kind = "DISCOVERY" AND resourceUrl = "${imageUrl}"`,
});

if (occurrences.length > 0) {
  console.log(`Discovery Occurrences for ${imageUrl}`);
  occurrences.forEach(occurrence => {
    console.log(`${occurrence.name}:`);
  });
} else {
  console.log('No occurrences found.');
}

Ruby

아티팩트 분석용 클라이언트 라이브러리를 설치하고 사용하는 방법은 아티팩트 분석 클라이언트 라이브러리를 참고하세요. 자세한 내용은 Artifact Analysis Ruby API 참조 문서를 참고하세요.

Artifact Analysis에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

# resource_url = "The URL of the resource associated with the occurrence."
#                # e.g. https://gcr.io/project/image@sha256:123
# project_id   = "The Google Cloud project ID of the occurrences to retrieve"

require "google/cloud/container_analysis"

# Initialize the client
client = Google::Cloud::ContainerAnalysis.container_analysis.grafeas_client

parent = client.project_path project: project_id
filter = "kind = \"DISCOVERY\" AND resourceUrl = \"#{resource_url}\""
client.list_occurrences(parent: parent, filter: filter).each do |occurrence|
  # Process discovery occurrence here
  puts occurrence
end

Python

아티팩트 분석용 클라이언트 라이브러리를 설치하고 사용하는 방법은 아티팩트 분석 클라이언트 라이브러리를 참고하세요. 자세한 내용은 Artifact Analysis Python API 참조 문서를 참고하세요.

Artifact Analysis에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

from google.cloud.devtools import containeranalysis_v1


def get_discovery_info(resource_url: str, project_id: str) -> None:
    """Retrieves and prints the discovery occurrence created for a specified
    image. The discovery occurrence contains information about the initial
    scan on the image."""
    # resource_url = 'https://gcr.io/my-project/my-image@sha256:123'
    # project_id = 'my-gcp-project'

    filter_str = f'kind="DISCOVERY" AND resourceUrl="{resource_url}"'
    client = containeranalysis_v1.ContainerAnalysisClient()
    grafeas_client = client.get_grafeas_client()
    project_name = f"projects/{project_id}"
    response = grafeas_client.list_occurrences(parent=project_name, filter_=filter_str)
    for occ in response:
        print(occ)

취약점 어커런스 보기

특정 이미지의 취약점 어커런스를 보려면 필터 표현식을 사용하여 쿼리를 만듭니다.

kind="VULNERABILITY" AND resourceUrl="RESOURCE_URL"

다음 스니펫은 이미지의 취약점 어커런스 목록을 검색하는 방법을 보여줍니다. 코드 스니펫은 Container Registry의 이미지 URL을 지정합니다. Artifact Registry를 사용하는 경우 다음 형식의 URL로 이미지를 지정합니다.

LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID

gcloud

이미지의 취약점 어커런스를 보려면 다음 명령어를 사용하세요.

이 경우 명령어에 표현식이 직접 사용되지는 않지만 동일한 정보가 인수로 전달됩니다.

Artifact Registry

gcloud artifacts docker images list --show-occurrences \
--occurrence-filter='kind="VULNERABILITY"' --format=json \
LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID

Container Registry

gcloud beta container images list-tags \
--occurrence-filter='kind="VULNERABILITY"' --format=json HOSTNAME/PROJECT_ID/IMAGE_ID

API

리소스 URL은 아래와 같이 URL로 인코딩되어 GET 요청에 포함되어야 합니다.

GET https://containeranalysis.googleapis.com/v1/projects/PROJECT_ID/occurrences?filter=kind%3D%22VULNERABILITY%22%20AND%20resourceUrl%3D%22ENCODED_RESOURCE_URL%22

자세한 내용은 projects.occurrences.get API 엔드포인트를 참조하세요.

Java

아티팩트 분석용 클라이언트 라이브러리를 설치하고 사용하는 방법은 아티팩트 분석 클라이언트 라이브러리를 참고하세요. 자세한 내용은 Artifact Analysis Java API 참조 문서를 참고하세요.

Artifact Analysis에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

import com.google.cloud.devtools.containeranalysis.v1.ContainerAnalysisClient;
import io.grafeas.v1.GrafeasClient;
import io.grafeas.v1.Occurrence;
import io.grafeas.v1.ProjectName;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;

public class VulnerabilityOccurrencesForImage {
  // Retrieve a list of vulnerability occurrences assoviated with a resource
  public static List<Occurrence> findVulnerabilityOccurrencesForImage(String resourceUrl, 
      String projectId) throws IOException {
    // String resourceUrl = "https://gcr.io/project/image@sha256:123";
    // String projectId = "my-project-id";
    final String projectName = ProjectName.format(projectId);
    String filterStr = String.format("kind=\"VULNERABILITY\" AND resourceUrl=\"%s\"", resourceUrl);

    // Initialize client that will be used to send requests. After completing all of your requests, 
    // call the "close" method on the client to safely clean up any remaining background resources.
    GrafeasClient client = ContainerAnalysisClient.create().getGrafeasClient();
    LinkedList<Occurrence> vulnerabilitylist = new LinkedList<Occurrence>();
    for (Occurrence o : client.listOccurrences(projectName, filterStr).iterateAll()) {
      vulnerabilitylist.add(o);
    }
    return vulnerabilitylist;
  }
}

Go

아티팩트 분석용 클라이언트 라이브러리를 설치하고 사용하는 방법은 아티팩트 분석 클라이언트 라이브러리를 참고하세요. 자세한 내용은 Artifact Analysis Go API 참조 문서를 참고하세요.

Artifact Analysis에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.


import (
	"context"
	"fmt"

	containeranalysis "cloud.google.com/go/containeranalysis/apiv1"
	"google.golang.org/api/iterator"
	grafeaspb "google.golang.org/genproto/googleapis/grafeas/v1"
)

// findVulnerabilityOccurrencesForImage retrieves all vulnerability Occurrences associated with a resource.
func findVulnerabilityOccurrencesForImage(resourceURL, projectID string) ([]*grafeaspb.Occurrence, error) {
	// Use this style of URL when you use Google Container Registry.
	// resourceURL := "https://gcr.io/my-project/my-repo/my-image"
	// Use this style of URL when you use Google Artifact Registry.
	// resourceURL := "https://LOCATION-docker.pkg.dev/my-project/my-repo/my-image"
	ctx := context.Background()
	client, err := containeranalysis.NewClient(ctx)
	if err != nil {
		return nil, fmt.Errorf("NewClient: %w", err)
	}
	defer client.Close()

	req := &grafeaspb.ListOccurrencesRequest{
		Parent: fmt.Sprintf("projects/%s", projectID),
		Filter: fmt.Sprintf("resourceUrl = %q kind = %q", resourceURL, "VULNERABILITY"),
	}

	var occurrenceList []*grafeaspb.Occurrence
	it := client.GetGrafeasClient().ListOccurrences(ctx, req)
	for {
		occ, err := it.Next()
		if err == iterator.Done {
			break
		}
		if err != nil {
			return nil, fmt.Errorf("occurrence iteration error: %w", err)
		}
		occurrenceList = append(occurrenceList, occ)
	}

	return occurrenceList, nil
}

Node.js

아티팩트 분석용 클라이언트 라이브러리를 설치하고 사용하는 방법은 아티팩트 분석 클라이언트 라이브러리를 참고하세요. 자세한 내용은 Artifact Analysis Node.js API 참조 문서를 참고하세요.

Artifact Analysis에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

/**
 * TODO(developer): Uncomment these variables before running the sample
 */
// const projectId = 'your-project-id', // Your GCP Project ID
// If you are using Google Container Registry
// const imageUrl = 'https://gcr.io/my-project/my-repo/my-image:123' // Image to attach metadata to
// If you are using Google Artifact Registry
// const imageUrl = 'https://LOCATION-docker.pkg.dev/my-project/my-repo/my-image:123' // Image to attach metadata to

// Import the library and create a client
const {ContainerAnalysisClient} = require('@google-cloud/containeranalysis');
const client = new ContainerAnalysisClient();

const formattedParent = client.getGrafeasClient().projectPath(projectId);

// Retrieve a list of vulnerability occurrences assoviated with a resource
const [occurrences] = await client.getGrafeasClient().listOccurrences({
  parent: formattedParent,
  filter: `kind = "VULNERABILITY" AND resourceUrl = "${imageUrl}"`,
});

if (occurrences.length) {
  console.log(`All Vulnerabilities for ${imageUrl}`);
  occurrences.forEach(occurrence => {
    console.log(`${occurrence.name}:`);
  });
} else {
  console.log('No occurrences found.');
}

Ruby

아티팩트 분석용 클라이언트 라이브러리를 설치하고 사용하는 방법은 아티팩트 분석 클라이언트 라이브러리를 참고하세요. 자세한 내용은 Artifact Analysis Ruby API 참조 문서를 참고하세요.

Artifact Analysis에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

# resource_url = "The URL of the resource associated with the occurrence
#                e.g. https://gcr.io/project/image@sha256:123"
# project_id   = "The Google Cloud project ID of the vulnerabilities to find"

require "google/cloud/container_analysis"

# Initialize the client
client = Google::Cloud::ContainerAnalysis.container_analysis.grafeas_client

parent = client.project_path project: project_id
filter = "resourceUrl = \"#{resource_url}\" AND kind = \"VULNERABILITY\""
client.list_occurrences parent: parent, filter: filter

Python

아티팩트 분석용 클라이언트 라이브러리를 설치하고 사용하는 방법은 아티팩트 분석 클라이언트 라이브러리를 참고하세요. 자세한 내용은 Artifact Analysis Python API 참조 문서를 참고하세요.

Artifact Analysis에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

from typing import List

from google.cloud.devtools import containeranalysis_v1
from grafeas.grafeas_v1 import types


def find_vulnerabilities_for_image(
    resource_url: str, project_id: str
) -> List[types.grafeas.Occurrence]:
    """ "Retrieves all vulnerability occurrences associated with a resource."""
    # resource_url = 'https://gcr.io/my-project/my-image@sha256:123'
    # project_id = 'my-gcp-project'

    client = containeranalysis_v1.ContainerAnalysisClient()
    grafeas_client = client.get_grafeas_client()
    project_name = f"projects/{project_id}"

    filter_str = 'kind="VULNERABILITY" AND resourceUrl="{}"'.format(resource_url)
    return list(grafeas_client.list_occurrences(parent=project_name, filter=filter_str))

특정 유형의 어커런스 보기

앞의 두 예시에 나온 필터 표현식의 유일한 차이점은 어커런스 유형을 식별하는 kind 값입니다. 이 필드를 사용하여 취약점 또는 배포와 같은 특정 유형의 어커런스로 목록을 제한할 수 있습니다.

특정 이미지의 어커런스를 검색하려면 다음 필터 표현식을 사용합니다.

kind="NOTE_KIND" AND resourceUrl="RESOURCE_URL"

각 항목의 의미는 다음과 같습니다.

  • NOTE_KIND는 메모의 종류입니다.
    • 예를 들어 탐색 어커런스를 나열하려면 DISCOVERY 종류를 사용합니다. 이는 이미지를 처음에 Container Registry로 내보낼 때 생성됩니다.
    • 취약점 어커런스를 나열하려면 VULNERABILITY 종류를 사용하세요.
  • RESOURCE_URLhttps://HOSTNAME/PROJECT_ID/IMAGE_ID@sha256:HASH 이미지의 전체 URL입니다.

여러 이미지에서 특정 종류의 어커런스를 검색하는 필터 표현식은 다음과 같습니다.

kind="NOTE_KIND" AND has_prefix(resourceUrl, "RESOURCE_URL_PREFIX")

각 항목의 의미는 다음과 같습니다.

  • RESOURCE_URL_PREFIX는 일부 이미지의 URL 프리픽스입니다.
    • 이미지의 모든 버전을 나열하려면 https://HOSTNAME/PROJECT_ID/IMAGE_ID@를 사용하세요.
    • 프로젝트의 모든 이미지를 나열하려면 https://HOSTNAME/PROJECT_ID/을 사용하세요.

특정 메모와 연결된 이미지 보기

특정 메모 ID와 연결된 리소스 목록을 검색할 수 있습니다. 예를 들어 특정 CVE 취약점이 있는 이미지를 나열할 수 있습니다.

프로젝트에서 특정 메모와 연결된 모든 이미지를 나열하려면 다음 필터 표현식을 사용합니다.

noteProjectId="PROVIDER_PROJECT_ID" AND noteId="NOTE_ID"

특정 메모의 특정 이미지를 확인하려면 다음 필터 표현식을 사용합니다.

resourceUrl="RESOURCE_URL" AND noteProjectId="PROVIDER_PROJECT_ID" \
    AND noteId="NOTE_ID"

각 항목의 의미는 다음과 같습니다.

  • PROVIDER_PROJECT_ID는 제공업체 프로젝트의 ID입니다. 예를 들어 goog-vulnz는 기본 취약점 분석을 제공합니다.
  • NOTE_ID는 메모의 ID입니다. 보안 관련 메모는 대개 CVE-2019-12345 형식입니다.
  • RESOURCE_URLhttps://HOSTNAME/PROJECT_ID/IMAGE_ID@sha256:HASH 이미지의 전체 URL입니다.

예를 들어 Google에서 분석한 대로 CVE-2017-16231의 어커런스가 있는 모든 이미지를 확인하려면 다음 필터 표현식을 사용합니다.

noteProjectId="goog-vulnz" AND noteId="CVE-2017-16231"

다음 단계