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

    Enable the API

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

    gcloud init
  12. 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 に置き換えることもできます。

  13. オンデマンド スキャンで使用するユーザーまたはサービス アカウントに、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 は、スキャンを行うマルチリージョンを手動で選択するためのオプションのフラグです。物理的なロケーションに近いマルチリージョンを選択すると、レイテンシを最小限に抑えることができます。使用できるロケーションは、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 時間利用できます。

次のステップ