Java パッケージを手動でスキャンする

On-Demand Scanning API を使用すると、ローカルのコンピュータに保存されているイメージ、または Artifact Registry または Container Registry にリモートで保存されているイメージをスキャンできます。オンデマンド スキャンを使用して、CI/CD パイプラインのイメージをスキャンし、システムの脆弱性と Java(Maven)パッケージの脆弱性を検出して、レジストリに保存するかどうかを判断できます。詳しい料金情報については、料金ページをご覧ください。

このページでは、コンテナ イメージを手動でスキャンして、システムの脆弱性と Maven パッケージの脆弱性を検出する方法について説明します。

始める前に

  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 On-Demand Scanning API.

    Enable the API

  5. Install the Google Cloud CLI.

  6. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  7. To initialize the gcloud CLI, run the following command:

    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. Make sure that billing is enabled for your Google Cloud project.

  10. Enable the On-Demand Scanning API.

    Enable the API

  11. Install the Google Cloud CLI.

  12. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  13. To initialize the gcloud CLI, run the following command:

    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. オンデマンド スキャンで使用するユーザーまたはサービス アカウントに、IAM ロール オンデマンド スキャン管理者を付与します。プロジェクトのオーナー アカウントを使用してスキャンを実行する場合は、この手順をスキップできます。
  16. コンテナ イメージのスキャン

    • ローカル スキャン:

      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 は、スキャンを行うマルチリージョンを手動で選択するためのオプションのフラグです。物理的なロケーションに近いマルチリージョンを選択すると、レイテンシを最小限に抑えることができます。使用できるロケーションは、useuropeasia です。デフォルトの場所は 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 が返されます。出力メッセージの最後の行にある name の値であるオペレーション ID を使用して、オペレーションをポーリングします。

    長時間実行オペレーションのポーリング

    非同期スキャン コマンドの出力からオペレーション 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]
    

    ここで

    次に例を示します。

    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
    

    このコマンドの出力は、Grafeas 形式の発生リストです。この場合、イメージで検出された中程度の重大度の脆弱性が 1 つ表示されます。Maven パッケージの脆弱性には packageType:MAVEN フィールドが含まれています。

    スキャン結果は、スキャン オペレーションの完了後 48 時間利用できます。

    次のステップ