实验设置说明和要求
保护您的账号和进度。请务必在无痕浏览器窗口中,使用实验凭证运行此实验。

使用 Cloud Build 保護建構作業

实验 20 分钟 universal_currency_alt 5 积分 show_chart 中级
info 此实验可能会提供 AI 工具来支持您学习。
此内容尚未针对移动设备进行优化。
为获得最佳体验,请在桌面设备上访问通过电子邮件发送的链接。

GSP1184

Google Cloud 自修研究室

總覽

軟體安全漏洞是指可能導致系統意外故障的弱點,或是惡意行為人用來入侵軟體的方法。Artifact Analysis 提供兩種 OS 掃描功能,可找出容器中的安全漏洞:

  • On-Demand Scanning API 可讓您手動掃描容器映像檔,找出 OS 安全漏洞,無論是電腦本機或遠端 Artifact Registry 中的映像檔都適用。如此一來便能精確控管要掃描哪些容器的安全漏洞。
  • Container Scanning API 可讓您自動偵測 OS 安全漏洞,每次將映像檔推送至 Artifact Registry 時都會掃描。您可以使用 On-Demand Scanning 掃描 CI/CD 管道中的映像檔,再決定是否要儲存在註冊資料庫中。啟用這項 API 後,系統也會進行語言套件掃描,檢查 Go 和 Java 安全漏洞。

在本實驗室中,您將瞭解如何使用 Cloud Build,建構儲存在 Artifact Registry 中的容器映像檔,並執行掃描,檢查是否有安全漏洞。

課程內容

在本實驗室中,您將:

  • 使用 Cloud Build 建構映像檔
  • 使用 Artifact Registry 管理容器
  • 使用自動安全漏洞掃描功能
  • 設定 On-Demand Scanning
  • 在 Cloud Build 的 CI/CD 中新增映像檔掃描功能

設定和需求

實驗室活動開跑須知

請詳閱以下操作說明。實驗室活動會計時,中途無法暫停。點選「Start Lab」後就會開始計時,顯示可使用 Google Cloud 資源的時間。

您將在真正雲端環境中完成實作,而不是在模擬或示範環境。因此,我們會提供新的臨時憑證,讓您在實驗室活動期間登入及存取 Google Cloud。

如要順利完成這個實驗室活動,請先確認:

  • 可以使用標準的網路瀏覽器 (Chrome 瀏覽器為佳)。
注意:請使用無痕模式或私密瀏覽視窗執行本實驗室,防止個人帳戶和學生帳戶之間的衝突,避免個人帳戶產生額外費用。
  • 該來完成實驗室活動了!別忘了,活動開始後就無法暫停。
注意:如果您擁有個人 Google Cloud 帳戶或專案,請勿用於本研究室,以免產生額外費用。

如何開始實驗室及登入 Google Cloud 控制台

  1. 按一下「Start Lab」按鈕。如果實驗室會產生費用,畫面中會出現選擇付款方式的彈出式視窗。左側的「Lab Details」窗格會顯示下列項目:

    • 「Open Google Cloud console」按鈕
    • 剩餘時間
    • 必須在這個實驗室使用的臨時憑證
    • 完成這個實驗室所需的其他資訊 (如有)
  2. 點選「Open Google Cloud console」;如果使用 Chrome 瀏覽器,也可以按一下滑鼠右鍵,選取「在無痕視窗中開啟連結」

    接著,實驗室會啟動相關資源並開啟另一個分頁,當中顯示「登入」頁面。

    提示:您可以在不同的視窗中並排開啟分頁。

    注意:頁面中顯示「選擇帳戶」對話方塊時,請點選「使用其他帳戶」
  3. 如有必要,請將下方的 Username 貼到「登入」對話方塊。

    {{{user_0.username | "Username"}}}

    您也可以在「Lab Details」窗格找到 Username

  4. 點按「Next」

  5. 複製下方的 Password,並貼到「歡迎使用」對話方塊。

    {{{user_0.password | "Password"}}}

    您也可以在「Lab Details」窗格找到 Password

  6. 點選「下一步」

    重要事項:請務必使用實驗室提供的憑證,而非自己的 Google Cloud 帳戶憑證。 注意:如果使用自己的 Google Cloud 帳戶來進行這個實驗室,可能會產生額外費用。
  7. 按過後續的所有頁面:

    • 接受條款及細則。
    • 由於這是臨時帳戶,請勿新增救援選項或雙重驗證機制。
    • 請勿申請免費試用。

Google Cloud 控制台稍後會在這個分頁開啟。

注意:如要查看列出 Google Cloud 產品和服務的選單,請點選左上角的「導覽選單」「導覽選單」圖示

啟動 Cloud Shell

