使用 OpenSSF Scorecard 建立認證

本教學課程說明如何使用 OpenSSF Scorecard 檢查容器映像檔,確保符合供應鏈安全最佳做法。評分表驗證者會做為 Cloud Build 管道的一部分執行,產生可供二進位授權在部署前驗證的認證。這個驗證步驟可防止遭入侵的容器構件部署至正式環境,避免發生多種供應鏈安全漏洞。

總覽

開放原始碼安全基金會 (OpenSSF) 是一個機構,為開放原始碼安全計畫提供工具、服務和基礎架構。評量表是由 OpenSSF 維護的工具,可掃描原始碼管理 (SCM) 存放區,找出供應鏈安全最佳做法。

評分表認證者是評分表內建工具,可讓您根據設定的政策建立二進位授權認證。 記分卡驗證者會針對容器映像檔的 SCM 存放區執行記分卡,產生結果、根據政策評估結果,並在符合政策時產生認證。

在本教學課程中,您將建構範例存放區,然後使用 Scorecard Attestor。每個範例管道都包含下列建構步驟:

  1. build:建構範例容器映像檔。
  2. push:將映像檔推送至 Container Registry。
  3. attest:檢查並簽署圖片,使用評量表驗證者根據政策建立驗證。

在每個管道的 attest 步驟中,評量表認證者會執行下列操作:

  1. 擷取新建構容器映像檔的 SCM 存放區相關資料。
  2. 對原始資料執行評量表,並根據使用者指定的政策評估 SCM 存放區。
    1. 如果符合所有政策,則「評分表驗證者」會建立驗證。
    2. 如果未滿足任何政策,Scorecard Attestor 就不會建立認證。

在部署時,二進位授權會檢查是否有可驗證的認證。如果沒有,執行者會禁止部署映像檔。

費用

本教學課程使用下列 Google Cloud 產品。

  • Container Registry
  • Artifact Analysis
  • Cloud Build
  • Cloud Key Management Service

使用 Pricing Calculator,根據您的預測使用量來產生預估費用。

目標

在本教學課程中,您將執行下列操作:

  1. 將 Scorecard Attestor 設為 Cloud Build 自訂建構者。
  2. 查看及設定評分表驗證者政策。
  3. 在範例存放區上執行 Scorecard Attestor,根據政策建立認證。
  4. 在僅限驗證模式下,對範例存放區執行 Scorecard Attestor,但不建立認證。 ## 事前準備

在本節中,您將一次性設定系統。

設定環境

  1. 將 Google Cloud 專案儲存在環境變數中。

    export PROJECT_ID=PROJECT_ID
    

    PROJECT_ID 替換為您的 Google Cloud 專案。

  2. 將預設專案 ID 設為您的 Google Cloud 專案:

    gcloud config set project $PROJECT_ID
    
  3. 將專案編號儲存在環境變數中,以供後續步驟使用:

    export PROJECT_NUMBER=$(gcloud projects list --filter="${PROJECT_ID}" \
     --format="value(PROJECT_NUMBER)")
    
  4. 啟用 API:

    如要確保已啟用本指南所需的服務,請執行下列指令:

    gcloud services enable \
      cloudbuild.googleapis.com \
      containerregistry.googleapis.com \
      containerscanning.googleapis.com \
      cloudkms.googleapis.com
    

設定 IAM 角色

執行下列指令,為 Cloud Build 服務帳戶設定下列角色:

  • containeranalysis.notes.editor:新增「構件分析註記編輯者」角色,以管理驗證者。
  • containeranalysis.notes.occurrences.viewer:新增「註記的構件分析出現次數」角色,可同時管理安全漏洞和認證出現次數。
  • roles/containeranalysis.occurrences.editor:新增「Artifact Analysis 發生頻率編輯者」角色,在 Artifact Analysis 中建立認證發生頻率。
  • cloudkms.signer:新增「Cloud KMS CryptoKey Signer」(Cloud KMS 加密編譯金鑰簽署者) 角色,允許服務帳戶存取 Cloud KMS 簽署服務。

    gcloud projects add-iam-policy-binding $PROJECT_ID --member serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com --role roles/containeranalysis.notes.editor
    gcloud projects add-iam-policy-binding $PROJECT_ID --member serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com --role roles/containeranalysis.notes.occurrences.viewer
    gcloud projects add-iam-policy-binding $PROJECT_ID --member serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com --role roles/containeranalysis.occurrences.editor
    gcloud projects add-iam-policy-binding $PROJECT_ID --member serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com --role roles/cloudkms.signer
    

建立 Cloud KMS 簽署金鑰

