按需扫描映像

On-Demand Scanning API 可让您扫描存储在本地、Container Registry 或 Artifact Registry 中的映像。这样,您就可以精确控制要扫描的漏洞的容器。在决定是否将映像存储在注册表中之前,您可以使用“按需扫描”扫描 CI/CD 流水线中的映像。

如需了解价格信息,请参阅价格页面

本页面介绍如何使用按需扫描手动扫描容器映像。

准备工作

  1. 登录您的 Google Cloud 帐号。如果您是 Google Cloud 新手,请创建一个帐号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 的项目选择器页面上,选择或创建一个 Google Cloud 项目。

    转到“项目选择器”

  3. 确保您的 Cloud 项目已启用结算功能。 了解如何确认您的项目是否已启用结算功能

  4. 启用 On-Demand Scanning API。

    启用 API

  5. 安装并初始化 Cloud SDK
  6. 在 Google Cloud Console 的项目选择器页面上,选择或创建一个 Google Cloud 项目。

    转到“项目选择器”

  7. 确保您的 Cloud 项目已启用结算功能。 了解如何确认您的项目是否已启用结算功能

  8. 启用 On-Demand Scanning API。

    启用 API

  9. 安装并初始化 Cloud SDK
  10. local-extract 组件添加到您的 Cloud SDK 安装

    使用 Cloud SDK 组件管理器

    第一次运行扫描命令时,组件管理器会提示您安装所需的组件。

    使用系统软件包管理器

    • 对于 Debian/Ubuntu:
      sudo apt install google-cloud-sdk-local-extract
          
    • 对于 Red Hat/Fedora/CentOS:
      sudo dnf install google-cloud-sdk-local-extract
          

      或者,您可以在上一个命令中将 dnf 替换为 yum

  11. 将 IAM 角色 按需扫描管理员授予要用于“按需扫描”的用户或服务帐号。如果您使用项目的 Owner 帐号运行扫描,则可以跳过此步骤。

扫描容器映像

如需扫描容器映像,请使用以下命令:

gcloud artifacts docker images scan IMAGE_URI [--remote] [--location=(us,europe,asia)] [--async]

其中:

  • --remote 是一个可选标志,如果您的映像远程托管在 Artifact Registry 或 Container Registry 上,您必须使用此标志。 对于远程映像,请对 IMAGE_URI 使用以下某种格式:

    • HOSTNAME/PROJECT_ID/REPOSITORY_ID/IMAGE_ID@sha256:HASH
    • HOSTNAME/PROJECT_ID/REPOSITORY_ID/IMAGE_ID:HASH
    • HOSTNAME/PROJECT_ID/REPOSITORY_ID/IMAGE_ID
    • HOSTNAME/PROJECT_ID/IMAGE_ID@sha256:HASH
    • HOSTNAME/PROJECT_ID/IMAGE_ID:HASH
    • HOSTNAME/PROJECT_ID/IMAGE_ID

    对于 Artifact Registry 中的映像,IMAGE_URI 必须包含 REPOSTIORY_ID

    对于本地映像,省略 --remote 标志并使用 IMAGE_URI 的其中一种格式:

    • IMAGE_ID:TAG
    • IMAGE_ID
  • --location 是可选标志,用于手动选择执行扫描的多区域。选择更接近实际位置的多区域可最大限度地减少延迟。可用的位置包括:useuropeasia。默认位置是 us

  • --async 是一个可选标志,用于异步运行扫描过程。如果省略此标志,您的终端将阻塞,直到扫描过程完成。

同步扫描

以下示例展示了没有 --async 标志的同步扫描的输出:

$ gcloud artifacts docker images scan ubuntu:latest

✓ Scanning container image
  ✓ Locally extracting packages and versions from local container image
  ✓ Remotely initiating analysis of packages and versions
  ✓ Waiting for analysis operation to complete [projects/my-project/locations/us/operations/87d2e137-1d1c-4790-8e5e-daf6c96ae7d7]
Done.
done: true
metadata:
  '@type': type.googleapis.com/google.cloud.ondemandscanning.v1.AnalyzePackagesMetadata
  createTime: '2021-01-05T23:03:04.185261Z'
  resourceUri: ubuntu:latest
