이미지의 취약점 및 메타데이터 가져오기

컨테이너 분석은 Container Registry의 컨테이너 이미지에 대한 취약점 정보 및 기타 메타데이터 유형을 제공합니다. 메타데이터는 메모로 저장됩니다. 이미지와 연결된 메모의 각 인스턴스에 대한 어커런스가 작성됩니다. 가격 정보는 가격 책정을 참조하세요.

이 페이지에서는 메모 및 어커런스를 보고 필터링하는 방법을 설명합니다.

시작하기 전에

  1. Container Scanning API 사용 설정

  2. 컨테이너 분석 개요 읽기

  3. 프로젝트의 컨테이너 분석 액세스 제어를 구성하는 방법 알아보기

취약점 및 기타 어커런스 보기

Cloud Console, gcloud 명령줄 도구 또는 Container Analysis API를 사용하여 Container Registry 이미지의 어커런스를 볼 수 있습니다. 이미지에 취약점이 있는 경우 세부정보를 가져올 수 있습니다.

이미지의 어커런스를 보려면 다음 안내를 따르세요.

Console

  1. Cloud Console에서 Container Registry 페이지를 엽니다.

    Container Registry 페이지 열기

  2. 이미지 이름을 클릭합니다.

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

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

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

    취약점 목록에는 심각도, 수정 가능 여부, 취약점이 포함된 패키지의 이름이 표시됩니다.

  4. 취약점 소스에서 특정 취약점에 대해 자세히 알아보려면 문서 열의 링크를 클릭하세요.

gcloud 명령어

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

gcloud beta container images list-tags --show-occurrences \
[HOSTNAME]/[PROJECT_ID]/[IMAGE_ID]

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

  • [PROJECT_ID]는 이미지가 포함된 프로젝트의 ID입니다.
  • [IMAGE_ID]는 취약점을 확인할 이미지의 ID입니다.
  • [HOSTNAME]은 레지스트리 이름에 설명된 옵션 중 하나입니다.

이 명령어로 이미지 태그를 지정할 수는 없습니다.

태그 또는 레이어에 대한 정보를 보려면 다음 명령어를 사용하세요.

gcloud beta container images describe [HOSTNAME]/[PROJECT_ID]/[IMAGE_ID]:[TAG]

또는

gcloud beta container images describe [HOSTNAME]/[PROJECT_ID]/[IMAGE_ID]@sha256:[HASH]

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

  • [PROJECT_ID]는 이미지가 포함된 프로젝트의 ID입니다.
  • [IMAGE_ID]는 취약점을 확인할 이미지의 ID입니다.
  • [TAG]는 정보를 얻을 이미지 태그입니다.
  • [HASH]는 이미지 다이제스트입니다.
  • [HOSTNAME]은 레지스트리 이름에 설명된 옵션 중 하나입니다.

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

gcloud beta container images describe [HOSTNAME]/[PROJECT_ID]/[IMAGE_ID]:[TAG]  \
--show-package-vulnerability

또는

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

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

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

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

  • [PROJECT_ID]는 이미지가 포함된 프로젝트의 ID입니다.
  • [IMAGE_ID]는 취약점 어커런스를 확인할 이미지의 ID입니다.
  • [FILTER_EXPRESSION]은 취약점 어커런스 필터링에 설명된 형식의 샘플 필터링 표현식입니다.
  • [HOSTNAME]은 레지스트리 이름에 설명된 옵션 중 하나입니다.

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]

자바

Container Registry용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Container Registry 클라이언트 라이브러리에서 확인할 수 있습니다. 자세한 내용은 Container Registry 자바 API 참조 문서를 확인하세요.

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