Cloud Shell 是搭載多項開發工具的虛擬機器,提供永久的 5 GB 主目錄,而且在 Google Cloud 中運作。Cloud Shell 提供指令列存取權,方便您使用 Google Cloud 資源。

  1. 點按 Google Cloud 控制台頂端的「啟用 Cloud Shell」圖示 「啟動 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,並支援 Tab 鍵自動完成功能。

  1. (選用) 您可以執行下列指令來列出使用中的帳戶:
gcloud auth list
  1. 點按「授權」

輸出內容:

ACTIVE: * ACCOUNT: {{{user_0.username | "ACCOUNT"}}} To set the active account, run: $ gcloud config set account `ACCOUNT`
  1. (選用) 您可以使用下列指令來列出專案 ID:
gcloud config list project

輸出內容:

[core] project = {{{project_0.project_id | "PROJECT_ID"}}} 注意:如需 gcloud 的完整說明,請前往 Google Cloud 參閱 gcloud CLI 總覽指南

環境設定

  1. 在 Cloud Shell 設定專案的專案 ID 和專案編號,分別儲存為 PROJECT_IDPROJECT_NUMBER 變數:
export PROJECT_ID=$(gcloud config get-value project) export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID \ --format='value(projectNumber)')
  1. 啟用所有必要的服務:
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

點選「Check my progress」確認目標已達成。

啟用必用的 API。

工作 1:使用 Cloud Build 建構映像檔

在本節中,您將建立自動化的建構管道,以打造容器映像檔、執行掃描,然後評估結果。如果未發現重大安全漏洞,系統就會將映像檔推送至存放區。如果發現重大安全漏洞,建構作業就會失敗並結束。

  1. 提供 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 的存取權。使用下列指令提供存取權。

  1. 建立並變更為工作目錄:
mkdir vuln-scan && cd vuln-scan
  1. 定義範例映像檔:

建立名為 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
  1. 建立名為 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 檔案,供自動化程序使用。本實驗室的步驟僅限於容器建構程序。不過,實際上,除了容器步驟,您還會加入應用程式專用操作說明和測試。

  1. 使用下列指令建立檔案:
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
  1. 執行 CI 管道:

提交建構作業以供處理:

gcloud builds submit
  1. 建構程序開始後,請在 Cloud 控制台開啟 Cloud Build 資訊主頁,查看內容。

點選「Check my progress」確認目標已達成。

使用 Cloud Build 建構映像檔

工作 2:使用 Artifact Registry 管理容器

建立 Artifact Registry 存放區

您將使用 Artifact Registry 儲存及掃描映像檔。

  1. 使用下列指令建立存放區:
gcloud artifacts repositories create artifact-scanning-repo \ --repository-format=docker \ --location={{{ project_0.default_region | "REGION" }}} \ --description="Docker repository"
  1. 設定 Docker,在存取 Artifact Registry 時使用 gcloud 憑證:
gcloud auth configure-docker {{{ project_0.default_region | "REGION" }}}-docker.pkg.dev
  1. 修改 Cloud Build 管道,將產生的映像檔推送至 Artifact Registry:
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
  1. 執行 CI 管道:
gcloud builds submit

點選「Check my progress」確認目標已達成。

建立 Artifact Registry 存放區

工作 3:自動化安全漏洞掃描

每當您將新映像檔推送到 Artifact Registry 時,系統就會自動觸發掃描作業。發現新的安全漏洞時,系統會持續更新安全漏洞資訊。

在本節中,您將查看剛建構並推送至 Artifact Registry 的映像檔,並探索安全漏洞結果。

查看映像檔詳細資料

建構程序完成後,請在 Artifact Registry 資訊主頁查看映像檔和安全漏洞結果。

  1. 在 Cloud 控制台開啟 Artifact Registry
  2. 點選「artifact-scanning-repo」查看內容。
  3. 點選映像檔詳細資料。
  4. 點選映像檔最新的摘要。
  5. 掃描完成後,點選映像檔的「安全漏洞」分頁標籤。

在「安全漏洞」分頁,您會看到新建映像檔的自動掃描結果。

顯示「安全漏洞」分頁的 Artifact Registry 頁面

自動掃描功能預設啟用。請參閱 Artifact Registry 設定,瞭解如何開啟/關閉自動掃描功能。

工作 4:On Demand Scanning

可能會有各種情況會要求您先執行掃描,才能將映像檔推送至存放區。舉例來說,容器開發人員可能會掃描映像檔並修正發現的問題,然後再將程式碼推送至原始碼控管。

下方的範例中,您將在本機建構及分析映像檔,然後根據結果採取行動。

  1. 使用本機 Docker 將映像檔建構至本機快取:
