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

使用 Cloud Build 安全地构建

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

GSP1184

Google Cloud 自学实验

概览

软件漏洞是指程序缺陷,可能会导致意外的系统故障,或让作恶方有机可乘,破解软件。Artifact Analysis 提供两种操作系统扫描方式,用于检测容器内的漏洞:

  • 借助 On-Demand Scanning API,您可以手动扫描容器映像,以查找操作系统漏洞,扫描操作可在本地计算机执行,也可在 Artifact Registry 中远程执行。这样,您就可以精细地控制要进行漏洞扫描的容器。
  • Container Scanning API 可自动检测操作系统漏洞,并在您每次将映像推送到 Artifact Registry 时进行扫描。您可以在 CI/CD 流水线中使用 On-Demand Scanning API 扫描映像,然后再决定是否将其存储在注册数据库中。启用此 API 还会启用语言包扫描,以查找 Go 和 Java 漏洞。

在本实验中,您将学习如何使用 Cloud Build 构建容器映像,并对存储在 Artifact Registry 中的映像进行漏洞扫描。

学习内容

在本实验中,您将:

  • 使用 Cloud Build 构建映像
  • 使用 Artifact Registry 存储和管理容器
  • 利用自动漏洞扫描功能
  • 配置按需扫描
  • 在 Cloud Build 中向 CI/CD 添加映像扫描

设置和要求

点击“开始实验”按钮前的注意事项

请阅读以下说明。实验是计时的,并且您无法暂停实验。计时器在您点击开始实验后即开始计时,显示 Google Cloud 资源可供您使用多长时间。

此实操实验可让您在真实的云环境中开展实验活动,免受模拟或演示环境的局限。我们会为您提供新的临时凭证,让您可以在实验规定的时间内用来登录和访问 Google Cloud。

为完成此实验,您需要:

  • 能够使用标准的网络浏览器(建议使用 Chrome 浏览器)。
注意:请使用无痕模式或无痕浏览器窗口运行此实验。这可以避免您的个人账号与学生账号之间发生冲突,这种冲突可能导致您的个人账号产生额外费用。
  • 有充足时间完成实验 - 请注意,实验开始后无法暂停。
注意:如果您已有自己的个人 Google Cloud 账号或项目,请不要在此实验中使用,以避免您的账号产生额外的费用。

如何开始实验并登录 Google Cloud 控制台

  1. 点击开始实验按钮。如果该实验需要付费,系统会打开一个弹出式窗口供您选择付款方式。左侧是实验详细信息面板,其中包含以下各项:

    • 打开 Google Cloud 控制台按钮
    • 剩余时间
    • 进行该实验时必须使用的临时凭证
    • 帮助您逐步完成本实验所需的其他信息(如果需要)
  2. 点击打开 Google Cloud 控制台(如果您使用的是 Chrome 浏览器,请右键点击并选择在无痕式窗口中打开链接)。

    该实验会启动资源并打开另一个标签页,显示登录页面。

    提示:将这些标签页安排在不同的窗口中,并排显示。

    注意:如果您看见选择账号对话框,请点击使用其他账号
  3. 如有必要,请复制下方的用户名,然后将其粘贴到登录对话框中。

    {{{user_0.username | "<用户名>"}}}

    您也可以在实验详细信息面板中找到用户名

  4. 点击下一步

  5. 复制下面的密码,然后将其粘贴到欢迎对话框中。

    {{{user_0.password | "<密码>"}}}

    您也可以在实验详细信息面板中找到密码

  6. 点击下一步

    重要提示:您必须使用实验提供的凭据。请勿使用您的 Google Cloud 账号凭证。 注意:在本实验中使用您自己的 Google Cloud 账号可能会产生额外费用。
  7. 继续在后续页面中点击以完成相应操作:

    • 接受条款及条件。
    • 由于这是临时账号,请勿添加账号恢复选项或双重验证。
    • 请勿注册免费试用。

片刻之后,系统会在此标签页中打开 Google Cloud 控制台。