Container Registry용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Container Registry 클라이언트 라이브러리에서 확인할 수 있습니다. 자세한 내용은 Container Registry Go API 참조 문서를 확인하세요.


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) {
	// resourceURL := fmt.Sprintf("https://gcr.io/my-project/my-image")
	ctx := context.Background()
	client, err := containeranalysis.NewClient(ctx)
	if err != nil {
		return -1, fmt.Errorf("NewClient: %v", 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: %v", err)
		}
		// Write custom code to process each Occurrence here.
		fmt.Fprintln(w, occ)
		count = count + 1
	}
	return count, nil
}

Node.js

Container Registry용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Container Registry 클라이언트 라이브러리에서 확인할 수 있습니다. 자세한 내용은 Container Registry Node.js API 참조 문서를 확인하세요.

/**
 * TODO(developer): Uncomment these variables before running the sample
 */
// const projectId = 'your-project-id', // Your GCP Project ID
// const imageUrl = 'https://gcr.io/my-project/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 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

Container Registry용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Container Registry 클라이언트 라이브러리에서 확인할 수 있습니다. 자세한 내용은 Container Registry Ruby API 참조 문서를 확인하세요.

# 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

Container Registry용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Container Registry 클라이언트 라이브러리에서 확인할 수 있습니다. 자세한 내용은 Container Registry Python API 참조 문서를 확인하세요.

def get_occurrences_for_image(resource_url, project_id):
    """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'

    from google.cloud.devtools import containeranalysis_v1

    filter_str = 'resourceUrl="{}"'.format(resource_url)
    client = containeranalysis_v1.ContainerAnalysisClient()
    grafeas_client = client.get_grafeas_client()
    project_name = grafeas_client.project_path(project_id)

    response = grafeas_client.list_occurrences(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

어커런스 필터링

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

탐색 어커런스 보기

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

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

kind="DISCOVERY" AND resourceUrl="[RESOURCE_URL]"

다음 스니펫은 위의 필터 표현식을 사용하여 이미지의 탐색 어커런스를 보는 방법을 보여줍니다.

gcloud 명령어

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

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

gcloud beta container images list-tags --show-occurrences \
  --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 엔드포인트를 참조하세요.

자바

Container Registry용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Container Registry 클라이언트 라이브러리에서 확인할 수 있습니다. 자세한 내용은 Container Registry 자바 API 참조 문서를 확인하세요.

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

Container Registry용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Container Registry 클라이언트 라이브러리에서 확인할 수 있습니다. 자세한 내용은 Container Registry Go API 참조 문서를 확인하세요.


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 {
	// resourceURL := fmt.Sprintf("https://gcr.io/my-project/my-image")
	ctx := context.Background()
	client, err := containeranalysis.NewClient(ctx)
	if err != nil {
		return fmt.Errorf("NewClient: %v", 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: %v", err)
		}
		fmt.Fprintln(w, occ)
	}
	return nil
}

Node.js

Container Registry용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Container Registry 클라이언트 라이브러리에서 확인할 수 있습니다. 자세한 내용은 Container Registry Node.js API 참조 문서를 확인하세요.

/**
 * TODO(developer): Uncomment these variables before running the sample
 */
// const projectId = 'your-project-id', // Your GCP Project ID
// const imageUrl = 'https://gcr.io/my-project/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

Container Registry용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Container Registry 클라이언트 라이브러리에서 확인할 수 있습니다. 자세한 내용은 Container Registry Ruby API 참조 문서를 확인하세요.

# 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

Container Registry용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Container Registry 클라이언트 라이브러리에서 확인할 수 있습니다. 자세한 내용은 Container Registry Python API 참조 문서를 확인하세요.

def get_discovery_info(resource_url, project_id):
    """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'

    from google.cloud.devtools import containeranalysis_v1

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

취약점 어커런스 보기

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

kind="VULNERABILITY" AND resourceUrl="[RESOURCE_URL]"

다음 스니펫은 이미지의 취약점 어커런스 목록을 검색하는 방법을 보여줍니다.

gcloud 명령어

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

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

gcloud beta container images list-tags --show-occurrences \
  --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 엔드포인트를 참조하세요.

