GSP1184

概要
ソフトウェアの脆弱性とは、偶発的なシステム障害の原因になったり、不正な行為者にソフトウェアを侵害する手段を提供したりする可能性がある弱点です。Artifact Analysis は、コンテナの脆弱性を検出するために、次の 2 種類の OS スキャンを提供します。
-
On-Demand Scanning API を使用すると、ローカルのコンピュータ上にあるコンテナ イメージ、または Artifact Registry にあるリモートのコンテナ イメージに対して、OS の脆弱性を手動でスキャンできます。これにより、脆弱性をスキャンするコンテナをきめ細かく制御できます。
-
Container Scanning API を使用すると、OS の脆弱性検出を自動化し、Artifact Registry にイメージを push するたびにスキャンできます。On-Demand Scanning API を使用すると、イメージをレジストリに保存するかどうかを決定する前に、CI / CD パイプラインでイメージをスキャンできます。この API を有効にすると、Go と Java の脆弱性を検出する言語パッケージ スキャンも有効になります。
このラボでは、Cloud Build を使用して、Artifact Registry に保存するコンテナ イメージをビルドし、脆弱性をスキャンする方法を学びます。
学習内容
このラボでは以下を行います。
- Cloud Build を使用してイメージをビルドする
- コンテナに Artifact Registry を使用する
- 自動化された脆弱性スキャンを利用する
- オンデマンド スキャンを設定する
- Cloud Build の CI / CD にイメージ スキャンを追加する
設定と要件
[ラボを開始] ボタンをクリックする前に
こちらの説明をお読みください。ラボには時間制限があり、一時停止することはできません。タイマーは Google Cloud のリソースを利用できる時間を示しており、[ラボを開始] をクリックするとスタートします。
このハンズオンラボでは、シミュレーションやデモ環境ではなく実際のクラウド環境を使って、ご自身でラボのアクティビティを行います。そのため、ラボの受講中に Google Cloud にログインおよびアクセスするための、新しい一時的な認証情報が提供されます。
このラボを完了するためには、以下が必要です。
- 標準的なインターネット ブラウザ(Chrome を推奨)
注: このラボの実行には、シークレット モードまたはシークレット ブラウジング ウィンドウを使用してください。これにより、個人アカウントと受講者アカウント間の競合を防ぎ、個人アカウントに追加料金が発生しないようにすることができます。
- ラボを完了するための時間(開始後は一時停止できません)
注: すでに個人の Google Cloud アカウントやプロジェクトをお持ちの場合でも、このラボでは使用しないでください。アカウントへの追加料金が発生する可能性があります。
ラボを開始して Google Cloud コンソールにログインする方法
-
[ラボを開始] ボタンをクリックします。ラボの料金をお支払いいただく必要がある場合は、表示されるポップアップでお支払い方法を選択してください。
左側の [ラボの詳細] パネルには、以下が表示されます。
- [Google Cloud コンソールを開く] ボタン
- 残り時間
- このラボで使用する必要がある一時的な認証情報
- このラボを行うために必要なその他の情報(ある場合)
-
[Google Cloud コンソールを開く] をクリックします(Chrome ブラウザを使用している場合は、右クリックして [シークレット ウィンドウで開く] を選択します)。
ラボでリソースがスピンアップし、別のタブで [ログイン] ページが表示されます。
ヒント: タブをそれぞれ別のウィンドウで開き、並べて表示しておきましょう。
注: [アカウントの選択] ダイアログが表示されたら、[別のアカウントを使用] をクリックします。
-
必要に応じて、下のユーザー名をコピーして、[ログイン] ダイアログに貼り付けます。
{{{user_0.username | "Username"}}}
[ラボの詳細] パネルでもユーザー名を確認できます。
-
[次へ] をクリックします。
-
以下のパスワードをコピーして、[ようこそ] ダイアログに貼り付けます。
{{{user_0.password | "Password"}}}
[ラボの詳細] パネルでもパスワードを確認できます。
-
[次へ] をクリックします。
重要: ラボで提供された認証情報を使用する必要があります。Google Cloud アカウントの認証情報は使用しないでください。
注: このラボでご自身の Google Cloud アカウントを使用すると、追加料金が発生する場合があります。
-
その後次のように進みます。
- 利用規約に同意します。
- 一時的なアカウントなので、復元オプションや 2 要素認証プロセスは設定しないでください。
- 無料トライアルには登録しないでください。
その後、このタブで Google Cloud コンソールが開きます。
注: Google Cloud のプロダクトやサービスのリストを含むメニューを表示するには、左上のナビゲーション メニューをクリックします。
Cloud Shell をアクティブにする
Cloud Shell は、開発ツールと一緒に読み込まれる仮想マシンです。5 GB の永続ホーム ディレクトリが用意されており、Google Cloud で稼働します。Cloud Shell を使用すると、コマンドラインで Google Cloud リソースにアクセスできます。
- Google Cloud コンソールの上部にある「Cloud Shell をアクティブにする」アイコン
をクリックします。
接続した時点で認証が完了しており、プロジェクトに各自の Project_ID、 が設定されます。出力には、このセッションの PROJECT_ID を宣言する次の行が含まれています。
Your Cloud Platform project in this session is set to {{{project_0.project_id | "PROJECT_ID"}}}
gcloud は Google Cloud のコマンドライン ツールです。このツールは、Cloud Shell にプリインストールされており、タブ補完がサポートされています。
- (省略可)次のコマンドを使用すると、有効なアカウント名を一覧表示できます。
gcloud auth list
- [承認] をクリックします。
出力:
ACTIVE: *
ACCOUNT: {{{user_0.username | "ACCOUNT"}}}
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- (省略可)次のコマンドを使用すると、プロジェクト ID を一覧表示できます。
gcloud config list project
出力:
[core]
project = {{{project_0.project_id | "PROJECT_ID"}}}
注: Google Cloud における gcloud ドキュメントの全文については、gcloud CLI の概要ガイドをご覧ください。
環境設定
- Cloud Shell で、プロジェクトのプロジェクト ID とプロジェクト番号を設定します。これらを変数
PROJECT_ID と PROJECT_NUMBER として保存します。
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID \
--format='value(projectNumber)')
- 必要なサービスをすべて有効にします。
gcloud services enable \
cloudkms.googleapis.com \
cloudbuild.googleapis.com \
container.googleapis.com \
containerregistry.googleapis.com \
artifactregistry.googleapis.com \
containerscanning.googleapis.com \
ondemandscanning.googleapis.com \
binaryauthorization.googleapis.com
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
必要な API を有効にする
タスク 1. Cloud Build を使用してイメージをビルドする
このセクションでは、自動化されたコンテナ イメージを作成して、コンテナ イメージをビルドしてスキャンし、結果を評価します。CRITICAL の脆弱性が検出されなかった場合、イメージがリポジトリに push されます。CRITICAL の脆弱性が検出された場合、ビルドは失敗して終了します。
- Cloud Build サービス アカウントのアクセス権を付与します。
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" \
--role="roles/iam.serviceAccountUser"
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" \
--role="roles/ondemandscanning.admin"
Cloud Build には、On-Demand Scanning API へのアクセス権が必要です。次のコマンドを使用してアクセス権を付与します。
- 作業ディレクトリを作成し、そのディレクトリに移動します。
mkdir vuln-scan && cd vuln-scan
- サンプル イメージを定義します。
次の内容で Dockerfile という名前のファイルを作成します。
cat > ./Dockerfile << EOF
FROM gcr.io/google-appengine/debian11
# System
RUN apt update && apt install python3-pip -y
# App
WORKDIR /app
COPY . ./
RUN pip3 install Flask==1.1.4
RUN pip3 install gunicorn==20.1.0
CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app
EOF
- 次の内容で main.py という名前のファイルを作成します。
cat > ./main.py << EOF
import os
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello_world():
name = os.environ.get("NAME", "Worlds")
return "Hello {}!".format(name)
if __name__ == "__main__":
app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))
EOF
Cloud Build パイプラインを作成する
自動プロセスで使用される cloudbuild.yaml ファイルをディレクトリに作成します。このラボでは、手順はコンテナのビルドプロセスに限定されています。実際には、コンテナの手順だけでなく、アプリケーション固有の手順やテストを実施する必要があります。
- 次のコマンドを使用してファイルを作成します。
cat > ./cloudbuild.yaml << EOF
steps:
# build
- id: "build"
name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', '{{{ project_0.default_region | "REGION" }}}-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image', '.']
waitFor: ['-']
EOF
- CI パイプラインを実行します。
ビルドを送信して処理します。
gcloud builds submit
- ビルドプロセスが開始されたら、Cloud コンソールで Cloud Build のダッシュボードを開いて内容を確認します。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
Cloud Build を使用してイメージをビルドする
タスク 2. コンテナに Artifact Registry を使用する
Artifact Registry リポジトリを作成する
Artifact Registry にイメージを保存し、スキャンします。
- 次のコマンドを使用してリポジトリを作成します。
gcloud artifacts repositories create artifact-scanning-repo \
--repository-format=docker \
--location={{{ project_0.default_region | "REGION" }}} \
--description="Docker repository"
- Artifact Registry にアクセスするときに gcloud 認証情報を使用するように Docker を構成します。
gcloud auth configure-docker {{{ project_0.default_region | "REGION" }}}-docker.pkg.dev
- 作成されたイメージを Artifact Registry に push するように Cloud Build パイプラインを変更します。
cat > ./cloudbuild.yaml << EOF
steps:
# build
- id: "build"
name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', '{{{ project_0.default_region | "REGION" }}}-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image', '.']
waitFor: ['-']
# push to artifact registry
- id: "push"
name: 'gcr.io/cloud-builders/docker'
args: ['push', '{{{ project_0.default_region | "REGION" }}}-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image']
images:
- {{{ project_0.default_region | "REGION" }}}-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image
EOF
- CI パイプラインを実行します。
gcloud builds submit
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
Artifact Registry リポジトリを作成する
タスク 3. 自動化された脆弱性スキャン
Artifact Registry に新しいイメージを push するたびにスキャンが自動的にトリガーされます。脆弱性情報は、新しい脆弱性が発見されるたびに更新されます。
このセクションでは、作成した Artifact Registry に push したイメージを確認し、脆弱性の結果を調べます。
イメージの詳細を確認する
ビルドプロセスが完了したら、Artifact Registry のダッシュボードでイメージと脆弱性の結果を確認します。
- Cloud コンソールで、[Artifact Registry] を開きます。
- [artifact-scanning-repo] をクリックして、内容を確認します。
- イメージの詳細をクリックします。
- イメージの最新のダイジェストをクリックします。
- スキャンが完了したら、イメージの [脆弱性] タブをクリックします。
[脆弱性] タブには、ビルドしたイメージの自動スキャンの結果が表示されます。
自動スキャンはデフォルトで有効になります。自動スキャンをオフまたはオンにする方法は、Artifact Registry の設定で確認してください。
タスク 4. オンデマンド スキャン
イメージをリポジトリに push する前にスキャンを実行する必要があるシナリオは、いくつかあります。たとえば、コンテナ デベロッパーは、コードをソース管理に push する前にイメージをスキャンして、検出された問題を修正できます。
次の例では、結果に基づいて処理を行う前に、イメージをローカルでビルドして分析します。
- ローカル Docker を使用して、イメージをローカル キャッシュにビルドします。
docker build -t {{{ project_0.default_region | "REGION" }}}-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image .
- イメージがビルドされたら、イメージのスキャンをリクエストします。
gcloud artifacts docker images scan \
{{{ project_0.default_region | "REGION" }}}-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image \
--format="value(response.scan)" > scan_id.txt
スキャンの結果はメタデータ サーバーに保存されます。ジョブは、メタデータ サーバー内の結果の場所で完了します。
-
scan_id.txt ファイルに保存された出力を確認します。
cat scan_id.txt
メタデータ サーバー内のスキャン結果のレポートの場所を確認します。
- スキャンの実際の結果を表示するには、出力ファイルに記載されているレポートの場所で
list-vulnerabilities コマンドを使用します。
gcloud artifacts docker images list-vulnerabilities $(cat scan_id.txt)
出力には、イメージ内のすべての脆弱性に関する大量のデータが含まれています。レポートに保存されているデータが直接使用されることはほとんどありません。通常、結果は自動プロセスで使用されます。
- 次のコマンドを使用して、レポートの詳細を読み取り、CRITICAL の脆弱性が見つかった場合はログに記録します。
export SEVERITY=CRITICAL
gcloud artifacts docker images list-vulnerabilities $(cat scan_id.txt) --format="value(vulnerability.effectiveSeverity)" | if grep -Fxq ${SEVERITY}; then echo "Failed vulnerability check for ${SEVERITY} level"; else echo "No ${SEVERITY} Vulnerabilities found"; fi
このコマンドの出力は次のようになります。
Failed vulnerability check for CRITICAL level
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
オンデマンド スキャンを使用してイメージをスキャンする
タスク 5. Cloud Build の CI / CD で Artifact Scanning を使用する
まず、On-Demand Scanning API へのアクセス権を Cloud Build に付与します。
- 次のコマンドを使用してアクセス権を付与します。
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" \
--role="roles/iam.serviceAccountUser"
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" \
--role="roles/ondemandscanning.admin"
- 次のコマンドを使用して Cloud Build パイプラインを更新します。このコマンドは、自動プロセスで使用される
cloudbuild.yaml ファイルを作成します。
cat > ./cloudbuild.yaml << EOF
steps:
# build
- id: "build"
name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', '{{{ project_0.default_region | "REGION" }}}-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image', '.']
waitFor: ['-']
#Run a vulnerability scan at _SECURITY level
- id: scan
name: 'gcr.io/cloud-builders/gcloud'
entrypoint: 'bash'
args:
- '-c'
- |
(gcloud artifacts docker images scan \
{{{ project_0.default_region | "REGION" }}}-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image \
--location us \
--format="value(response.scan)") > /workspace/scan_id.txt
#Analyze the result of the scan
- id: severity check
name: 'gcr.io/cloud-builders/gcloud'
entrypoint: 'bash'
args:
- '-c'
- |
gcloud artifacts docker images list-vulnerabilities \$(cat /workspace/scan_id.txt) \
--format="value(vulnerability.effectiveSeverity)" | if grep -Fxq CRITICAL; \
then echo "Failed vulnerability check for CRITICAL level" && exit 1; else echo "No CRITICAL vulnerability found, congrats !" && exit 0; fi
#Retag
- id: "retag"
name: 'gcr.io/cloud-builders/docker'
args: ['tag', '{{{ project_0.default_region | "REGION" }}}-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image', '{{{ project_0.default_region | "REGION" }}}-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image:good']
#pushing to artifact registry
- id: "push"
name: 'gcr.io/cloud-builders/docker'
args: ['push', '{{{ project_0.default_region | "REGION" }}}-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image:good']
images:
- {{{ project_0.default_region | "REGION" }}}-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image
EOF
この例では、手順はコンテナのビルドプロセスに限定されています。実際には、コンテナの手順だけでなく、アプリケーション固有の手順やテストを含めます。
- ビルドを送信して処理し、重大度が CRITICAL の脆弱性が検出されたときにビルドが中断されることを確認します。
gcloud builds submit
- Cloud Build の [履歴] ページで、ビルドが失敗していることを確認します。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
重大度が CRITICAL の脆弱性が検出された場合にビルドが中断されることを確認する
脆弱性を修正する
CRITICAL の脆弱性が含まれないベースイメージを使用するように Dockerfile を更新します。
- 次のコマンドを使用して、Debian 10 イメージを使用するように Dockerfile を上書きします。
cat > ./Dockerfile << EOF
FROM python:3.8-alpine
# App
WORKDIR /app
COPY . ./
RUN pip3 install Flask==2.1.0
RUN pip3 install gunicorn==20.1.0
RUN pip3 install Werkzeug==2.2.2
CMD exec gunicorn --bind :\$PORT --workers 1 --threads 8 main:app
EOF
- ビルドを送信して処理し、重大度が CRITICAL の脆弱性が検出されなかった場合にビルドが成功することを確認します。
gcloud builds submit
- Cloud コンソールで、[Cloud Build] > Cloud Build の [履歴] に移動して、ビルドの成功を確認します。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
脆弱性を修正する
スキャン結果を確認する
Artifact Registry で正常なイメージを確認します。
- Cloud コンソールで Artifact Registry を開きます。
- [artifact-scanning-repo] をクリックして、内容を確認します。
- イメージの詳細をクリックします。
- イメージの最新のダイジェストをクリックします。
- イメージの [脆弱性] タブをクリックします。
お疲れさまでした
Cloud Build でイメージをビルドして Artifact Registry に保存する方法と、Artifact スキャンが自動的にトリガーされる仕組みについて学びました。また、イメージをソース管理に push する前に「オンデマンド」でスキャンする方法も理解しました。
次のステップと詳細情報
Google Cloud トレーニングと認定資格
Google Cloud トレーニングと認定資格を通して、Google Cloud 技術を最大限に活用できるようになります。クラスでは、技術スキルとベスト プラクティスを迅速に身につけ、学習を継続的に進めることができます。トレーニングは基礎レベルから上級レベルまであり、オンデマンド、ライブ、バーチャル参加など、多忙なスケジュールにも対応できるオプションが用意されています。認定資格を取得することで、Google Cloud テクノロジーに関するスキルと知識を証明できます。
マニュアルの最終更新日: 2025 年 7 月 23 日
ラボの最終テスト日: 2025 年 7 月 23 日
Copyright 2024 Google LLC All rights reserved. Google および Google のロゴは、Google LLC の商標です。その他すべての社名および製品名は、それぞれ該当する企業の商標である可能性があります。