本教學課程說明如何使用 OpenSSF Scorecard 檢查容器映像檔,確保符合供應鏈安全最佳做法。評分表驗證者會做為 Cloud Build 管道的一部分執行,產生可供二進位授權在部署前驗證的認證。這個驗證步驟可防止遭入侵的容器構件部署至正式環境,避免發生多種供應鏈安全漏洞。
總覽
開放原始碼安全基金會 (OpenSSF) 是一個機構,為開放原始碼安全計畫提供工具、服務和基礎架構。評量表是由 OpenSSF 維護的工具,可掃描原始碼管理 (SCM) 存放區,找出供應鏈安全最佳做法。
評分表認證者是評分表內建工具,可讓您根據設定的政策建立二進位授權認證。 記分卡驗證者會針對容器映像檔的 SCM 存放區執行記分卡,產生結果、根據政策評估結果,並在符合政策時產生認證。
在本教學課程中,您將建構範例存放區,然後使用 Scorecard Attestor。每個範例管道都包含下列建構步驟:
build
:建構範例容器映像檔。push
:將映像檔推送至 Container Registry。attest
:檢查並簽署圖片,使用評量表驗證者根據政策建立驗證。
在每個管道的 attest
步驟中,評量表認證者會執行下列操作:
- 擷取新建構容器映像檔的 SCM 存放區相關資料。
- 對原始資料執行評量表,並根據使用者指定的政策評估 SCM 存放區。
- 如果符合所有政策,則「評分表驗證者」會建立驗證。
- 如果未滿足任何政策,Scorecard Attestor 就不會建立認證。
在部署時,二進位授權會檢查是否有可驗證的認證。如果沒有,執行者會禁止部署映像檔。
費用
本教學課程使用下列 Google Cloud 產品。
- Container Registry
- Artifact Analysis
- Cloud Build
- Cloud Key Management Service
使用 Pricing Calculator,根據您的預測使用量來產生預估費用。
目標
在本教學課程中,您將執行下列操作:
- 將 Scorecard Attestor 設為 Cloud Build 自訂建構者。
- 查看及設定評分表驗證者政策。
- 在範例存放區上執行 Scorecard Attestor,根據政策建立認證。
- 在僅限驗證模式下,對範例存放區執行 Scorecard Attestor,但不建立認證。 ## 事前準備
在本節中,您將一次性設定系統。
設定環境
將 Google Cloud 專案儲存在環境變數中。
export PROJECT_ID=PROJECT_ID
將 PROJECT_ID 替換為您的 Google Cloud 專案。
將預設專案 ID 設為您的 Google Cloud 專案:
gcloud config set project $PROJECT_ID
將專案編號儲存在環境變數中,以供後續步驟使用:
export PROJECT_NUMBER=$(gcloud projects list --filter="${PROJECT_ID}" \ --format="value(PROJECT_NUMBER)")
啟用 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 金鑰用於建立認證。
建立名為 scorecard-attestor-key-ring 的新 Cloud KMS 金鑰環:
gcloud kms keyrings create scorecard-attestor-key-ring \ --location global
在金鑰環中建立名為 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"
將摘要演算法和 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
建立二進位授權驗證者。稍後,評分表驗證者會建立與這個驗證者相關的附註。
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"
將二進位授權簽署者與 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 依附元件,以及已簽入來源存放區的已編譯二進位構件。 這類行為違反了存放區的認證政策。
複製測試存放區:scorecard-binauthz-test-bad。
查看失敗案例的認證政策檔案。
cat policy-binauthz.yaml
(選用) 查看失敗案例的建構設定檔。
cat samples/signer/cloudbuild.yaml
提交版本:
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"
儲存上一個版本的建構 ID:
export BUILD_ID=$(gcloud builds list --limit=1 --format="value('ID')")
驗證結果:
gcloud storage cat gs://${PROJECT_NUMBER}.cloudbuild-logs.googleusercontent.com/log-${BUILD_ID}.txt | grep "failed scorecard attestation policy check"
提交成功案例的範例建構版本
在本節中,您將建構符合評分表認證政策的容器映像檔。在本例中,評量表驗證者會建立認證。
如要將成功案例的範例建構作業提交至 Cloud Build,請執行下列操作:
複製測試存放區:scorecard-binauthz-test-good。
查看失敗案例的認證政策檔案。
sh cat policy-binauthz.yaml
(選用) 查看失敗案例的建構設定檔。
cat samples/signer/cloudbuild.yaml
提交版本:
gcloud builds submit \ --substitutions=_KMS_KEY_NAME=$KMS_KEY_NAME,_KMS_DIGEST_ALG=$KMS_DIGEST_ALG \ --config=cloudbuild.yaml
驗證結果:
gcloud storage cat gs://${PROJECT_NUMBER}.cloudbuild-logs.googleusercontent.com/log-${BUILD_ID}.txt | grep "passed scorecard attestation policy check"
取得評分卡建構及檢查的容器映像檔網址
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 '"')
確認容器映像檔已建立認證。評分表認證者會使用附註 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
後續步驟
- 請參閱記分卡認證者說明文件
- 進一步瞭解評量表
- 進一步瞭解二進位授權
- 透過Google Cloud 控制台或指令列工具建立驗證者