GSP1184

總覽
軟體安全漏洞是指可能導致系統意外故障的弱點,或是惡意行為人用來入侵軟體的方法。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 控制台
-
按一下「Start Lab」按鈕。如果實驗室會產生費用,畫面中會出現選擇付款方式的彈出式視窗。左側的「Lab Details」窗格會顯示下列項目:
- 「Open Google Cloud console」按鈕
- 剩餘時間
- 必須在這個實驗室使用的臨時憑證
- 完成這個實驗室所需的其他資訊 (如有)
-
點選「Open Google Cloud console」;如果使用 Chrome 瀏覽器,也可以按一下滑鼠右鍵,選取「在無痕視窗中開啟連結」。
接著,實驗室會啟動相關資源並開啟另一個分頁,當中顯示「登入」頁面。
提示:您可以在不同的視窗中並排開啟分頁。
注意:頁面中顯示「選擇帳戶」對話方塊時,請點選「使用其他帳戶」。
-
如有必要,請將下方的 Username 貼到「登入」對話方塊。
{{{user_0.username | "Username"}}}
您也可以在「Lab Details」窗格找到 Username。
-
點按「Next」。
-
複製下方的 Password,並貼到「歡迎使用」對話方塊。
{{{user_0.password | "Password"}}}
您也可以在「Lab Details」窗格找到 Password。
-
點選「下一步」。
重要事項:請務必使用實驗室提供的憑證,而非自己的 Google Cloud 帳戶憑證。
注意:如果使用自己的 Google Cloud 帳戶來進行這個實驗室,可能會產生額外費用。
-
按過後續的所有頁面:
- 接受條款及細則。
- 由於這是臨時帳戶,請勿新增救援選項或雙重驗證機制。
- 請勿申請免費試用。
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,並支援 Tab 鍵自動完成功能。
- (選用) 您可以執行下列指令來列出使用中的帳戶:
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"}}}
注意:如需 gcloud 的完整說明,請前往 Google Cloud 參閱 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
點選「Check my progress」確認目標已達成。
啟用必用的 API。
工作 1:使用 Cloud Build 建構映像檔
在本節中,您將建立自動化的建構管道,以打造容器映像檔、執行掃描,然後評估結果。如果未發現重大安全漏洞,系統就會將映像檔推送至存放區。如果發現重大安全漏洞,建構作業就會失敗並結束。
- 提供 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 資訊主頁,查看內容。
點選「Check my progress」確認目標已達成。
使用 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"
- 設定 Docker,在存取 Artifact Registry 時使用 gcloud 憑證:
gcloud auth configure-docker {{{ project_0.default_region | "REGION" }}}-docker.pkg.dev
- 修改 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
- 執行 CI 管道:
gcloud builds submit
點選「Check my progress」確認目標已達成。
建立 Artifact Registry 存放區
工作 3:自動化安全漏洞掃描
每當您將新映像檔推送到 Artifact Registry 時,系統就會自動觸發掃描作業。發現新的安全漏洞時,系統會持續更新安全漏洞資訊。
在本節中,您將查看剛建構並推送至 Artifact Registry 的映像檔,並探索安全漏洞結果。
查看映像檔詳細資料
建構程序完成後,請在 Artifact Registry 資訊主頁查看映像檔和安全漏洞結果。
- 在 Cloud 控制台開啟 Artifact Registry。
- 點選「artifact-scanning-repo」查看內容。
- 點選映像檔詳細資料。
- 點選映像檔最新的摘要。
- 掃描完成後,點選映像檔的「安全漏洞」分頁標籤。
在「安全漏洞」分頁,您會看到新建映像檔的自動掃描結果。
自動掃描功能預設啟用。請參閱 Artifact Registry 設定,瞭解如何開啟/關閉自動掃描功能。
工作 4:On Demand Scanning
可能會有各種情況會要求您先執行掃描,才能將映像檔推送至存放區。舉例來說,容器開發人員可能會掃描映像檔並修正發現的問題,然後再將程式碼推送至原始碼控管。
下方的範例中,您將在本機建構及分析映像檔,然後根據結果採取行動。
- 使用本機 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)
輸出內容包含大量有關映像檔中所有安全漏洞的資料。人類很少直接使用儲存在報表的資料,通常是自動化程序使用這些結果。
- 使用下列指令讀取報表詳細資料,並記錄是否發現任何重大安全漏洞:
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。
- 使用下列指令提供存取權:
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
本範例的步驟僅限於容器建構程序。實際上,除了容器步驟,您還會加入應用程式專用操作說明和測試。
- 提交建構作業進行處理,確認在發現重大嚴重性安全漏洞時,是否會建構失敗。
gcloud builds submit
- 在「Cloud Build 記錄」頁面中查看建構失敗情形。
點選「Check my progress」確認目標已達成。
確認在發現重大嚴重性安全漏洞時,是否會建構失敗
修正安全漏洞
更新 Dockerfile,使用不含重大安全漏洞的基本映像檔。
- 使用下列指令覆寫 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
- 提交建構作業進行處理,確認在未發現重大嚴重性安全漏洞時,是否會建構成功。
gcloud builds submit
- 前往 Cloud 控制台的「Cloud Build」>「Cloud Build 記錄」,查看建構作業是否成功。
點選「Check my progress」確認目標已達成。
修正安全漏洞
查看掃描結果
在 Artifact Registry 查看正常映像檔
- 在 Cloud 控制台開啟 Artifact Registry。
- 點選「artifact-scanning-repo」查看內容。
- 點選映像檔詳細資料。
- 點選映像檔最新的摘要。
- 點選映像檔的「安全漏洞」分頁標籤。
恭喜!
您已學會如何使用 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 的商標,所有其他公司和產品名稱可能是其關聯公司的商標。