本頁說明如何使用 Google Cloud CLI 在二進位授權中建立驗證者。您也可以使用 Google Cloud 控制台或 REST API 執行這些步驟。這項工作是設定二進位授權的一部分。
Cloud Build 使用者:您可以改用built-by-cloud-build
驗證者,只部署 Cloud Build 建構的映像檔。
「驗證者」是二進位授權用來驗證「認證」的Google Cloud 資源。如要進一步瞭解認證,請參閱「二進位授權總覽」。
如要建立驗證者,請執行下列操作:
- 在 Artifact Analysis 中建立附註,儲存驗證程序中使用的可信中繼資料。
- 設定可用於驗證驗證者身分的公用金鑰基礎架構 (X.509) (PKIX) 金鑰組。(由 Cloud Key Management Service (Cloud KMS) 產生的非對稱金鑰配對採用 PKIX 相容格式)。
- 在二進位授權中建立驗證者,並將您建立的附註和公開金鑰建立關聯。
在單一專案設定中,您會在設定二進位授權政策的專案中建立驗證者。 Google Cloud 如需包含這些步驟的單一專案端對端教學課程,請參閱「開始使用 Google Cloud CLI」或「開始使用 Google Cloud 控制台」。
在多專案設定中,建議您使用不同的專案:部署者專案 (用於設定政策)、驗證者專案 (用於儲存驗證者),以及驗證專案 (用於驗證)。如需包含這些步驟的端對端多專案教學課程,請參閱多專案設定。
事前準備
建立認證者之前,請先完成下列步驟:
設定專案環境
在本節中,您將設定環境變數。
設定環境變數,儲存專案名稱和編號。如果驗證者和部署者專案是同一個專案,請為這兩個變數使用相同的專案 ID。
DEPLOYER_PROJECT_ID=DEPLOYER_PROJECT_ID= DEPLOYER_PROJECT_NUMBER="$( gcloud projects describe "${DEPLOYER_PROJECT_ID}" \ --format="value(projectNumber)" )" ATTESTOR_PROJECT_ID=ATTESTOR_PROJECT_ID ATTESTOR_PROJECT_NUMBER="$( gcloud projects describe "${ATTESTOR_PROJECT_ID}" \ --format="value(projectNumber)" )"
您也必須取得專案的服務帳戶名稱:
DEPLOYER_SERVICE_ACCOUNT="service-${DEPLOYER_PROJECT_NUMBER}@gcp-sa-binaryauthorization.iam.gserviceaccount.com" ATTESTOR_SERVICE_ACCOUNT="service-${ATTESTOR_PROJECT_NUMBER}@gcp-sa-binaryauthorization.iam.gserviceaccount.com"
建立構件分析附註
二進位授權會使用構件分析功能,儲存授權程序中使用的可信中繼資料。您建立的每個認證者都必須建立一個構件分析記事。每項認證都會儲存為這則記事的事件。
如要建立附註,請按照下列步驟操作:
設定環境變數,儲存記事 ID 和可供人閱讀的說明:
NOTE_ID=NOTE_ID NOTE_URI="projects/${ATTESTOR_PROJECT_ID}/notes/${NOTE_ID}" DESCRIPTION=DESCRIPTION
更改下列內容:
NOTE_ID
:記事的內部名稱,以英數字元表示,不得包含空格,例如test-attestor-note
NOTE_URI
:記事資源的完整路徑DESCRIPTION
:使用者可自然閱讀的附註顯示名稱,例如Test Attestor Note
在文字編輯器中,建立說明附註的 JSON 檔案:
cat > /tmp/note_payload.json << EOM { "name": "${NOTE_URI}", "attestation": { "hint": { "human_readable_name": "${DESCRIPTION}" } } } EOM
將 HTTP 要求傳送至構件分析 REST API,建立附註:
curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "x-goog-user-project: ${ATTESTOR_PROJECT_ID}" \ --data-binary @/tmp/note_payload.json \ "https://containeranalysis.googleapis.com/v1/projects/${ATTESTOR_PROJECT_ID}/notes/?noteId=${NOTE_ID}"
如要確認記事是否已成功建立,請執行下列指令:
curl \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "x-goog-user-project: ${ATTESTOR_PROJECT_ID}" \ "https://containeranalysis.googleapis.com/v1/projects/${ATTESTOR_PROJECT_ID}/notes/"
設定附註的 IAM 權限
您必須在 Artifact Analysis 附註資源上,將身分與存取權管理 (IAM) 角色授予驗證者專案服務帳戶。方法是將驗證者專案服務帳戶新增至附註 IAM 政策中的 containeranalysis.notes.occurrences.viewer
角色。
如要新增角色,請按照下列步驟操作:
產生 JSON 檔案,其中包含在記事上設定 IAM 角色所需的資訊:
cat > /tmp/iam_request.json << EOM { "resource": "${NOTE_URI}", "policy": { "bindings": [ { "role": "roles/containeranalysis.notes.occurrences.viewer", "members": [ "serviceAccount:${ATTESTOR_SERVICE_ACCOUNT}" ] } ] } } EOM
將服務帳戶和要求的存取角色新增至您建立的記事 IAM 政策:
curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "x-goog-user-project: ${ATTESTOR_PROJECT_ID}" \ --data-binary @/tmp/iam_request.json \ "https://containeranalysis.googleapis.com/v1/projects/${ATTESTOR_PROJECT_ID}/notes/${NOTE_ID}:setIamPolicy"
多專案使用
如果您將驗證者儲存在一個專案中,並在另一個專案中部署,則必須在驗證者上,將 roles/binaryauthorization.attestorsVerifier
角色授予與部署者專案相關聯的服務帳戶。
設定加密編譯金鑰
二進位授權可讓您使用 PKIX 金鑰驗證認證。
產生金鑰組
在本指南中,您將使用建議的橢圓曲線數位簽章演算法 (ECDSA),產生 PKIX 金鑰組。您也可以使用 RSA 或 PGP 金鑰組。 如要進一步瞭解簽署演算法,請參閱金鑰用途與演算法。
PKIX 金鑰組包含私密金鑰 (簽署者用來簽署認證) 和公開金鑰 (您新增至認證者)。在部署時,Binary Authorization 會使用這個公開金鑰驗證認證。
PKIX (Cloud KMS)
如要在 Cloud KMS 中建立金鑰組,請按照下列步驟操作:
如要設定建立金鑰組所需的環境變數,請執行下列指令:
KMS_KEY_PROJECT_ID=
KMS_KEY_PROJECT_ID
KMS_KEY_LOCATION=KMS_KEY_LOCATION
KMS_KEYRING_NAME=KMS_KEYRING_NAME
KMS_KEY_NAME=KMS_KEY_NAME
KMS_KEY_VERSION=KMS_KEY_VERSION
KMS_KEY_PURPOSE=asymmetric-signing KMS_KEY_ALGORITHM=KMS_KEY_ALGORITHM
KMS_PROTECTION_LEVEL=KMS_PROTECTION_LEVEL
更改下列內容:
KMS_KEY_PROJECT_ID
:儲存金鑰的專案 IDKMS_KEY_LOCATION
:金鑰位置KMS_KEYRING_NAME
:金鑰環的名稱KMS_KEY_NAME
:金鑰名稱KMS_KEY_VERSION
:金鑰版本KMS_KEY_ALGORITHM
:演算法; 建議使用ec-sign-p256-sha256
KMS_PROTECTION_LEVEL
:防護等級,例如software
如要建立金鑰環,請執行下列指令:
gcloud kms keyrings create ${KMS_KEYRING_NAME} \ --location ${KMS_KEY_LOCATION}
如要建立金鑰,請執行下列指令:
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}
更改下列內容:
KMS_KEY_NAME
:金鑰名稱KMS_KEY_LOCATION
:金鑰位置KMS_KEYRING_NAME
:金鑰環的名稱KMS_KEY_PURPOSE
:金鑰用途,設為ASYMMETRIC_SIGN
KMS_KEY_ALGORITHM
:建議使用此演算法。ec-sign-p256-sha256
KMS_PROTECTION_LEVEL
:防護等級,例如software
PKIX (本機金鑰)
如要產生新的本機非對稱 PKIX 金鑰配對並儲存在檔案中,請執行下列步驟:
產生私密金鑰:
PRIVATE_KEY_FILE 是包含私密金鑰的檔案名稱,用於簽署認證酬載。
PRIVATE_KEY_FILE="/tmp/ec_private.pem" openssl ecparam -genkey -name prime256v1 -noout -out ${PRIVATE_KEY_FILE}
從私密金鑰中擷取公開金鑰,並儲存在檔案中:
PUBLIC_KEY_FILE 是包含儲存在驗證者中的公開金鑰的檔案名稱。
PUBLIC_KEY_FILE="/tmp/ec_public.pem" openssl ec -in ${PRIVATE_KEY_FILE} -pubout -out ${PUBLIC_KEY_FILE}
建立驗證者
如要建立認證者,請按照下列步驟操作:
設定環境變數,儲存在 Binary Authorization 中定義的驗證者名稱:
ATTESTOR_NAME=ATTESTOR_NAME
其中 ATTESTOR_NAME 是您要建立的驗證者名稱 (例如
build-secure
或prod-qa
)。在二進位授權中建立驗證者資源:
gcloud --project="${ATTESTOR_PROJECT_ID}" \ container binauthz attestors create "${ATTESTOR_NAME}" \ --attestation-authority-note="${NOTE_ID}" \ --attestation-authority-note-project="${ATTESTOR_PROJECT_ID}"
為部署者專案新增至驗證者的 IAM 角色繫結。二進位授權評估政策時,會使用這項設定判斷專案是否有權存取任何相關聯的認證。
gcloud container binauthz attestors add-iam-policy-binding \ "projects/${ATTESTOR_PROJECT_ID}/attestors/${ATTESTOR_NAME}" \ --member="serviceAccount:${DEPLOYER_SERVICE_ACCOUNT}" \ --role=roles/binaryauthorization.attestorsVerifier
如要將公開金鑰新增至驗證者,請按照下列步驟操作:
PKIX (Cloud KMS)
如要將 Cloud KMS 金鑰組中的公開金鑰新增至驗證者,請執行下列指令:
gcloud --project="${ATTESTOR_PROJECT_ID}" \ container binauthz attestors public-keys add \ --attestor="${ATTESTOR_NAME}" \ --keyversion-project="${KMS_KEY_PROJECT_ID}" \ --keyversion-location="${KMS_KEY_LOCATION}" \ --keyversion-keyring="${KMS_KEYRING_NAME}" \ --keyversion-key="${KMS_KEY_NAME}" \ --keyversion="${KMS_KEY_VERSION}"
PKIX (本機金鑰)
如要將本機儲存的 PKIX 公開金鑰新增至認證者,請執行下列指令:
gcloud --project="${ATTESTOR_PROJECT_ID}" \ container binauthz attestors public-keys add \ --attestor="${ATTESTOR_NAME}" \ --pkix-public-key-file=${PUBLIC_KEY_FILE} \ --pkix-public-key-algorithm=ecdsa-p256-sha256
如果您將公開金鑰新增至認證者,但未指定金鑰 ID (可以是任何字串),系統會自動以 RFC 6920 格式指派金鑰 ID:
ni:///sha-256;...
,其中...
是公開金鑰的編碼雜湊。這個值會傳回至指令輸出的id
欄位。傳回的 ID 可以儲存在PUBLIC_KEY_ID
中,並用於建立認證。
儲存公開金鑰 ID
如要建立認證,您需要公開金鑰 ID。
如要儲存公開金鑰 ID,可以從上述 binauthz attestors public-keys add
指令的輸出內容複製。
或者,您也可以隨時使用下列指令查看驗證者的公開金鑰 ID:
gcloud container binauthz attestors describe ${ATTESTOR}
。
如要將公開金鑰 ID 儲存在環境變數中,請輸入下列指令:
PUBLIC_KEY_ID=$(gcloud container binauthz attestors describe ${ATTESTOR_NAME} \
--format='value(userOwnedGrafeasNote.publicKeys[0].id)')
確認驗證者已建立
如要確認驗證者已建立,請執行下列指令:
gcloud container binauthz attestors list \ --project="${ATTESTOR_PROJECT_ID}"
後續步驟
- 瞭解如何為認證者建立認證。
- 使用Google Cloud 控制台、Google Cloud CLI 和 REST API 更新二進位授權政策,要求提供認證。