Java 패키지 수동 스캔

On-Demand Scanning API를 사용하면 컴퓨터에 로컬로 저장된 이미지 또는 Artifact Registry에 원격으로 저장된 이미지를 스캔할 수 있습니다. On-Demand Scanning을 사용하면 CI/CD 파이프라인에서 이미지를 스캔하여 시스템 취약점 및 Java (Maven) 패키지 취약점을 확인한 후 이를 레지스트리에 저장할지 여부를 결정할 수 있습니다. 가격 책정 정보는 가격 책정 페이지를 참조하세요.

이 페이지에서는 시스템 취약점 및 Maven 패키지 취약점에 대해 컨테이너 이미지를 수동으로 스캔하는 방법을 설명합니다.

시작하기 전에

  1. 계정에 로그인합니다. Google Cloud 를 처음 사용하는 경우 Google Cloud, 계정을 만들어 실제 시나리오에서 제품이 어떻게 작동하는지 평가하세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the On-Demand Scanning API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  5. Google Cloud CLI를 설치합니다.

  6. 외부 ID 공급업체(IdP)를 사용하는 경우 먼저 제휴 ID로 gcloud CLI에 로그인해야 합니다.

  7. gcloud CLI를 초기화하려면, 다음 명령어를 실행합니다.

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

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  9. Verify that billing is enabled for your Google Cloud project.

  10. Enable the On-Demand Scanning API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  11. Google Cloud CLI를 설치합니다.

  12. 외부 ID 공급업체(IdP)를 사용하는 경우 먼저 제휴 ID로 gcloud CLI에 로그인해야 합니다.

  13. gcloud CLI를 초기화하려면, 다음 명령어를 실행합니다.

    gcloud init
  14. 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
          

      또는 이전 명령어에서 dnfyum로 바꿀 수 있습니다.

  15. On-Demand Scanning과 함께 사용할 사용자 또는 서비스 계정에 On-Demand Scanning 관리자 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_URIREPOSITORY_ID가 포함되어야 합니다.

로컬 스캔과 원격 스캔 모두에서 다음 선택적 플래그를 사용할 수 있습니다.

  • --location 은 스캔이 발생하는 멀티 리전을 수동으로 선택하는 선택적 플래그입니다. 실제 위치에 더 가까운 멀티 리전을 선택하면 지연 시간이 최소화됩니다. 사용 가능한 위치는 us, europe, asia입니다. 기본 위치는 us입니다.

  • --async는 스캔 프로세스를 비동기식으로 실행하는 선택적 플래그입니다. 이 플래그를 생략하면 스캔 프로세스가 완료될 때까지 터미널이 차단됩니다.

동기식 스캔

다음 예시에서는 --async 플래그 없이 동기식 스캔의 출력을 보여줍니다.

$ gcloud artifacts docker images scan jenkins:2.60.3-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: '2021-01-05T23:03:04.185261Z'
  resourceUri: jenkins:2.60.3-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 jenkins:2.60.3-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/cloud-project/locations/us/operations/2e1a6b1f-16e5-4427-ac86-72c998a3dd16] for status.
metadata:
  '@type': type.googleapis.com/google.cloud.ondemandscanning.v1.AnalyzePackagesMetadata
  createTime: '2021-01-05T23:04:54.393510Z'
  resourceUri: jenkins:2.60.3-alpine
name: projects/my-project/locations/us/operations/2e1a6b1f-16e5-4427-ac86-72c998a3dd16

이렇게 하면 장기 실행 작업이 시작되고 터미널을 차단하지 않고 ID가 반환됩니다. 작업 ID(출력 메시지의 마지막 줄에 있는 name의 값)를 사용하여 작업을 작업을 폴링합니다.

장기 실행 작업 폴링

비동기식 스캔 명령어의 출력에서 작업 ID를 사용하여 작업 상태를 확인합니다.

gcloud artifacts docker images get-operation LRO_ID

여기서 LRO_ID는 장기 실행 작업 ID입니다.

비동기식 스캔 섹션의 예시를 계속 진행하여 작업 상태를 확인합니다.

$ gcloud artifacts docker images get-operation \
  projects/cloud-project/locations/us/operations/2e1a6b1f-16e5-4427-ac86-72c998a3dd16

done: true
metadata:
  '@type': type.googleapis.com/google.cloud.ondemandscanning.v1.AnalyzePackagesMetadata
  createTime: '2021-01-05T23:04:54.393510Z'
  resourceUri: jenkins:2.60.3-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: '2021-06-29T17:01:18.819477Z'
kind: VULNERABILITY
name: projects/my-project/locations/us/occurrences/06305977-f557-4772-8586-4260684291d3
noteName: projects/my-project/notes/CVE-2014-0114
resourceUri: jenkins:2.60.3-alpine
updateTime: '2021-06-29T17:01:18.819477Z'
vulnerability:
  cvssScore: 4.3
  effectiveSeverity: MEDIUM
  longDescription: http/conn/ssl/SSLConnectionSocketFactory.java in ...
  packageIssue:
  - affectedCpeUri: cpe:/o:alpine:alpine_linux:3.13
    affectedPackage: org.apache.httpcomponents:httpclient
    affectedVersion:
      fullName: 4.0.2
      kind: NORMAL
      name: 4.0.2
    effectiveSeverity: MEDIUM
    fixedCpeUri: cpe:/o:alpine:alpine_linux:3.13
    fixedPackage: org.apache.httpcomponents:httpclient
    fixedVersion:
      fullName: 4.3.6
      kind: NORMAL
      name: 4.3.6
    packageType: MAVEN
  relatedUrls:
  - label: More Info
    url: https://security-tracker.debian.org/tracker/CVE-2015-5262
  severity: MEDIUM
  shortDescription: CVE-2015-5262

이 명령어의 출력은 a Grafeas 형식의 어커런스 목록입니다. 이 경우 이미지에서 발견된 중간 수준의 심각도 취약점이 하나 표시됩니다. Maven 패키지 취약점에는 packageType:MAVEN 필드가 포함되어 있습니다.

스캔 작업이 완료된 후 48시간 동안 스캔 결과를 확인할 수 있습니다.

다음 단계