자바

Container Registry용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Container Registry 클라이언트 라이브러리에서 확인할 수 있습니다. 자세한 내용은 Container Registry 자바 API 참조 문서를 확인하세요.

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

Container Registry용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Container Registry 클라이언트 라이브러리에서 확인할 수 있습니다. 자세한 내용은 Container Registry Go API 참조 문서를 확인하세요.


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) {
	// resourceURL := fmt.Sprintf("https://gcr.io/my-project/my-image")
	ctx := context.Background()
	client, err := containeranalysis.NewClient(ctx)
	if err != nil {
		return nil, fmt.Errorf("NewClient: %v", 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: %v", err)
		}
		occurrenceList = append(occurrenceList, occ)
	}

	return occurrenceList, nil
}

Node.js

Container Registry용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Container Registry 클라이언트 라이브러리에서 확인할 수 있습니다. 자세한 내용은 Container Registry Node.js API 참조 문서를 확인하세요.

/**
 * TODO(developer): Uncomment these variables before running the sample
 */
// const projectId = 'your-project-id', // Your GCP Project ID
// const imageUrl = 'https://gcr.io/my-project/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

Container Registry용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Container Registry 클라이언트 라이브러리에서 확인할 수 있습니다. 자세한 내용은 Container Registry Ruby API 참조 문서를 확인하세요.

# 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

Container Registry용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Container Registry 클라이언트 라이브러리에서 확인할 수 있습니다. 자세한 내용은 Container Registry Python API 참조 문서를 확인하세요.

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

    from google.cloud.devtools import containeranalysis_v1

    client = containeranalysis_v1.ContainerAnalysisClient()
    grafeas_client = client.get_grafeas_client()
    project_name = grafeas_client.project_path(project_id)

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

특정 유형의 어커런스 보기

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

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

kind="[NOTE_KIND]" AND resourceUrl="[RESOURCE_URL]"

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

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

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

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

배포 보기

현재 실행 중인 배포 또는 특정 기간에 실행 중이었던 배포를 나열할 수 있습니다.

현재 실행 중인 배포를 보려면 다음 필터 표현식을 사용합니다.

kind="DEPLOYABLE" AND resourceUrl="[RESOURCE_URL]" AND \
    isNull(undeployTime)

특정 기간에 실행 중이었던 배포를 보려면 다음 필터 표현식을 사용합니다.

kind="DEPLOYABLE" AND resourceUrl="[RESOURCE_URL]" AND \
    deployTime<"[DEPLOY_TIME]" AND \
    undeployTime>"[UNDEPLOY_TIME]"

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

  • [RESOURCE_URL]https://[HOSTNAME]/[PROJECT_ID]/[IMAGE_ID]@sha256:[HASH] 이미지의 전체 URL입니다.
  • [DEPLOY_TIME]은 배포 기간의 시작 시간입니다. RFC 3339 UTC 'Zulu' 형식의 타임스탬프를 사용합니다(정밀도는 나노초 수준). 예: "2014-10-02T15:01:23.045123456Z"
  • [UNDEPLOY_TIME]은 배포 기간의 종료입니다. RFC 3339 UTC 'Zulu' 형식의 타임스탬프를 사용합니다(정밀도는 나노초 수준).

다음 단계

  • 빌드 파이프 라인의 일부로 취약점 정보를 사용하는 방법에 대한 안내는 컨테이너 분석에서 허용 목록 기반 취약점 스캔을 참조하세요.

  • 컨테이너 분석을 이용해 고객의 메타데이터를 저장하고 관리하는 방법에 대한 안내는 이미지의 메타데이터 제공을 참조하세요.

  • Binary Authorization을 취약점 스캔과 통합하면 알려진 보안 문제가 있는 이미지가 배포 환경에서 실행되는 일을 막을 수 있습니다. 이 작업을 수행하는 방법에 대한 안내는 취약점 스캔 통합을 참조하세요.