GSP1184

概览
软件漏洞是指程序缺陷,可能会导致意外的系统故障,或让作恶方有机可乘,破解软件。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 控制台
-
点击开始实验按钮。如果该实验需要付费,系统会打开一个弹出式窗口供您选择付款方式。左侧是实验详细信息面板,其中包含以下各项:
-
打开 Google Cloud 控制台按钮
- 剩余时间
- 进行该实验时必须使用的临时凭证
- 帮助您逐步完成本实验所需的其他信息(如果需要)
-
点击打开 Google Cloud 控制台(如果您使用的是 Chrome 浏览器,请右键点击并选择在无痕式窗口中打开链接)。
该实验会启动资源并打开另一个标签页,显示登录页面。
提示:将这些标签页安排在不同的窗口中,并排显示。
注意:如果您看见选择账号对话框,请点击使用其他账号。
-
如有必要,请复制下方的用户名,然后将其粘贴到登录对话框中。
{{{user_0.username | "<用户名>"}}}
您也可以在实验详细信息面板中找到用户名。
-
点击下一步。
-
复制下面的密码,然后将其粘贴到欢迎对话框中。
{{{user_0.password | "<密码>"}}}
您也可以在实验详细信息面板中找到密码。
-
点击下一步。
重要提示:您必须使用实验提供的凭据。请勿使用您的 Google Cloud 账号凭证。
注意:在本实验中使用您自己的 Google Cloud 账号可能会产生额外费用。
-
继续在后续页面中点击以完成相应操作:
- 接受条款及条件。
- 由于这是临时账号,请勿添加账号恢复选项或双重验证。
- 请勿注册免费试用。
片刻之后,系统会在此标签页中打开 Google Cloud 控制台。
注意:如需查看列有 Google Cloud 产品和服务的菜单,请点击左上角的导航菜单。
激活 Cloud Shell
Cloud Shell 是一种装有开发者工具的虚拟机。它提供了一个永久性的 5GB 主目录,并且在 Google Cloud 上运行。Cloud Shell 提供可用于访问您的 Google Cloud 资源的命令行工具。
- 点击 Google Cloud 控制台顶部的激活 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 自动补全功能。
- (可选)您可以通过此命令列出活跃账号名称:
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 构建映像
在本部分中,您将创建一个自动化构建流水线来构建容器映像、扫描该映像,然后评估结果。如果未发现严重漏洞,则会将映像推送到仓库。如果发现严重漏洞,构建将失败并退出。
- 为 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 流水线:
提交 build 以供处理:
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"
- 将 Docker 配置为使用您的 gcloud 凭证访问 Artifact Registry:
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
点击检查我的进度,验证已完成以下目标:
创建 Artifact Registry 仓库
任务 3. 自动漏洞扫描
您每次将新映像推送到 Artifact Registry 时,都会自动触发扫描。漏洞信息会随着新漏洞的发现而持续更新。
在本部分中,您将检查刚刚构建并推送到 Artifact Registry 的映像,并查看漏洞扫描结果。
查看映像详情
构建流程完成后,在 Artifact Registry 信息中心查看映像和漏洞扫描结果。
- 在 Cloud 控制台中,打开 Artifact Registry。
- 点击 artifact-scanning-repo 以查看其内容。
- 点击进入映像详情。
- 点击进入映像的最新摘要。
- 扫描完成后,点击相应映像的漏洞标签页。
在“漏洞”标签页中,您会看到刚刚构建的映像的自动扫描结果。
自动扫描功能默认处于启用状态。查看 Artifact Registry 设置,了解如何开启/关闭自动扫描。
任务 4. 按需扫描
在将映像推送到仓库之前,您可能需要在各种场景下执行扫描。例如,容器开发者可能会扫描映像并修复发现的问题,然后再将代码推送到源代码控制系统。
在下面的示例中,您将先在本地构建和分析映像,然后再根据结果采取行动。
- 使用本地 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
点击检查我的进度,验证已完成以下目标:
使用 On-Demand Scanning API 扫描映像
任务 5. 在 Cloud Build 的 CI/CD 中进行制品扫描
首先,您需要向 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
此示例中的步骤仅限于容器构建流程。在实际操作中,除容器步骤外,您还需要添加特定于应用的说明和测试。
- 提交 build 以供处理,验证在发现 CRITICAL 严重级别的漏洞时,构建会中断。
gcloud builds submit
- 在 Cloud Build 历史记录页面中查看构建失败情况。
点击检查我的进度,验证已完成以下目标:
验证在发现 CRITICAL 严重级别的漏洞时,构建会中断
修复漏洞
更新 Dockerfile 以使用不包含 CRITICAL 严重级别漏洞的基础映像。
- 使用以下命令覆盖 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
- 提交 build 以供处理,验证在未发现 CRITICAL 严重级别的漏洞时,构建会成功:
gcloud builds submit
- 在 Cloud 控制台中,前往 Cloud Build > Cloud Build 历史记录,查看该成功构建。
点击检查我的进度,验证已完成以下目标:
修复漏洞
查看扫描结果
查看 Artifact Registry 中的良好映像。
- 在 Cloud 控制台中打开 Artifact Registry。
- 点击 artifact-scanning-repo 以查看其内容。
- 点击进入映像详情。
- 点击进入映像的最新摘要。
- 点击映像的漏洞标签页。
恭喜!
您学习了如何使用 Cloud Build 构建映像并将映像存储在 Artifact Registry 中,同时了解了制品扫描如何自动触发。您还了解了如何在将映像推送到源代码控制系统之前“按需”扫描映像。
后续步骤/了解详情
Google Cloud 培训和认证
…可帮助您充分利用 Google Cloud 技术。我们的课程会讲解各项技能与最佳实践,可帮助您迅速上手使用并继续学习更深入的知识。我们提供从基础到高级的全方位培训,并有点播、直播和虚拟三种方式选择,让您可以按照自己的日程安排学习时间。各项认证可以帮助您核实并证明您在 Google Cloud 技术方面的技能与专业知识。
上次更新手册的时间:2025 年 7 月 23 日
上次测试实验的时间:2025 年 7 月 23 日
版权所有 2024 Google LLC 保留所有权利。Google 和 Google 徽标是 Google LLC 的商标。其他所有公司名称和产品名称可能是其各自相关公司的商标。