name: projects/my-project/locations/us/operations/87d2e137-1d1c-4790-8e5e-daf6c96ae7d7
response:
  '@type': type.googleapis.com/google.cloud.ondemandscanning.v1.AnalyzePackagesResponse
  scan: projects/my-project/locations/us/scans/2fe2bfb8-f0c5-4dd6-a8c8-38961869767a

使用扫描名称检索漏洞结果。名称是输出消息的最后一行中的 scan

异步扫描

以下示例展示了执行异步扫描的输出:

$ gcloud artifacts docker images scan ubuntu:latest --async

✓ Scanning container image
  ✓ Locally extracting packages and versions from local container image
  ✓ Remotely initiating analysis of packages and versions
Done.
Check operation [projects/cloud-project/locations/us/operations/2e1a6b1f-16e5-4427-ac86-72c998a3dd16] for status.
metadata:
  '@type': type.googleapis.com/google.cloud.ondemandscanning.v1.AnalyzePackagesMetadata
  createTime: '2021-01-05T23:04:54.393510Z'
  resourceUri: ubuntu:latest
name: projects/my-project/locations/us/operations/2e1a6b1f-16e5-4427-ac86-72c998a3dd16

此操作会启动一项长时间运行的操作并在不阻止终端的情况下返回其 ID。使用操作 ID(输出消息的最后一行中的 name 值)轮询操作

轮询长时间运行的操作

使用异步扫描命令的输出中的操作 ID 来检查操作状态。

gcloud artifacts docker images get-operation LRO_ID

其中,LRO_ID 是长时间运行的操作 ID。

继续以异步扫描部分为例,检查操作的状态:

$ gcloud artifacts docker images get-operation \
  projects/cloud-project/locations/us/operations/2e1a6b1f-16e5-4427-ac86-72c998a3dd16

done: true
metadata:
  '@type': type.googleapis.com/google.cloud.ondemandscanning.v1.AnalyzePackagesMetadata
  createTime: '2021-01-05T23:04:54.393510Z'
  resourceUri: ubuntu:latest
name: projects/my-project/locations/us/operations/2e1a6b1f-16e5-4427-ac86-72c998a3dd16
response:
  '@type': type.googleapis.com/google.cloud.ondemandscanning.v1.AnalyzePackagesResponse
  scan: projects/my-project/locations/us/scans/2fe2bfb8-f0c5-4dd6-a8c8-38961869767a

如果输出包含 done: true 行,则表示扫描操作已完成。 使用扫描名称检索漏洞结果。名称是输出消息最后一行中 scan 的值

检索扫描结果

如需在扫描操作完成后检索扫描结果,请使用以下命令:

gcloud artifacts docker images list-vulnerabilities SCAN_NAME [--limit=X]

其中:

  • SCAN_NAME 是扫描名称。在扫描完成后,您可以在轮询长时间运行的操作时在输出底部找到该注释。
  • --limit=X 是一个可选标志,用于限制输出中显示的发生次数。

例如:

gcloud artifacts docker images list-vulnerabilities \
projects/my-project/locations/us/scans/2fe2bfb8-f0c5-4dd6-a8c8-38961869767a

createTime: '2021-01-05T23:05:42.956227Z'
kind: VULNERABILITY
name: projects/my-project/locations/us/occurrences/f82a1efd-a261-4973-acbd-f9854d8b8135
noteName: projects/goog-vulnz/notes/CVE-2018-1000654
resourceUri: ubuntu:latest
updateTime: '2021-01-05T23:05:42.956227Z'
vulnerability:
  cvssScore: 7.1
  effectiveSeverity: LOW
  packageIssue:
  - affectedCpeUri: cpe:/o:canonical:ubuntu_linux:20.04
    affectedPackage: libtasn1-6
    affectedVersion:
      kind: NORMAL
      name: 4.16.0
      revision: '2'
    fixedCpeUri: cpe:/o:canonical:ubuntu_linux:20.04
    fixedPackage: libtasn1-6
    fixedVersion:
      kind: MAXIMUM
  severity: HIGH

此命令的输出是 Grafeas 格式发生实例列表。在本例中,它显示了映像中出现的高严重级别漏洞。

扫描操作完成后,扫描结果将保留 48 小时。

后续步骤