部署至 Cloud Run 並查看安全性深入分析資訊

本快速入門導覽課程說明如何將容器映像檔部署至 Cloud Run,並在Google Cloud 控制台的「安全性」分頁中,查看部署作業的安全洞察資訊。您將學會以下內容:

  • 使用 Cloud Deploy 將映像檔部署至 Cloud Run。 Cloud Deploy 是一項 Google Cloud 服務,可依照指定的推送順序,自動將應用程式推送至眾多目標環境。
  • 查看部署作業的下列安全性深入分析:

    • 部署作業的身分和加密資訊。
    • 軟體構件供應鏈級別 (SLSA),可識別部署作業的保障等級。
    • 建構成果中的安全漏洞
    • 建構構件的軟體物料清單 (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. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  4. To initialize the gcloud CLI, run the following command:

    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. Make sure 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. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  10. To initialize the gcloud CLI, run the following command:

    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. Make sure 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

設定預設設定

  1. 設定專案 ID 的環境變數:

    export PROJECT_ID=$(gcloud config get project)
    
  2. 設定 Cloud Deploy 的預設區域:

    gcloud config set deploy/region us-central1
    

授予存取權

將 IAM 角色授予預設的 Compute Engine 服務帳戶。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 存放區,並將說明設為「Docker repository」(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 控制台的「Delivery pipelines」(推送管道) 頁面:

    開啟「推送管道」頁面

    系統會顯示您剛建立的推送管道 cloudrun-guestbook-backend-delivery

  3. 按一下 cloudrun-guestbook-backend-delivery 即可監控進度。「Delivery pipeline details」(交付管道詳細資料) 頁面隨即開啟。

  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
    

    新版本會顯示在「推送 pipeline 詳細資料」頁面的「版本」部分。

  5. 在「Delivery pipeline details」(推送 pipeline 詳細資料) 頁面監控「Pipeline visualization」(pipeline 圖表) 檢視畫面,直到 dev-cluster 顯示「Promote」(升級) 按鈕為止。你可能需要重新整理頁面。

  6. 在推送管道的視覺化圖表上,點選第一個目標 cloudrun-dev,然後按一下「升級」

    系統會顯示「Promote release」對話方塊。顯示您要宣傳的目標詳細資料。

  7. 點選「升級」。

    系統已將版本加入佇列,準備部署至 cloudrun-prod。部署完成後,交付管道的視覺化內容會顯示已部署:

    管道:從 cloudrun-dev 推送至 cloudrun-prod

在 Cloud Deploy 中查看安全性深入分析資訊

  1. 在Google Cloud 控制台中開啟 Cloud Deploy 的「推送管道」頁面。

    開啟 Cloud Deploy 頁面

  2. 在「推送管道」表格中,按一下「cloudrun-guestbook-backend-delivery」

  3. 在「Delivery pipelines details」(推送 pipeline 詳細資料) 頁面中,按一下「test-release-008」

  4. 在「發布內容詳細資料」頁面中,按一下「構件」分頁標籤。

  5. 在「建構構件」表格中,找出含有構件 java-guestbook-backend 的資料列,然後按一下對應「安全性洞察」欄下方的「查看」

您會看到部署作業的「安全性」分頁。

「安全性」分頁

這個分頁的「安全性洞察」部分會顯示下列資訊:

  • SLSA 等級:這項建構作業已達到 SLSA 第 3 級。按一下「瞭解詳情」連結,即可瞭解這個安全等級的意義。

  • 安全漏洞:在構件中發現的任何安全漏洞。按一下映像檔名稱 (java-guestbook-backend),查看已掃描安全漏洞的構件。

  • 建構構件的依附元件

  • 建構作業詳細資料:建構作業的詳細資料,例如建構者和查看記錄的連結。

在 Cloud Run 中查看安全性深入分析資訊

  1. 開啟 Cloud Run「服務」頁面。

    開啟 Cloud Run 服務頁面

  2. 在 Cloud Run「Services」(服務) 表格中,按一下「guestbook-backend-prod」

  3. 在「服務詳細資料」頁面中,按一下「修訂版本」

  4. 在「修訂版本」面板中,按一下「安全性」

您會看到部署作業的「安全性」分頁。

「安全性」分頁

這個分頁的「安全性洞察」部分會顯示下列資訊:

  • 身分和加密:預設 Compute Engine 服務帳戶的電子郵件地址,以及用於部署作業的加密金鑰。

  • SLSA 等級:這項建構作業已達到 SLSA 第 3 級。按一下「瞭解詳情」連結,即可瞭解這個安全等級的意義。

  • 安全漏洞:在構件中發現的任何安全漏洞。按一下映像檔名稱 (java-guestbook-backend),查看已掃描安全漏洞的構件。

  • 建構構件的依附元件

  • 建構作業詳細資料:建構作業的詳細資料,例如建構者和查看記錄的連結。

清除所用資源

如要避免系統向您的 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
    

大功告成,您已經完成本快速入門導覽課程!

後續步驟