使用 Google Cloud 控制台建立驗證者

本頁面說明如何使用 Google Cloud 控制台,在二進位授權中建立自訂驗證者。或者,您也可以使用 Google Cloud CLI 或 REST API 執行這些步驟。這項工作是設定二進位授權的一部分。

Cloud Build 使用者可以改用 built-by-cloud-build 驗證者,僅部署 Cloud Build 建構的映像檔。

事前準備

建立認證者前,請先完成下列事項:

  1. 啟用二進位授權。

  2. 為平台設定二進位授權。

總覽

驗證者是 Google Cloud 資源,二進位授權會使用該資源來驗證認證。如要進一步瞭解二進位授權,請參閱「二進位授權總覽」。

如要建立驗證者,請執行下列操作:

  • 設定金鑰組,先用於簽署映像檔、建立認證,之後在部署映像檔時用於驗證。PKIX 金鑰組是由 Cloud Key Management Service (Cloud KMS) 以 PKIX 相容格式產生的金鑰組。
  • 在二進位授權中建立驗證者,並建立關聯的公開金鑰

在單一專案設定中,您會在設定二進位授權政策的同一個專案中建立驗證者。在多專案設定中,您可能會有一個設定政策的部署者專案,以及一個儲存驗證者的驗證者專案。

設定加密編譯金鑰

二進位授權可讓您使用 PKIX 金鑰安全地簽署映像檔,並在日後驗證。確保只有經過驗證的對象才能授權容器映像檔。如要使用認證,請設定非對稱金鑰,例如公用金鑰基礎架構 (X.509) (PKIX) 金鑰,以安全地驗證認證者的身分。部署映像檔時,二進位授權會使用驗證者中的公開金鑰,檢查以私密金鑰簽署的映像檔認證。

本指南建議使用橢圓曲線數位簽章演算法 (ECDSA) 產生 PKIX 金鑰組。您也可以使用 RSA 或 PGP 金鑰簽署。如要進一步瞭解簽署演算法,請參閱「金鑰用途和演算法」。

建立 PKIX 金鑰組

二進位授權可讓您使用非對稱式 PKIX 金鑰組簽署及驗證映像檔。

PKIX 金鑰組包含私密金鑰和公開金鑰,簽署者會使用私密金鑰對認證進行數位簽署,而您會將公開金鑰新增至驗證者。部署時,二進位授權會使用這個公開金鑰,驗證由私密金鑰簽署的認證。

在 Cloud KMS 中產生及儲存的非對稱金鑰組符合 PKIX 格式。如要建立與二進位授權搭配使用的 Cloud KMS 金鑰,請參閱「建立非對稱金鑰」。建立金鑰時,請務必選擇「Asymmetric Sign」(非對稱式簽署) 做為金鑰用途。

PKIX (Cloud KMS)

如要在 Cloud KMS 中建立金鑰組,請按照下列步驟操作:

  1. 設定建立金鑰組所需的環境變數。

    KMS_KEY_PROJECT_ID=${PROJECT_ID}
    KMS_KEYRING_NAME=my-binauthz-keyring
    KMS_KEY_NAME=my-binauthz-kms-key-name
    KMS_KEY_LOCATION=global
    KMS_KEY_PURPOSE=asymmetric-signing
    KMS_KEY_ALGORITHM=ec-sign-p256-sha256
    KMS_PROTECTION_LEVEL=software
    KMS_KEY_VERSION=1
    
  2. 建立金鑰環。

    gcloud kms keyrings create ${KMS_KEYRING_NAME} \
      --location ${KMS_KEY_LOCATION}
    
  3. 建立金鑰:

    gcloud kms keys create ${KMS_KEY_NAME} \
      --location ${KMS_KEY_LOCATION} \
      --keyring ${KMS_KEYRING_NAME}  \
      --purpose ${KMS_KEY_PURPOSE} \
      --default-algorithm ${KMS_KEY_ALGORITHM} \
      --protection-level ${KMS_PROTECTION_LEVEL}
    

PKIX (本機金鑰)

如要產生新的本機非對稱 PKIX 金鑰組並儲存至檔案,請按照下列步驟操作:

  1. 產生金鑰:

    PRIVATE_KEY_FILE="/tmp/ec_private.pem"
    openssl ecparam -genkey -name prime256v1 -noout -out ${PRIVATE_KEY_FILE}
    
  2. 由於這個檔案同時包含公開金鑰和私密金鑰,因此您必須將公開金鑰擷取至個別檔案,才能將其新增至驗證者:

    PUBLIC_KEY_FILE="/tmp/ec_public.pem"
    openssl ec -in ${PRIVATE_KEY_FILE} -pubout -out ${PUBLIC_KEY_FILE}
    

建立驗證者

下一步是建立驗證者本身,並建立 Artifact Analysis 附註和公開金鑰的關聯。

二進位授權會使用 Artifact Analysis 儲存授權程序中使用的信任中繼資料。每建立一個驗證者,就必須建立一個 Artifact Analysis 記事。每項認證都會儲存為這份記事的發生項目。

