オンデマンドでのイメージのスキャン

On-Demand Scanning API を使用すると、お使いのパソコン、Container Registry、または Artifact Registry に格納されているローカル イメージをスキャンできます。これにより、脆弱性をスキャンするコンテナを細かく制御できます。レジストリにイメージを保存するかどうかを判断する前に、オンデマンド スキャンを使用して CI/CD パイプライン内のイメージをスキャンできます。

料金情報については、料金ページをご覧ください。

このページでは、オンデマンド スキャンを使用してコンテナ イメージを手動でスキャンする方法について説明します。

始める前に

  1. Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  3. Google Cloud プロジェクトで課金が有効になっていることを確認します

  4. On-Demand Scanning API を有効にします。

    API を有効にする

  5. Google Cloud CLI をインストールします。
  6. gcloud CLI を初期化するには:

    gcloud init
  7. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  8. Google Cloud プロジェクトで課金が有効になっていることを確認します

  9. On-Demand Scanning API を有効にします。

    API を有効にする

  10. Google Cloud CLI をインストールします。
  11. gcloud CLI を初期化するには:

    gcloud init
  12. Cloud SDK インストールに local-extract コンポーネントを追加する

    Cloud SDK コンポーネント マネージャーの使用

    スキャン コマンドを初めて実行したときに、必須コンポーネントのインストールを求めるプロンプトがコンポーネント マネージャーに表示されます。

    システム パッケージ マネージャーを使用する

    • 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 [--remote] [--location=(us,europe,asia)] [--async]

ここで

  • --remote はオプションのイメージです。Artifact Registry または Container Registry でイメージがリモートでホストされている場合に使用します。 リモート イメージには、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_URI には REPOSTIORY_ID を含める必要があります。

    ローカル イメージの場合は、--remote フラグを省略し、IMAGE_URI で次のいずれかの形式を使用します。

    • IMAGE_ID:TAG
    • IMAGE_ID
  • --location は、スキャンを実行するマルチリージョンを手動で選択するためのオプションのフラグです。物理的なロケーションに近いマルチリージョンに近いリージョンを選択すると、レイテンシを最小限に抑えることができます。指定できるロケーションは、useuropeasia です。デフォルトの場所は us です。

  • --async は、スキャン プロセスを非同期で実行するオプションのフラグです。このフラグを省略すると、デバイスはスキャン プロセスが完了するまでブロックされます。

同期スキャン

次の例は、--async フラグなしの同期スキャンの出力を示しています。

$ gcloud artifacts docker images scan ubuntu:latest

✓ 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: ubuntu:latest
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 ubuntu:latest --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: ubuntu:latest
name: projects/my-project/locations/us/operations/2e1a6b1f-16e5-4427-ac86-72c998a3dd16

これにより、長時間実行オペレーションが起動され、ターミナルをブロックせずにその ID が返されます。演算 ID を使用できます。値はname出力メッセージの最後の行にオペレーションをポーリングするを使用して Google Cloud Storage とやり取りできます。

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

非同期スキャン コマンドの出力のオペレーション 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: ubuntu:latest
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 は、出力に表示されるオカレンスの数を制限するオプションのフラグです。

次に例を示します。

gcloud artifacts docker images list-vulnerabilities \
projects/my-project/locations/us/scans/2fe2bfb8-f0c5-4dd6-a8c8-38961869767a

createTime: '2021-01-05T23:05:42.956227Z'
kind: VULNERABILITY
name: projects/my-project/locations/us/occurrences/f82a1efd-a261-4973-acbd-f9854d8b8135
noteName: projects/goog-vulnz/notes/CVE-2018-1000654
resourceUri: ubuntu:latest
updateTime: '2021-01-05T23:05:42.956227Z'
vulnerability:
  cvssScore: 7.1
  effectiveSeverity: LOW
  packageIssue:
  - affectedCpeUri: cpe:/o:canonical:ubuntu_linux:20.04
    affectedPackage: libtasn1-6
    affectedVersion:
      kind: NORMAL
      name: 4.16.0
      revision: '2'
    fixedCpeUri: cpe:/o:canonical:ubuntu_linux:20.04
    fixedPackage: libtasn1-6
    fixedVersion:
      kind: MAXIMUM
  severity: HIGH

このコマンドの出力は、Grafeas 形式のオカレンスのリストです。この場合、イメージで見つかった重大度の高い脆弱性が表示されます。

スキャン結果は、スキャン操作が完了してから 48 時間使用可能です。

次のステップ