docker build -t {{{ project_0.default_region | "REGION" }}}-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image .
  1. 建構映像檔後,請要求掃描映像檔:
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

掃描結果會儲存在中繼資料伺服器。工作完成後,中繼資料伺服器會提供結果的位置。

  1. 查看儲存在 scan_id.txt 檔案的輸出內容:
cat scan_id.txt

請注意中繼資料伺服器中掃描結果的報表位置。

  1. 如要查看實際的掃描結果,請在輸出檔案中記下的報表位置使用 list-vulnerabilities 指令:
gcloud artifacts docker images list-vulnerabilities $(cat scan_id.txt)

輸出內容包含大量有關映像檔中所有安全漏洞的資料。人類很少直接使用儲存在報表的資料,通常是自動化程序使用這些結果。

  1. 使用下列指令讀取報表詳細資料,並記錄是否發現任何重大安全漏洞:
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

點選「Check my progress」確認目標已達成。

使用 On Demand Scanning 掃描映像檔

工作 5:在 Cloud Build 的 CI/CD 中使用 Artifact Scanning

首先,您將提供 Cloud Build 權限,以存取 On-Demand Scanning API。

  1. 使用下列指令提供存取權:
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"
  1. 使用下列指令更新 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

本範例的步驟僅限於容器建構程序。實際上,除了容器步驟,您還會加入應用程式專用操作說明和測試。

  1. 提交建構作業進行處理,確認在發現重大嚴重性安全漏洞時,是否會建構失敗。
gcloud builds submit
  1. 在「Cloud Build 記錄」頁面中查看建構失敗情形。

點選「Check my progress」確認目標已達成。

確認在發現重大嚴重性安全漏洞時,是否會建構失敗

修正安全漏洞

更新 Dockerfile,使用不含重大安全漏洞的基本映像檔。

  1. 使用下列指令覆寫 Dockerfile,改用 Debian 10 映像檔:
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
  1. 提交建構作業進行處理,確認在未發現重大嚴重性安全漏洞時,是否會建構成功。
gcloud builds submit
  1. 前往 Cloud 控制台的「Cloud Build」>「Cloud Build 記錄」,查看建構作業是否成功。

點選「Check my progress」確認目標已達成。

修正安全漏洞

查看掃描結果

在 Artifact Registry 查看正常映像檔

  1. 在 Cloud 控制台開啟 Artifact Registry
  2. 點選「artifact-scanning-repo」查看內容。
  3. 點選映像檔詳細資料。
  4. 點選映像檔最新的摘要。
  5. 點選映像檔的「安全漏洞」分頁標籤。

恭喜!

您已學會如何使用 Cloud Build 建構映像檔,並將映像檔儲存在 Artifact Registry 中,也已瞭解 Artifact 掃描功能如何自動觸發。您也瞭解如何在將映像檔推送到原始碼控管之前,先進行「隨選」掃描。

後續步驟/瞭解詳情

Google Cloud 教育訓練與認證

協助您瞭解如何充分運用 Google Cloud 的技術。我們的課程會介紹專業技能和最佳做法,讓您快速掌握要領並持續進修。訓練課程涵蓋基本到進階等級,您可自行安排時間,選擇以隨選、線上或虛擬方式參加。認證可協助您驗證及證明自己在 Google Cloud 技術方面的技能和專業知識。

使用手冊上次更新日期:2025 年 7 月 23 日

實驗室上次測試日期:2025 年 7 月 23 日

Copyright 2024 Google LLC 保留所有權利。Google 和 Google 標誌是 Google LLC 的商標,所有其他公司和產品名稱可能是其關聯公司的商標。

准备工作

  1. 实验会创建一个 Google Cloud 项目和一些资源,供您使用限定的一段时间
  2. 实验有时间限制,并且没有暂停功能。如果您中途结束实验,则必须重新开始。
  3. 在屏幕左上角,点击开始实验即可开始

使用无痕浏览模式

  1. 复制系统为实验提供的用户名密码
  2. 在无痕浏览模式下,点击打开控制台

登录控制台

  1. 使用您的实验凭证登录。使用其他凭证可能会导致错误或产生费用。
  2. 接受条款,并跳过恢复资源页面
  3. 除非您已完成此实验或想要重新开始,否则请勿点击结束实验,因为点击后系统会清除您的工作并移除该项目

此内容目前不可用

一旦可用,我们会通过电子邮件告知您

太好了!

一旦可用,我们会通过电子邮件告知您

一次一个实验

确认结束所有现有实验并开始此实验

使用无痕浏览模式运行实验

使用无痕模式或无痕浏览器窗口是运行此实验的最佳方式。这可以避免您的个人账号与学生账号之间发生冲突,这种冲突可能导致您的个人账号产生额外费用。