如要建立驗證者,請按照下列步驟操作:

  1. 前往驗證者專案的「二進位授權」頁面。

    前往「二進位授權」

  2. 在「認證者」分頁中,點選「建立」。

  3. 按一下「Create New Attestor」。

  4. 在「Attestor Name」(認證者名稱) 中,輸入認證者名稱 (例如 build-secure 或 prod-qa)。

  5. 如要將公開金鑰新增至驗證者,請按照下列步驟操作:

    PKIX (本機金鑰)

    1. 按一下「Add a PKIX Key」。
    2. 按一下「從檔案匯入」。
    3. 找出並選取先前儲存的 PKIX 金鑰檔案。注意:您也可以貼上 PEM 格式的公開金鑰。
    4. 選取「Signature algorithm」。本指南中的範例金鑰是使用橢圓曲線 P256 - SHA 摘要演算法產生。

    PKIX (Cloud KMS)

    1. 按一下「Add a PKIX Key」。
    2. 按一下「Import from Cloud KMS」(從 Cloud KMS 匯入)。
    3. 在開啟的視窗中,輸入金鑰版本的資源 ID。資源 ID 的格式如下:

      projects/KMS_KEY_PROJECT_ID/locations/KMS_KEY_LOCATION/keyRings/KMS_KEYRING_NAME/cryptoKeys/KMS_KEY_NAME/cryptoKeyVersions/KMS_KEY_VERSION
      

      其中:

      • KMS_KEY_PROJECT_ID 是儲存金鑰的專案 ID
      • KMS_KEY_LOCATION 是金鑰的位置 (global 為預設值)
      • KMS_KEYRING_NAME 是金鑰環的名稱
      • KMS_KEY_NAME 是金鑰名稱
      • KMS_KEY_VERSION 是金鑰版本

      如果您使用本頁的範例環境變數建立 Cloud KMS 金鑰組,可以使用下列指令查看資源 ID:

      echo projects/${KMS_KEY_PROJECT_ID}/locations/${KMS_KEY_LOCATION}/keyRings/${KMS_KEYRING_NAME}/cryptoKeys/${KMS_KEY_NAME}/cryptoKeyVersions/${KMS_KEY_VERSION}
      
    4. 按一下「提交」。

  6. 如要使用先前建立的現有附註,請展開「Advanced Settings」(進階設定) 專區。

    1. 取消選取「Automatically generate an Artifact Analysis note」(自動產生 Artifact Analysis 附註)。

    2. 在「Artifact Analysis Note ID」(Artifact Analysis 附註 ID) 欄位中輸入完整名稱。名稱格式為 projects/PROJECT_ID/notes/NOTE_ID。

  7. 點選「建立」。

確認驗證者已建立

如要確認驗證者是否已建立,請按照下列指示操作:

  1. 返回 Google Cloud 控制台的「Binary Authorization」頁面。

  2. 開啟「Attestors」(認證者) 分頁。

多專案設定

如果您採用多專案設定,其中有獨立的部署者和驗證者專案,則必須在驗證者資源上設定額外權限,部署者專案才能使用部署期間建立的驗證。

為部署者專案新增 IAM 角色繫結

您必須為部署者專案服務帳戶新增 IAM 角色繫結至驗證者。二進位授權會使用這個角色評估政策,判斷帳戶是否有權存取驗證者。

您必須透過指令列新增 IAM 角色繫結,因為 Google Cloud 控制台不支援這個步驟。

如要新增 IAM 角色繫結,請按照下列步驟操作:

  1. 設定環境變數,儲存專案名稱和編號。

    DEPLOYER_PROJECT_ID=PROJECT_ID
    DEPLOYER_PROJECT_NUMBER="$(
        gcloud projects describe "${DEPLOYER_PROJECT_ID}" \
          --format="value(projectNumber)"
    )"
    
  2. 設定環境變數,儲存專案的服務帳戶名稱:

    DEPLOYER_SERVICE_ACCOUNT="service-${DEPLOYER_PROJECT_NUMBER}@gcp-sa-binaryauthorization."
    
  3. 新增 IAM 角色繫結:

    gcloud --project ATTESTOR_PROJECT_ID \
        beta container binauthz attestors add-iam-policy-binding \
        "projects/ATTESTOR_PROJECT_ID/attestors/ATTESTOR" \
        --member="serviceAccount:${DEPLOYER_SERVICE_ACCOUNT}" \
        --role=roles/binaryauthorization.attestorsVerifier
    

如果在授予 IAM 角色時收到 service account not found 錯誤,可能需要手動建立服務代理。

為設定二進位授權的使用者新增 IAM 角色繫結

您必須為在部署工具專案中,將驗證者新增至二進位授權政策的使用者,新增 IAM 角色繫結,因為使用者必須具備查看要新增驗證者的權限。如有需要,您可以在新增認證者後安全地撤銷這項權限。

您也必須透過指令列新增 IAM 角色繫結,因為 Google Cloud 控制台不支援這個步驟。

如要新增 IAM 角色繫結,請按照下列步驟操作:

gcloud --project ATTESTOR_PROJECT_ID \
    beta container binauthz attestors add-iam-policy-binding \
    "projects/ATTESTOR_PROJECT_ID/attestors/ATTESTOR" \
    --member=ADMIN_EMAIL_ACCOUNT \
    --role=roles/binaryauthorization.attestorsViewer

如要在新增驗證者後移除 IAM 角色繫結,請按照下列步驟操作:

gcloud --project ATTESTOR_PROJECT_ID \
    beta container binauthz attestors remove-iam-policy-binding \
    "projects/ATTESTOR_PROJECT_ID/attestors/ATTESTOR" \
    --member=ADMIN_EMAIL_ACCOUNT \
    --role=roles/binaryauthorization.attestorsViewer

後續步驟