注意:如需查看列有 Google Cloud 产品和服务的菜单,请点击左上角的导航菜单“导航菜单”图标

激活 Cloud Shell

Cloud Shell 是一种装有开发者工具的虚拟机。它提供了一个永久性的 5GB 主目录,并且在 Google Cloud 上运行。Cloud Shell 提供可用于访问您的 Google Cloud 资源的命令行工具。

  1. 点击 Google Cloud 控制台顶部的激活 Cloud Shell “激活 Cloud Shell”图标

如果您连接成功,即表示您已通过身份验证,且项目 ID 会被设为您的 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"}}} 注意:如需查看在 Google Cloud 中使用 gcloud 的完整文档,请参阅 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

点击检查我的进度,验证已完成以下目标:

启用所需的 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 流水线:

提交 build 以供处理:

gcloud builds submit
  1. 构建流程开始后,在 Cloud 控制台中打开 Cloud Build 信息中心以查看内容。

点击检查我的进度,验证已完成以下目标:

使用 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 配置为使用您的 gcloud 凭证访问 Artifact Registry:
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

点击检查我的进度,验证已完成以下目标:

创建 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. 按需扫描

在将映像推送到仓库之前,您可能需要在各种场景下执行扫描。例如,容器开发者可能会扫描映像并修复发现的问题,然后再将代码推送到源代码控制系统。

在下面的示例中,您将先在本地构建和分析映像,然后再根据结果采取行动。

  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. 使用以下命令读取报告详细信息,并在发现任何严重程度为 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

点击检查我的进度,验证已完成以下目标:

使用 On-Demand Scanning API 扫描映像

任务 5. 在 Cloud Build 的 CI/CD 中进行制品扫描

首先,您需要向 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. 提交 build 以供处理,验证在发现 CRITICAL 严重级别的漏洞时,构建会中断。
gcloud builds submit
  1. Cloud Build 历史记录页面中查看构建失败情况。

点击检查我的进度,验证已完成以下目标:

验证在发现 CRITICAL 严重级别的漏洞时,构建会中断

修复漏洞

更新 Dockerfile 以使用不包含 CRITICAL 严重级别漏洞的基础映像。

  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. 提交 build 以供处理,验证在未发现 CRITICAL 严重级别的漏洞时,构建会成功:
gcloud builds submit
  1. 在 Cloud 控制台中,前往 Cloud Build > Cloud Build 历史记录,查看该成功构建。

点击检查我的进度,验证已完成以下目标:

修复漏洞

查看扫描结果

查看 Artifact Registry 中的良好映像。

  1. 在 Cloud 控制台中打开 Artifact Registry
  2. 点击 artifact-scanning-repo 以查看其内容。
  3. 点击进入映像详情。
  4. 点击进入映像的最新摘要。
  5. 点击映像的漏洞标签页。

恭喜!

您学习了如何使用 Cloud Build 构建映像并将映像存储在 Artifact Registry 中,同时了解了制品扫描如何自动触发。您还了解了如何在将映像推送到源代码控制系统之前“按需”扫描映像。

后续步骤/了解详情

Google Cloud 培训和认证

…可帮助您充分利用 Google Cloud 技术。我们的课程会讲解各项技能与最佳实践,可帮助您迅速上手使用并继续学习更深入的知识。我们提供从基础到高级的全方位培训,并有点播、直播和虚拟三种方式选择,让您可以按照自己的日程安排学习时间。各项认证可以帮助您核实并证明您在 Google Cloud 技术方面的技能与专业知识。

上次更新手册的时间:2025 年 7 月 23 日

上次测试实验的时间:2025 年 7 月 23 日

版权所有 2024 Google LLC 保留所有权利。Google 和 Google 徽标是 Google LLC 的商标。其他所有公司名称和产品名称可能是其各自相关公司的商标。

准备工作

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

使用无痕浏览模式

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

登录控制台

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

此内容目前不可用

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

太好了!

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

一次一个实验

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

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

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