部署到 Cloud Run 并查看安全性数据分析

此快速入门介绍如何将容器映像部署到 Cloud Run,以及如何在Google Cloud 控制台的安全性标签页中查看部署的安全数据分析。您将学习以下内容:

  • 使用 Cloud Deploy 将映像部署到 Cloud Run。 Cloud Deploy 是一项 Google Cloud 服务,可按指定的升级序列自动将您的应用交付到一系列目标环境。
  • 查看部署的以下安全性数据分析:

    • 部署的身份和加密信息。
    • 软件制品的供应链等级 (SLSA) 级别,用于标识部署的保证级别。
    • build 工件中的漏洞
    • 构建工件的软件物料清单 (SBOM)
    • 构建来源,即关于构建的一组可验证的元数据。 它包括已构建映像的摘要、输入源位置、构建工具链、构建步骤和构建时长等详细信息。

准备工作

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. Install the Google Cloud CLI.

  3. 如果您使用的是外部身份提供方 (IdP),则必须先 使用联合身份登录 gcloud CLI

  4. 如需初始化 gcloud CLI,请运行以下命令:

    gcloud init
  5. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  6. Verify that billing is enabled for your Google Cloud project.

  7. Enable the Cloud Build, Artifact Registry, Cloud Deploy, Cloud Run, and Container Scanning APIs:

    gcloud services enable cloudbuild.googleapis.com  artifactregistry.googleapis.com  clouddeploy.googleapis.com  run.googleapis.com  containerscanning.googleapis.com
  8. Install the Google Cloud CLI.

  9. 如果您使用的是外部身份提供方 (IdP),则必须先 使用联合身份登录 gcloud CLI

  10. 如需初始化 gcloud CLI,请运行以下命令:

    gcloud init
  11. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  12. Verify that billing is enabled for your Google Cloud project.

  13. Enable the Cloud Build, Artifact Registry, Cloud Deploy, Cloud Run, and Container Scanning APIs:

    gcloud services enable cloudbuild.googleapis.com  artifactregistry.googleapis.com  clouddeploy.googleapis.com  run.googleapis.com  containerscanning.googleapis.com
  14. 设置默认设置

    1. 为项目 ID 设置环境变量:

      export PROJECT_ID=$(gcloud config get project)
      
    2. 设置 Cloud Deploy 的默认区域:

      gcloud config set deploy/region us-central1
      

    授予访问权限

    默认 Compute Engine 服务账号授予 IAM 角色。Cloud Deploy 需要此权限才能将工作负载部署到 Cloud Run。

     gcloud projects add-iam-policy-binding $PROJECT_ID \
         --member=serviceAccount:$(gcloud projects describe $PROJECT_ID \
         --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
         --role="roles/clouddeploy.jobRunner"
     gcloud iam service-accounts add-iam-policy-binding $(gcloud projects describe $PROJECT_ID \
         --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
         --member=serviceAccount:$(gcloud projects describe $PROJECT_ID \
         --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
         --role="roles/iam.serviceAccountUser" \
         --project=$PROJECT_ID
     gcloud projects add-iam-policy-binding $PROJECT_ID \
         --member=serviceAccount:$(gcloud projects describe $PROJECT_ID \
         --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
         --role="roles/run.developer"
    

    如果您在添加其中任一角色时遇到问题,请与您的项目管理员联系。

    在 Artifact Registry 中创建 Docker 代码库

    1. 在位置 us-central1 中新建一个名为 containers 且说明文字为“Docker repository”(Docker 代码库)的 Docker 代码库:

      gcloud artifacts repositories create containers --repository-format=docker \
          --location=us-central1 --description="Docker repository"
      
    2. 验证您的代码库已创建:

      gcloud artifacts repositories list
      

      您会在显示的代码库列表中看到 containers

    准备示例应用

    您需要一些用于构建和部署的示例源代码。在本部分中,您将克隆一个包含 Java 代码示例的现有源代码库。

    1. 克隆包含 Java 代码示例的代码库:

      git clone https://github.com/googlecloudplatform/software-delivery-shield-demo-java.git
      cd software-delivery-shield-demo-java/backend
      
    2. 更新 cloudrun.clouddeploy.yaml,将 PROJECT_ID 替换为您的项目 ID:

      sed -i "s/PROJECT_ID/${PROJECT_ID}/g" cloudrun.clouddeploy.yaml
      

    构建应用

    1. 使用 Cloud Build 构建 Java 应用并将其容器化。以下命令会构建 Java 应用并将其容器化,然后将构建的容器存储在 Artifact Registry Docker 代码库中:

      gcloud builds submit --config=cloudbuild.yaml --region=us-central1
      

      构建完成后,您会看到类似于以下内容的成功状态消息:

      DONE
      -----------------------------------------------------------------------------
      ID: 3e08565f-7f57-4449-bc68-51c46cf33d03
      CREATE_TIME: 2022-09-19T15:41:07+00:00
      DURATION: 54S
      SOURCE: gs://sds-docs-project_cloudbuild/source/1663602066.777581-6ebe4b2d6fd741ffa18936d7f78055e9.tgz
      IMAGES: us-central1-docker.pkg.dev/sds-docs-project/containers/java-guestbook-backend:quickstart
      STATUS: SUCCESS
      

    为构建的映像生成 SBOM

    SBOM 是应用的完整清单,用于标识软件所依赖的软件包。内容可以包括供应商提供的第三方软件、内部制品和开源库。

    为上一部分中构建的映像生成 SBOM:

    gcloud artifacts sbom export \
        --uri=us-central1-docker.pkg.dev/${PROJECT_ID}/containers/java-guestbook-backend:quickstart
    

    使用 Cloud Deploy 将容器部署到 Cloud Run

    1. 在 Cloud Deploy 服务中注册流水线和目标:

      gcloud deploy apply --file cloudrun.clouddeploy.yaml
      

      现在,您已经有了包含目标的流水线,可以将应用部署到第一个目标了。

    2. 如需验证流水线是否存在,请前往 Google Cloud 控制台中的交付流水线页面:

      打开“交付流水线”页面

      系统会显示您刚刚创建的交付流水线 cloudrun-guestbook-backend-delivery

    3. 点击 cloudrun-guestbook-backend-delivery 可监控进度。系统会打开交付流水线详情页面。

    4. 在 Cloud Shell 中,在 Cloud Deploy 中创建版本:

      gcloud deploy releases create test-release-007 \
          --delivery-pipeline=cloudrun-guestbook-backend-delivery \
          --skaffold-file=cloudrun.skaffold.yaml \
          --images=java-guestbook-backend=us-central1-docker.pkg.dev/${PROJECT_ID}/containers/java-guestbook-backend:quickstart
      

      新版本会显示在交付流水线详情页面上的版本部分中。

    5. 交付流水线详情页面上监控流水线直观呈现视图,直到 dev-cluster 显示提升按钮。您可能需要刷新页面。

    6. 在交付流水线直观显示中的第一个目标上,cloudrun-dev,点击提升

      此时将显示提升版本对话框。它会显示您要提升到的目标的详细信息。

    7. 点击提升

      该版本现已加入队列以部署到 cloudrun-prod。部署完成后,交付流水线直观显示会将它显示为已部署:

      显示从 cloudrun-dev 到 cloudrun-prod 的提升的流水线

    在 Cloud Deploy 中查看安全性数据分析

    1. 在Google Cloud 控制台中打开 Cloud Deploy 交付流水线页面。

      打开 Cloud Deploy 页面

    2. 交付流水线表中,点击 cloudrun-guestbook-backend-delivery

    3. 交付流水线详情页面中,点击 test-release-008

    4. 发布版本详情页面中,点击工件标签页。

    5. build 工件表格中,找到包含工件 java-guestbook-backend 的行,然后在相应的安全洞见列下,点击查看

    您会看到部署的安全性标签页。

    “安全性”标签页

    此标签页的安全性数据分析部分会显示以下信息:

    • SLSA 级别:此 build 已达到 SLSA 3 级。点击了解详情链接,了解此安全级别意味着什么。

    • 漏洞:在制品中发现的所有漏洞。点击映像名称 (java-guestbook-backend) 可查看已扫描漏洞的制品。

    • build 制品的依赖项

    • 构建详细信息:构建的详细信息,例如构建器以及用于查看日志的链接。

    在 Cloud Run 中查看安全性数据分析

    1. 打开 Cloud Run 服务页面。

      打开 Cloud Run 服务页面

    2. 在 Cloud Run 服务表中,点击 guestbook-backend-prod

    3. 服务详情页面中,点击修订版本

    4. 修订版本面板中,点击安全性

    您会看到部署的安全性标签页。

    “安全性”标签页

    此标签页的安全性数据分析部分会显示以下信息:

    • 身份和加密:默认 Compute Engine 服务账号的电子邮件地址以及用于部署的加密密钥。

    • SLSA 级别:此 build 已达到 SLSA 3 级。点击了解详情链接,了解此安全级别意味着什么。

    • 漏洞:在制品中发现的所有漏洞。点击映像名称 (java-guestbook-backend) 可查看已扫描漏洞的制品。

    • build 制品的依赖项

    • 构建详细信息:构建的详细信息,例如构建器以及用于查看日志的链接。

    清理

    为避免因本页面中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的 Google Cloud 项目。

    1. 停用 Container Scanning API:

      gcloud services disable containerscanning.googleapis.com --force
      
    2. 删除 guestbook-backend-dev Cloud Run 服务:

      gcloud run services delete guestbook-backend-dev --region=us-central1 \
          --project=${PROJECT_ID}
      
    3. 删除 guestbook-backend-prod 服务:

      gcloud run services delete guestbook-backend-prod --region=us-central1 \
          --project=${PROJECT_ID}
      
    4. 删除交付流水线,包括版本和发布:

      gcloud deploy delivery-pipelines delete cloudrun-guestbook-backend-delivery \
          --force --region=us-central1 --project=${PROJECT_ID}
      

      此命令会删除交付流水线本身,以及软件供应链安全为该流水线创建的所有 releaserollout 资源。

    5. 删除 Artifact Registry 代码库:

      gcloud artifacts repositories delete containers \
          --location=us-central1 --async
      

    恭喜,您已经完成快速入门!

    后续步骤