在 Cloud Build 管道中使用 On-Demand Scanning

在 Cloud Build 管道中使用 On-Demand Scanning,即可在容器映像檔含有嚴重程度符合預先定義層級的安全漏洞時,封鎖建構作業。

本教學課程說明如何使用 Cloud Build 從原始碼建構容器映像檔、掃描安全漏洞、檢查安全漏洞的嚴重程度,以及在沒有特定嚴重程度的安全漏洞時,將映像檔推送至 Artifact Registry。

建議您為本教學課程建立新的 Google Cloud 專案,並在獨立環境中完成步驟。

準備來源檔案

在本教學課程中,您將從 Dockerfile 建構映像檔。Dockerfile 是原始碼檔案,其中包含 Docker 建構映像檔的指令。

  1. 開啟終端機,建立名為 ods-tutorial 的新目錄,然後前往該目錄:

    mkdir ods-tutorial && cd ods-tutorial
    
  2. 建立名為 Dockerfile 的檔案,並在當中加入下列內容:

    # Debian10 image
    FROM gcr.io/google-appengine/debian10:latest
    
    # Ensures that the built image is always unique
    RUN apt-get update && apt-get -y install uuid-runtime && uuidgen > /IAMUNIQUE
    

建立 Artifact Registry 存放區

  1. 將專案 ID 設為您啟用 API 的專案:

    gcloud config set project PROJECT_ID
    
  2. us-central1 位置中新建名為 ods-build-repo 的 Docker 存放區:

    gcloud artifacts repositories create ods-build-repo --repository-format=docker \
    --location=us-central1 --description="Repository for scan and build"
    
  3. 確認存放區是否已成功建立:

    gcloud artifacts repositories list
    

建構及掃描

在本節中,您將使用建構設定檔執行建構管道。建構設定檔會根據您的規格,指示 Cloud Build 執行多項工作。

  1. ods-tutorial/ 資料夾中,建立 cloudbuild.yaml 檔案,並加入下列內容:

    steps:
       - id: build
         name: gcr.io/cloud-builders/docker
         entrypoint: /bin/bash
         args:
         - -c
         - |
           docker build -t us-central1-docker.pkg.dev/$_PROJECT_ID/ods-build-repo/ods-test:latest -f ./Dockerfile . &&
           docker image inspect us-central1-docker.pkg.dev/$_PROJECT_ID/ods-build-repo/ods-test:latest --format \
           '{{index .RepoTags 0}}@{{.Id}}' > /workspace/image-digest.txt &&
           cat image-digest.txt
       - id: scan
         name: gcr.io/google.com/cloudsdktool/cloud-sdk
         entrypoint: /bin/bash
         args:
         - -c
         - |
           gcloud artifacts docker images scan us-central1-docker.pkg.dev/$_PROJECT_ID/ods-build-repo/ods-test:latest \
           --format='value(response.scan)' > /workspace/scan_id.txt
       - id: severity check
         name: gcr.io/google.com/cloudsdktool/cloud-sdk
         entrypoint: /bin/bash
         args:
         - -c
         - |
           gcloud artifacts docker images list-vulnerabilities $(cat /workspace/scan_id.txt) \
           --format='value(vulnerability.effectiveSeverity)' | if grep -Exq $_SEVERITY; \
           then echo 'Failed vulnerability check' && exit 1; else exit 0; fi
       - id: push
         name: gcr.io/cloud-builders/docker
         entrypoint: /bin/bash
         args:
         - -c
         - |
           docker push us-central1-docker.pkg.dev/$_PROJECT_ID/ods-build-repo/ods-test:latest
    images: ['us-central1-docker.pkg.dev/$_PROJECT_ID/ods-build-repo/ods-test:latest']
    
    

    這個檔案包含先前在 Artifact Registry 中建立的位置和存放區。如果決定使用其他值,請據此修改 cloudbuild.yaml 檔案。建構指令中的 PROJECT_IDSEVERITY 值會傳遞至指令碼。

  2. 指定要封鎖的安全性弱點SEVERITY等級,然後開始建構。

    SEVERITY 可使用下列值:

    • CRITICAL
    • HIGH
    • MEDIUM
    • LOW

    您可以使用規則運算式指定多個嚴重程度。

    在下列範例中,您同時指定 CRITICALHIGH 嚴重程度值。這會指示 Cloud Build 檢查嚴重性等級為 HIGH 以上的安全漏洞。

    gcloud builds submit --substitutions=_PROJECT_ID=PROJECT_ID,_SEVERITY='"CRITICAL|HIGH"' \
    --config cloudbuild.yaml
    

    地點

    • PROJECT_ID 是您的專案 ID。
    • SEVERITY 可讓您設定要封鎖的嚴重程度。如果隨選掃描發現符合任何指定嚴重性等級的安全漏洞,建構作業就會失敗。

瞭解結果

SEVERITY 值設為 CRITICAL|HIGH 後,隨選掃描功能會掃描是否有 HIGH 層級和更嚴重的 CRITICAL 層級的安全性漏洞。如果映像檔中沒有相符的安全漏洞,建構作業就會成功,Cloud Build 也會將映像檔推送至 Artifact Registry。

輸出結果會與下列內容相似:

DONE
--------------------------------------------------------------------------------------------------------------------------------------------

ID                                    CREATE_TIME                DURATION  SOURCE                                                                                         IMAGES                                                                        STATUS
abb3ce73-6ae8-41d1-9080-7d74a7ecd7bc  2021-03-15T06:50:32+00:00  1M48S     gs://ods-tests_cloudbuild/source/1615791031.906807-a648d10faf4a46d695c163186a6208d5.tgz  us-central1-docker.pkg.dev/ods-tests/ods-build-repo/ods-test (+1 more)  SUCCESS

如果隨選掃描在映像檔中發現 HIGHCRITICAL 安全漏洞,scan 建構步驟就會失敗,後續建構步驟不會啟動,且 Cloud Build 不會將映像檔推送至 Artifact Registry。

輸出結果會與下列內容相似:

Step #2 - "severity check": Failed vulnerability check
Finished Step #2 - "severity check"
ERROR
ERROR: build step 2 "gcr.io/cloud-builders/gcloud" failed: step exited with non-zero status: 1

在本教學課程中,您的結果可能會有所不同,因為範例原始碼是公開的 Linux 發行版 debian10:latest。Linux 發行版本和相關安全漏洞資料會持續更新。

如要瞭解其他有助於保護軟體供應鏈的 Google Cloud 工具和最佳做法,請參閱「軟體供應鏈安全性」。

如要進一步瞭解 Linux 漏洞管理最佳做法,請參加 Linux Foundation 提供的免費線上訓練課程。請參閱「開發安全軟體」。