Java 패키지 자동 스캔

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

Artifact Analysis는 취약점 정보를 메모로 저장합니다. 이미지와 연결된 메모의 각 인스턴스에 대한 어커런스가 작성됩니다. 자세한 내용은 개요가격 책정 문서를 참고하세요.

시작하기 전에

  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. Verify 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. 외부 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.

    Go to project selector

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

  10. Enable the Artifact Registry and Container Scanning APIs.

    Enable the APIs

  11. Install the Google Cloud CLI.

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

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

    gcloud init
  14. Artifact Registry에 Docker 저장소를 만들고 Java 코드가 포함된 컨테이너 이미지를 저장소에 푸시합니다. Artifact Registry에 익숙하지 않으면 Docker 빠른 시작을 참고하세요.

    Cloud Build를 사용하여 Java 애플리케이션을 빌드하고 컨테이너화하는 방법에 관한 자세한 내용은 Java 애플리케이션 빌드, 테스트, 컨테이너화를 참고하세요.
  15. 이미지 취약점 보기

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

    Google Cloud 콘솔, Google Cloud CLI 또는 Container Analysis API를 사용하여 Artifact Registry 이미지의 취약점 어커런스를 볼 수 있습니다. 이미지에 취약점이 있는 경우 세부정보를 가져올 수 있습니다.

    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
      

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

      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
    

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

    • DEPLOYMENT은 어커런스의 종류입니다.
    • LOCATION은 저장소의 리전 또는 멀티 리전 위치입니다.
    • PROJECT_ID는 Google Cloud 콘솔 프로젝트 ID입니다.
    • REPOSITORY는 이미지가 저장된 저장소의 이름입니다.
    • IMAGE_ID는 저장소의 이미지 이름입니다.

    API

    API 쿼리에서 다음 필터 표현식을 사용합니다.

    kind="DEPLOYMENT" AND resourceUrl="RESOURCE_URL"

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

    • DEPLOYMENT은 어커런스의 종류입니다.
    • RESOURCE_URLhttps://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
    

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

    • VULNERABILITY은 어커런스의 종류입니다.
    • LOCATION은 저장소의 리전 또는 멀티 리전 위치입니다.
    • PROJECT_ID는 Google Cloud 콘솔 프로젝트 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
    

    WHERE

    • LOCATION은 저장소의 리전 또는 멀티 리전 위치입니다.
    • PROJECT_ID는 Google Cloud 콘솔 프로젝트 ID입니다.
    • REPOSITORY는 이미지가 저장된 저장소의 이름입니다.
    • IMAGE_ID는 저장소의 이미지 이름입니다. 이 명령어로 이미지 태그를 지정할 수는 없습니다.

    API

    API 쿼리에 다음 필터 표현식을 추가합니다.

    resourceUrl="RESOURCE_URL" AND noteProjectId="goog-vulnz" \
    AND noteId="NOTE_ID"

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

    • RESOURCE_URLhttps://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 알림을 사용하여 취약점 및 기타 메타데이터에 관한 알림을 받습니다.

    • Artifact Analysis를 Binary Authorization과 통합하여 증명을 만들어 알려진 보안 문제가 있는 컨테이너 이미지가 배포 환경에서 실행되지 않도록 합니다.