本教學課程說明如何在多專案設定中使用二進位授權。如要瞭解更簡單的單一專案設定,請參閱「開始使用 Google Cloud CLI (GKE)」。
如要分散權責,您可以在多專案設定中設定二進位授權。本教學課程稍後會說明各項專案的用途。
目標
在本教學課程中,您會執行下列工作:為部署作業 (GKE)、驗證者和驗證管理設定不同的專案,以支援分散權責。
建立公開金鑰基礎架構 (X.509) (PKIX) 金鑰組,用於簽署及驗證認證。
建立驗證者,供二進位授權強制執行工具驗證認證。
簽署範例映像檔,建立認證。
部署範例映像檔來測試政策。
您必須透過 Identity and Access Management (IAM) 為每項專案設定適當的存取控管機制。
為提高安全性,您可以使用 VPC Service Controls,保護在本教學課程中建立的資源。詳情請參閱「使用 VPC Service Controls 確保安全」。
費用
在本文件中,您會使用下列 Google Cloud計費元件:
您可以使用 Pricing Calculator,根據預測用量估算費用。
事前準備
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
Install the Google Cloud CLI.
-
Configure the gcloud CLI to use your federated identity.
For more information, see Sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init - 安裝
kubectl,以便與 GKE 互動。
設定部署者專案
部署者專案會管理 Google Kubernetes Engine (GKE) 叢集 (您在其中部署映像檔),以及二進位授權在部署時強制執行的二進位授權政策。您可以有多個部署工具專案,具體取決於環境的大小、複雜程度和其他需求。
如要設定部署者專案,請按照下列步驟操作:
如果您尚未建立專案並在 Google Cloud 控制台中啟用計費功能,請先完成這些步驟。
Identity and Access Management 附註:部署工具專案包含 GKE 叢集。這項專案的 Identity and Access Management 設定應反映這點。
設定環境變數,儲存 Google Cloud 專案和編號:
DEPLOYER_PROJECT_ID=DEPLOYER_PROJECT_ID
將 DEPLOYER_PROJECT_ID 替換為 Google Cloud 專案 ID。
DEPLOYER_PROJECT_NUMBER=$(gcloud projects describe "${DEPLOYER_PROJECT_ID}" \ --format="value(projectNumber)")啟用 API:
Artifact Registry
gcloud --project=${DEPLOYER_PROJECT_ID} \ services enable\ container.googleapis.com\ artifactregistry.googleapis.com\ binaryauthorization.googleapis.com取得部署工具專案服務帳戶名稱:
DEPLOYER_SERVICE_ACCOUNT="service-${DEPLOYER_PROJECT_NUMBER}@gcp-sa-binaryauthorization."在後續步驟中,您會使用服務帳戶名稱,設定與驗證者相關聯的 Artifact Analysis 附註權限。
設定認證者專案
「驗證者專案」會儲存驗證者,可驗證映像檔是否已準備好部署。通常,您會有一個驗證者專案,做為授權程序中信任方資訊的集中儲存庫。這樣一來,您就能集中管理驗證認證者身分所需的安全金鑰,並限制只有管理這些金鑰的人員才能存取。
如要設定驗證者專案,請按照下列步驟操作:
如果您尚未建立專案並在 Google Cloud 控制台中啟用計費功能,請先完成這些步驟。
Identity and Access Management 附註:由於這項專案包含您的認證者,因此只有安全人員應具備寫入權限。
設定環境變數,儲存專案 ID 和編號:
ATTESTOR_PROJECT_ID=ATTESTOR_PROJECT_ID
將 ATTESTOR_PROJECT_ID 替換為驗證者專案 ID。
ATTESTOR_PROJECT_NUMBER=$(gcloud projects describe "${ATTESTOR_PROJECT_ID}" \ --format="value(projectNumber)")啟用 Artifact Analysis 和二進位授權 API:
gcloud services --project=${ATTESTOR_PROJECT_ID} \ enable containeranalysis.googleapis.com \ binaryauthorization.googleapis.com取得驗證者專案服務帳戶名稱:
ATTESTOR_SERVICE_ACCOUNT="service-${ATTESTOR_PROJECT_NUMBER}@gcp-sa-binaryauthorization."在後續步驟中,您會使用服務帳戶名稱,設定與驗證者相關聯的 Artifact Analysis 附註權限。
設定認證專案
認證專案會儲存驗證者在驗證映像檔時建立的認證。獨立的認證專案可讓您更輕鬆地整理及檢查軟體整備狀態的聲明。
如果您尚未建立專案並在 Google Cloud 控制台中啟用計費功能,請先完成這些步驟。
Identity and Access Management 附註:所有涉及二進位授權的角色,都應具備這項專案中 Artifact Analysis 附註和項目的讀取權限,但只有認證管理員需要寫入權限。
設定環境變數來儲存專案名稱:
ATTESTATION_PROJECT_ID=ATTESTATION_PROJECT_ID
將 ATTESTATION_PROJECT_ID 替換為認證專案 ID。
啟用 Artifact Analysis 和二進位授權 API:
gcloud services --project=${ATTESTATION_PROJECT_ID} \ enable containeranalysis.googleapis.com \ binaryauthorization.googleapis.com
建立叢集
現在,您可以在部署工具專案中建立 GKE 叢集。這個叢集會執行您部署的容器映像檔。建立叢集時,請將 --binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE 旗標傳遞至 gcloud container clusters create 指令。
如要建立叢集,請按照下列步驟操作:
gcloud --project=${DEPLOYER_PROJECT_ID} \
container clusters create \
--binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE \
--zone us-central1-a \
test-cluster
在這裡,您會在 GKE 可用區 us-central1-a 中建立名為 test-cluster 的叢集。
您也必須更新 kubectl 安裝作業的本機 kubeconfig 檔案。這會提供在 GKE 中存取叢集所需的憑證和端點資訊。
如要更新本機 kubeconfig 檔案,請按照下列步驟操作:
gcloud --project=${DEPLOYER_PROJECT_ID} \
container clusters get-credentials \
--zone us-central1-a \
test-cluster
建立驗證者
「驗證者」負責驗證必要程序是否已完成,然後才能部署容器映像檔。這個實體可以是人類使用者,但更常是機器程序,例如建構和測試系統,或持續整合 (CI) 和部署 (CD) 管道。您可以在驗證者專案中建立驗證者。
如要建立驗證者,您必須:
- 在 Artifact Analysis 中建立附註,儲存授權程序中使用的信任中繼資料
- 在驗證者專案中建立驗證者本身,並建立您建立的附註
- 為部署者專案服務帳戶新增 IAM 角色繫結,並指派給驗證者
- 設定 Artifact Analysis 附註的權限
在本教學課程中,您有一個名為 test-attestor 的驗證者,以及一個名為 test-attestor-note 的 Container Analysis 附註。在實際情境中,您可以有任意數量的認證者,每個認證者都代表參與映像檔授權程序的其中一方。
建立 Artifact Analysis 附註
設定變數,用於儲存驗證者和 Artifact Analysis 附註的名稱:
ATTESTOR_NAME=test-attestor NOTE_ID=test-attestor-note
更改項目:
- test-attestor:您選擇的驗證者名稱。
- test-attestor-note:您選擇的驗證者附註名稱。
在
/tmp/note_payload.json中建立 JSON 檔案,說明 Container Analysis 附註:cat > /tmp/note_payload.json << EOM { "name": "projects/${ATTESTOR_PROJECT_ID}/notes/${NOTE_ID}", "attestation": { "hint": { "human_readable_name": "Attestor Note" } } } EOM傳送 HTTP 要求至 Artifact Analysis REST API,建立附註:
curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ --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)" \ "https://containeranalysis.googleapis.com/v1/projects/${ATTESTOR_PROJECT_ID}/notes/${NOTE_ID}"
建立驗證者
現在可以建立驗證者:
在二進位授權中建立驗證者:
gcloud --project=${ATTESTOR_PROJECT_ID} \ container binauthz attestors create ${ATTESTOR_NAME} \ --attestation-authority-note=${NOTE_ID} \ --attestation-authority-note-project=${ATTESTOR_PROJECT_ID}確認驗證者已建立:
gcloud --project=${ATTESTOR_PROJECT_ID} \ container binauthz attestors list
您建立的驗證者尚未與 PKIX 金鑰組建立關聯,因此還無法使用。請按照下方步驟建立 PKIX 金鑰組。
為部署者專案新增 IAM 角色繫結
您必須為部署者專案新增 IAM 角色繫結至驗證者。二進位授權會使用這個帳戶評估政策,判斷專案是否有權存取任何相關聯的認證。
如要新增 IAM 角色繫結,請按照下列步驟操作:
gcloud --project ${ATTESTOR_PROJECT_ID} \
container binauthz attestors add-iam-policy-binding \
"projects/${ATTESTOR_PROJECT_ID}/attestors/${ATTESTOR_NAME}" \
--member="serviceAccount:${DEPLOYER_SERVICE_ACCOUNT}" \
--role=roles/binaryauthorization.attestorsVerifier
設定 Artifact Analysis 附註的權限
您也必須設定所建立 Artifact Analysis 附註的權限,讓部署者專案和驗證者專案都能存取。方法是更新附註的 IAM 政策,將「檢視者」存取權指派給專案服務帳戶。
產生 JSON 檔案,其中包含在附註上設定 IAM 政策所需的資訊。
cat > /tmp/iam_request.json << EOM { 'resource': 'projects/${ATTESTOR_PROJECT_ID}/notes/${NOTE_ID}', 'policy': { 'bindings': [ { 'role': 'roles/containeranalysis.notes.occurrences.viewer', 'members': [ 'serviceAccount:${ATTESTOR_SERVICE_ACCOUNT}', 'serviceAccount:${DEPLOYER_SERVICE_ACCOUNT}' ] } ] } } EOM將服務帳戶和要求的存取權角色,新增至您建立的附註 IAM 政策:
curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ --data-binary @/tmp/iam_request.json \ "https://containeranalysis.googleapis.com/v1/projects/${ATTESTOR_PROJECT_ID}/notes/${NOTE_ID}:setIamPolicy"
設定 PKIX 金鑰
二進位授權會使用加密編譯金鑰,安全地驗證認證者的身分。確保只有經過驗證的對象才能參與容器映像檔的授權。金鑰組包含私密金鑰和公開金鑰,前者用於數位簽署驗證,後者則由您新增至驗證者,並由二進位授權服務儲存。
在本教學課程中,您將使用建議的橢圓曲線數位簽章演算法 (ECDSA) 建立金鑰組。您也可以使用 RSA 或 PGP 金鑰簽署。如要進一步瞭解簽署演算法,請參閱「金鑰用途和演算法」。
Cloud Key Management Service (Cloud KMS) 產生及儲存的非對稱金鑰符合 PKIX 標準。如要進一步瞭解如何使用 PKIX 金鑰和 Cloud KMS,請參閱「使用 CLI 建立驗證者」。
產生金鑰組
PKIX 金鑰組包含私密金鑰和公開金鑰,簽署者會使用私密金鑰對認證進行數位簽署,而您會將公開金鑰新增至驗證者。部署時,二進位授權會使用這個公開金鑰,驗證由私密金鑰簽署的認證。
產生私密金鑰:
如要產生新的本機非對稱 PKIX 金鑰組,並儲存在檔案中,請按照下列步驟操作:
PKIX (Cloud KMS)
這個步驟說明如何使用在 Cloud Key Management Service 中產生及儲存的金鑰執行認證。
設定環境變數,儲存 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_PROJECT_ID:儲存金鑰的專案 ID
- KMS_KEY_LOCATION:金鑰的位置
- KMS_KEYRING_NAME:金鑰環名稱
- KMS_KEY_NAME:金鑰名稱
- KMS_KEY_VERSION:金鑰版本
[選用] 設定 KMS 金鑰:
建立 KMS 金鑰,其公開金鑰可儲存在驗證者中。這個步驟也會設定您在下方使用的環境變數。
如要建立金鑰並設定環境變數,請按照下列步驟操作:
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建立 KMS 金鑰環:
gcloud kms keyrings create ${KMS_KEYRING_NAME} \ --location ${KMS_KEY_LOCATION} \ --project ${KMS_KEY_PROJECT_ID}建立金鑰:
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} \ --project ${KMS_KEY_PROJECT_ID}如要進一步瞭解如何建立 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 (本機金鑰)
如要產生私密金鑰,請執行下列指令:
PRIVATE_KEY_FILE="/tmp/ec_private.pem" openssl ecparam -genkey -name prime256v1 -noout -out ${PRIVATE_KEY_FILE}PRIVATE_KEY_FILE 是檔案名稱,內含儲存在驗證者中的私密金鑰。
從私密金鑰擷取公開金鑰,並儲存在檔案中:
PUBLIC_KEY_FILE="/tmp/ec_public.pem" openssl ec -in ${PRIVATE_KEY_FILE} -pubout -out ${PUBLIC_KEY_FILE}PUBLIC_KEY_FILE 是檔案名稱,其中包含儲存在驗證者中的公開金鑰。
如要將匯出的公開金鑰新增至驗證者,請執行下列程式碼。
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二進位授權會使用驗證者中的公開金鑰來驗證認證。
設定政策
現在,您可以在部署工具專案中設定政策。在這個步驟中,您會將政策 YAML 檔案匯出至本機系統,並修改預設規則,要求由您在上方定義的驗證者提供驗證。
如要設定政策,請按照下列步驟操作:
建立新的政策檔案,允許 Google 維護的系統映像檔,將
evaluationMode設為REQUIRE_ATTESTATION,並新增名為requireAttestationsBy的節點,參照您建立的認證者:cat > /tmp/policy.yaml << EOM globalPolicyEvaluationMode: ENABLE defaultAdmissionRule: evaluationMode: REQUIRE_ATTESTATION enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG requireAttestationsBy: - projects/${ATTESTOR_PROJECT_ID}/attestors/${ATTESTOR_NAME} name: projects/${DEPLOYER_PROJECT_ID}/policy EOM將政策 YAML 檔案匯入二進位授權:
gcloud --project=${DEPLOYER_PROJECT_ID} \ container binauthz policy import /tmp/policy.yaml
如要進一步瞭解如何設定政策,請參閱「使用 CLI 設定政策」。
測試政策
在本教學課程中,您將為 Artifact Registry 的公開「Hello World!」範例映像檔建立認證。一開始,由於缺少必要的認證,強制執行工具會禁止部署映像檔。
嘗試部署映像檔:
Artifact Registry
kubectl run hello-server --image us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 --port 8080
現在,請確認二進位授權已封鎖部署作業:
kubectl get pods
指令會輸出下列訊息,指出映像檔未部署:
No resources found.
您可以進一步瞭解部署作業:
kubectl get event --template \
'{{range.items}}{{"\033[0;36m"}}{{.reason}}:{{"\033[0m"}}\{{.message}}{{"\n"}}{{end}}'
您會看到類似下列內容的回應:
FailedCreate: Error creating: pods POD_NAME is forbidden: admission webhook "imagepolicywebhook.image-policy.k8s.io" denied the request: Image IMAGE_NAME denied by Binary Authorization default admission rule. Image IMAGE_NAME denied by attestor ATTESTOR_NAME: No attestations found
在這個輸出內容中:
- POD_NAME:Pod 的名稱。
- IMAGE_NAME:映文件名稱。
- ATTESTOR_NAME:認證者名稱。
請務必刪除部署作業,才能繼續執行下一個步驟:
kubectl delete deployment hello-server
建立認證
驗證是驗證者聲明,表示管道中的必要程序已完成,且相關容器映像檔已獲授權部署。認證本身是經過數位簽署的記錄,其中包含容器映像檔登錄檔中儲存的映像檔版本完整路徑,以及認證者的身分。
在本教學課程中,您的認證只會聲明您授權部署映像檔。在認證專案中建立認證。
如要建立認證,請按照下列指示操作:
設定變數,用於儲存映像檔的存放區路徑和摘要:
Artifact Registry
IMAGE_PATH="us-docker.pkg.dev/google-samples/containers/gke/hello-app" IMAGE_DIGEST="sha256:37e5287945774f27b418ce567cd77f4bbc9ef44a1bcd1a2312369f31f9cce567" IMAGE_TO_ATTEST=${IMAGE_PATH}@${IMAGE_DIGEST}建立認證
PKIX Cloud KMS
如要使用 Cloud KMS 金鑰建立認證,請執行下列指令:
gcloud beta container binauthz attestations sign-and-create \ --project="${PROJECT_ID}" \ --artifact-url="${IMAGE_TO_ATTEST}" \ --attestor="${ATTESTOR_NAME}" \ --attestor-project="${PROJECT_ID}" \ --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 (本機金鑰)
如要使用本機金鑰建立認證,請按照下列步驟操作:
產生認證酬載:
gcloud --project=${ATTESTATION_PROJECT_ID} \ container binauthz create-signature-payload \ --artifact-url=${IMAGE_TO_ATTEST} > /tmp/generated_payload.json酬載 JSON 檔案包含下列內容:
Artifact Registry
{ "critical": { "identity": { "docker-reference": "us-docker.pkg.dev/google-samples/containers/gke/hello-app" }, "image": { "docker-manifest-digest": "sha256:37e5287945774f27b418ce567cd77f4bbc9ef44a1bcd1a2312369f31f9cce567" }, "type": "Google cloud binauthz container signature" } }簽署酬載。
如果使用本機 PKIX 檔案,請使用本機 PKIX 私密金鑰簽署酬載,並輸出簽章檔案:
openssl dgst -sha256 -sign ${PRIVATE_KEY_FILE} /tmp/generated_payload.json > /tmp/ec_signature輸出檔案是您在上方建立的酬載 JSON 檔案的已簽署版本。
從驗證者取得公開金鑰 ID。
您隨時可以使用
gcloud container binauthz attestors describe ATTESTOR_NAME指令查看公開金鑰 ID。如要將公開金鑰 ID 儲存至環境變數,請輸入下列指令:
PUBLIC_KEY_ID=$(gcloud container binauthz attestors describe ${ATTESTOR_NAME} \ --format='value(userOwnedGrafeasNote.publicKeys[0].id)' --project ${ATTESTOR_PROJECT_ID})建立及驗證認證:
gcloud container binauthz attestations create \ --project="${ATTESTATION_PROJECT_ID}" \ --artifact-url="${IMAGE_TO_ATTEST}" \ --attestor="projects/${ATTESTOR_PROJECT_ID}/attestors/${ATTESTOR_NAME}" \ --signature-file=/tmp/ec_signature \ --public-key-id="${PUBLIC_KEY_ID}" \ --validatevalidate旗標會檢查認證是否可由您在政策中設定的驗證者驗證。
確認認證已建立:
gcloud --project=${ATTESTATION_PROJECT_ID} \ container binauthz attestations list \ --attestor=$ATTESTOR_NAME --attestor-project=$ATTESTOR_PROJECT_ID
如要進一步瞭解如何建立認證,請參閱「建立認證」。
重新測試政策
將範例容器映像檔部署至叢集,測試政策。這次您必須使用摘要部署映像檔,而非 1.0 或 latest 等標記,因為二進位授權會使用摘要查詢認證。在本例中,二進位授權允許部署映像檔,因為映像檔具有相關聯的認證。
如要部署映像檔,請按照下列步驟操作:
kubectl run hello-server --image ${IMAGE_TO_ATTEST} --port 8080
如要確認映像檔是否已部署,請按照下列步驟操作:
kubectl get pods
這個指令會輸出類似下方的訊息,表示部署成功:
NAME READY STATUS RESTARTS AGE hello-server-579859fb5b-h2k8s 1/1 Running 0 1m
您已成功部署容器映像檔,並確認設定正常運作,現在可以刪除在 GKE 中建立的叢集:
gcloud --project=${DEPLOYER_PROJECT_ID} \
container clusters delete \
--zone=us-central1-a \
test-cluster
清除所用資源
為避免因為本教學課程所用資源,導致系統向 Google Cloud 帳戶收取費用,請刪除含有相關資源的專案,或者保留專案但刪除個別資源。
刪除在 GKE 中建立的叢集:
gcloud container clusters delete \ --zone=us-central1-a \ test-cluster您也可以刪除為本教學課程建立的 Google Cloud 專案。