Cloud Key Management Service 金鑰用於建立認證。

  1. 建立名為 scorecard-attestor-key-ring 的新 Cloud KMS 金鑰環:

    gcloud kms keyrings create scorecard-attestor-key-ring \
        --location global
    
  2. 在金鑰環中建立名為 scorecard-attestor-key 的新 Cloud KMS 金鑰:

    gcloud kms keys create scorecard-attestor-key \
        --keyring scorecard-attestor-key-ring \
        --location global \
        --purpose "asymmetric-signing" \
        --default-algorithm "rsa-sign-pkcs1-2048-sha256"
    
  3. 將摘要演算法和 Cloud KMS 儲存在環境變數中,以供後續步驟使用:

    export KMS_DIGEST_ALG=SHA256
    export KMS_KEY_NAME=projects/$PROJECT_ID/locations/global/keyRings/scorecard-attestor-key-ring/cryptoKeys/scorecard-attestor-key/cryptoKeyVersions/1
    
  4. 建立二進位授權驗證者。稍後,評分表驗證者會建立與這個驗證者相關的附註。

    gcloud container binauthz attestors create scorecard-attestor \
        --attestation-authority-note=scorecard-attestation \
        --attestation-authority-note-project=$PROJECT_ID \
        --description="Attest that ossf/scorecard policy checks pass"
    
  5. 將二進位授權簽署者與 KMS 金鑰建立關聯:

    gcloud container binauthz attestors public-keys add \
        --attestor=scorecard-attestor \
        --keyversion=1 \
        --keyversion-key=scorecard-attestor-key \
        --keyversion-keyring=scorecard-attestor-key-ring \
        --keyversion-location=global \
        --keyversion-project=$PROJECT_ID
    

如要瞭解其他簽署演算法,請參閱「建立非對稱金鑰」。

在 Cloud Build 管道中,使用 Scorecard Attestor 建立認證

提交失敗案例的範例建構作業

在本節中,您將建構容器映像檔,並使用 OpenSSF Scorecard 檢查其供應鏈安全做法。映像檔建構成功,但未建立認證。基礎存放區包含一些不建議的供應鏈安全做法,例如 Dockerfile 中未固定的 Debian 10 依附元件,以及已簽入來源存放區的已編譯二進位構件。 這類行為違反了存放區的認證政策。

  1. 複製測試存放區:scorecard-binauthz-test-bad

  2. 查看失敗案例的認證政策檔案。

    cat policy-binauthz.yaml
    
  3. (選用) 查看失敗案例的建構設定檔。

    cat samples/signer/cloudbuild.yaml
    
  4. 提交版本:

    gcloud builds submit \
        --substitutions=_KMS_KEY_NAME=$KMS_KEY_NAME,_KMS_DIGEST_ALG=$KMS_DIGEST_ALG \
        --config=cloudbuild.yaml
    

您會看到如下所示的輸出:

time="2022-12-20T22:30:14Z" level=info msg="image failed scorecard attestation policy check"
  1. 儲存上一個版本的建構 ID:

    export BUILD_ID=$(gcloud builds list --limit=1 --format="value('ID')")
    
  2. 驗證結果:

    gcloud storage cat gs://${PROJECT_NUMBER}.cloudbuild-logs.googleusercontent.com/log-${BUILD_ID}.txt | grep "failed scorecard attestation policy check"
    

提交成功案例的範例建構版本

在本節中,您將建構符合評分表認證政策的容器映像檔。在本例中,評量表驗證者會建立認證。

如要將成功案例的範例建構作業提交至 Cloud Build,請執行下列操作:

  1. 複製測試存放區:scorecard-binauthz-test-good

  2. 查看失敗案例的認證政策檔案。 sh cat policy-binauthz.yaml

  3. (選用) 查看失敗案例的建構設定檔。

    cat samples/signer/cloudbuild.yaml
    
  4. 提交版本:

    gcloud builds submit \
        --substitutions=_KMS_KEY_NAME=$KMS_KEY_NAME,_KMS_DIGEST_ALG=$KMS_DIGEST_ALG \
        --config=cloudbuild.yaml
    
  5. 驗證結果:

    gcloud storage cat gs://${PROJECT_NUMBER}.cloudbuild-logs.googleusercontent.com/log-${BUILD_ID}.txt | grep "passed scorecard attestation policy check"
    
  6. 取得評分卡建構及檢查的容器映像檔網址

    export IMAGE_URI=$(gcloud storage cat gs://${PROJECT_NUMBER}.cloudbuild-logs.googleusercontent.com/log-${BUILD_ID}.txt | grep -o "Attestation for image .* is successfully uploaded" txt | cut -d' ' -f4 | tr -d '"')
    
  7. 確認容器映像檔已建立認證。評分表認證者會使用附註 ID ossf-scorecard-attestation 和附註名稱 projects/${PROJECT_ID}/notes/ossf-scorecard-attestation

    gcloud container binauthz attestations list \
        --attestor="projects/${PROJECT_ID}/attestors/ossf-scorecard-attestor" \
        --filter="resourceUri='https://${IMAGE_URI}'"
    

清除所用資源

如要清除本文中使用的資源,可以刪除專案:

gcloud projects delete $PROJECT_ID

後續步驟