1. ภาพรวม
Codelab นี้สร้างขึ้นจาก Confidential Space Codelab การรองรับอิมเมจคอนเทนเนอร์ที่ลงนามแล้วมีตัวเลือกที่จะตรวจสอบสิทธิ์คอนเทนเนอร์โดยใช้คีย์สาธารณะที่ได้รับการรับรองแทนการระบุไดเจสต์อิมเมจในนโยบาย Workload Identity Pool (WIP)
สิ่งที่เปลี่ยนแปลงในการรองรับอิมเมจคอนเทนเนอร์ที่รับรองในพื้นที่ลับ
ความสามารถในการใช้งานที่ดีขึ้น: เมื่อมีการเปิดตัวฟีเจอร์อิมเมจคอนเทนเนอร์ที่ลงนามแล้ว ตอนนี้เราสามารถเปลี่ยนจากวิธีไดเจสต์อิมเมจภาระงานไปใช้วิธีลายเซ็นคอนเทนเนอร์สำหรับผู้ทำงานร่วมกัน/ผู้ตรวจสอบที่ให้สิทธิ์อิมเมจได้
- เมื่อใช้ไดเจสต์รูปภาพโดยตรง เจ้าของทรัพยากรต้องอัปเดตนโยบายด้วยไดเจสต์รูปภาพทุกครั้งที่ให้สิทธิ์รูปภาพใหม่ เมื่อใช้ลายเซ็นรูปภาพ นโยบายจะมีลายนิ้วมือคีย์สาธารณะ ซึ่งผู้ทำงานร่วมกัน/ผู้ตรวจสอบเป็นเจ้าของคีย์ส่วนตัวที่เกี่ยวข้องและใช้เพื่อลงนามในรูปภาพที่ได้รับการตรวจสอบ
- สำหรับรูปแบบความปลอดภัยบางรูปแบบ การอ้างอิงคีย์ Signing รูปภาพที่เชื่อถือได้จะสะดวกกว่าการอัปเดตรายการค่าสรุปรูปภาพใหม่
ไม่มีการถดถอยด้านความปลอดภัย: วิธีการลงนามคอนเทนเนอร์นี้จะไม่ทำให้เกิดการถดถอยด้านความปลอดภัยกับวิธีไดเจสต์อิมเมจก่อนหน้านี้ เนื่องจากขอบเขตความน่าเชื่อถือยังคงเหมือนเดิม ในแนวทางลายเซ็นคอนเทนเนอร์ เจ้าของทรัพยากรจะให้สิทธิ์คีย์การยืนยันด้วยการระบุลายนิ้วมือคีย์สาธารณะที่เชื่อถือได้ในนโยบาย WIP และการตรวจสอบการให้สิทธิ์จะดำเนินการโดยบริการยืนยันเอกสารรับรองและ WIP บริการยืนยันเอกสารรับรองจะยืนยันว่าลายเซ็นเชื่อมโยงกับภาระงานที่ทำงานอยู่ และนโยบาย WIP จะตรวจสอบว่าคีย์สาธารณะที่ยืนยันโดยบริการนั้นได้รับอนุญาตจากนโยบาย
การรักษาความปลอดภัยที่รัดกุม: การใช้ลายเซ็นอิมเมจคอนเทนเนอร์ช่วยให้มีการมอบสิทธิ์จำนวนหนึ่งให้กับผู้เซ็นชื่ออิมเมจได้ เมื่อระบุลายนิ้วมือคีย์สาธารณะของผู้ลงนามที่เชื่อถือได้ในนโยบายเอกสารรับรอง เจ้าของทรัพยากรจะอนุญาตให้ผู้ลงนามรับรองว่าอิมเมจคอนเทนเนอร์ใดเป็นไปตามนโยบาย บริการยืนยันเอกสารรับรองจะยืนยันว่าลายเซ็นเชื่อมโยงกับภาระงานที่ทำงานอยู่ และนโยบายจะตรวจสอบว่าคีย์สาธารณะที่สร้างลายเซ็นได้รับอนุญาตจากนโยบาย ด้วยเหตุนี้ การเซ็นชื่อบนรูปภาพอีกชั้นหนึ่งที่เพิ่มเข้ามาจะช่วยรับประกันความปลอดภัยที่เข้มงวดของ Confidential Space
ความแตกต่างเพียงอย่างเดียวระหว่างวิธีการเหล่านี้คือวิธีหลังจะใช้โดยอ้อมเพิ่มเติมอีกชั้นหนึ่ง ซึ่งอนุญาตอิมเมจภาระงานด้วยคีย์ Signing การดำเนินการดังกล่าวจะไม่ก่อให้เกิดช่องโหว่ด้านความปลอดภัยใหม่ใดๆ เนื่องจากขอบเขตการเชื่อถือยังคงเหมือนเดิม
สิ่งที่คุณจะได้เรียนรู้
ใน Codelab นี้ คุณจะได้เรียนรู้วิธีใช้ลายเซ็นอิมเมจคอนเทนเนอร์เพื่อให้สิทธิ์เข้าถึงทรัพยากรที่มีการป้องกัน
- วิธีลงนามอิมเมจคอนเทนเนอร์ที่ได้รับการตรวจสอบโดยใช้
cosign
- วิธีอัปโหลดลายเซ็นของอิมเมจคอนเทนเนอร์ไปยังรีจิสทรี OCI สำหรับการค้นพบและพื้นที่เก็บข้อมูลลายเซ็น
- วิธีกำหนดค่าทรัพยากรระบบคลาวด์ที่จำเป็นสำหรับการเรียกใช้ Confidential Space
- วิธีเรียกใช้ภาระงานในพื้นที่ลับด้วยการรองรับอิมเมจคอนเทนเนอร์ที่ลงนามแล้ว
Codelab นี้จะแสดงวิธีใช้ Confidential Space เพื่อยืนยันอิมเมจคอนเทนเนอร์ที่ลงนามโดยคีย์ที่เชื่อถือได้ซึ่งทำงานบน Google Compute Engine จากระยะไกล
สิ่งที่คุณต้องมี
- ทำ Codelab ที่เป็นความลับของพื้นที่ทำงานให้เสร็จสมบูรณ์
- โปรเจ็กต์ Google Cloud Platform
- เบราว์เซอร์ เช่น Chrome หรือ Firefox
- คุ้นเคยกับเครื่องมือแก้ไขข้อความมาตรฐานของ Linux เช่น Vim, Emacs หรือ Nano
- ความรู้พื้นฐานเกี่ยวกับ Sigstore cosign
- ความรู้พื้นฐานเกี่ยวกับ Google Compute Engine ( Codelab), Confidential VM, คอนเทนเนอร์ และที่เก็บระยะไกล
- ความรู้พื้นฐานเกี่ยวกับ Cloud KMS ( codelab)
- ความรู้พื้นฐานเกี่ยวกับบัญชีบริการ การรวมศูนย์ของ Workload Identity และเงื่อนไขแอตทริบิวต์
- ความรู้พื้นฐานเกี่ยวกับ Artifact Registry
- ความรู้พื้นฐานเกี่ยวกับลายเซ็นดิจิทัล
บทบาทที่เกี่ยวข้องในพื้นที่ทำงานลับที่มีอิมเมจคอนเทนเนอร์ที่ลงชื่อ
ใน Codelab นี้ Primus Bank จะเป็นผู้ตรวจสอบและเจ้าของทรัพยากร ซึ่งจะรับผิดชอบดังต่อไปนี้
- การตั้งค่าทรัพยากรที่จำเป็นด้วยข้อมูลตัวอย่าง
- กำลังตรวจสอบโค้ดภาระงาน
- ใช้
cosign
เพื่อลงนามอิมเมจภาระงาน - กำลังอัปโหลดลายเซ็นไปยังที่เก็บ
- การกำหนดค่านโยบาย WIP เพื่อปกป้องข้อมูลลูกค้า
Secundus Bank จะเป็นผู้เขียนและผู้ดำเนินการด้านภาระงาน และรับผิดชอบในเรื่องต่อไปนี้
- การตั้งค่าทรัพยากรที่จำเป็นสำหรับการจัดเก็บผลลัพธ์
- กำลังเขียนโค้ดภาระงาน
- กำลังเผยแพร่อิมเมจภาระงาน
- การเรียกใช้ภาระงานใน Confidential Space ที่มีการรองรับอิมเมจคอนเทนเนอร์ที่ลงนาม
Secundus Bank จะพัฒนาและเผยแพร่ภาระงานซึ่งจะค้นหาข้อมูลลูกค้าที่จัดเก็บไว้ในที่เก็บข้อมูล Cloud Storage และเป็นของธนาคาร Primus Primus Bank จะตรวจสอบภาระงาน ลงนามในอิมเมจคอนเทนเนอร์ และกำหนดค่านโยบาย WIP เพื่ออนุญาตการเข้าถึงข้อมูลโดยภาระงานที่ได้รับอนุมัติ ระบบจะจัดเก็บผลของการดำเนินการภาระงานนี้ไว้ในที่เก็บข้อมูลพื้นที่เก็บข้อมูลระบบคลาวด์ซึ่งเป็นของธนาคาร Secundus
ทรัพยากรที่เกี่ยวข้องในการตั้งค่าพื้นที่ทำงานลับ
Codelab นี้อ้างอิงตัวแปรจำนวนหนึ่งที่คุณควรตั้งเป็นค่าที่เหมาะสมสำหรับโปรเจ็กต์ GCP ของคุณ คำสั่งใน Codelab นี้จะถือว่าตัวแปรเหล่านี้ได้รับการตั้งค่าแล้ว (เช่น export PRIMUS_INPUT_STORAGE_BUCKET='my-input-bucket'
จะใช้เพื่อตั้งชื่อที่เก็บข้อมูลของพื้นที่เก็บข้อมูลอินพุตของธนาคาร Primus ได้) หากยังไม่ได้ตั้งค่าตัวแปรของชื่อทรัพยากร ระบบจะสร้างตัวแปรตามรหัสโปรเจ็กต์ GCP
กําหนดค่าต่อไปนี้ในโปรเจ็กต์ Primus
$PRIMUS_INPUT_STORAGE_BUCKET
: ที่เก็บข้อมูลที่จัดเก็บไฟล์ข้อมูลลูกค้า$PRIMUS_WORKLOAD_IDENTITY_POOL
: Workload Identity Pool (WIP) ที่ตรวจสอบการอ้างสิทธิ์$PRIMUS_WIP_PROVIDER
: ผู้ให้บริการพูล Workload Identity ซึ่งมีเงื่อนไขการให้สิทธิ์เพื่อใช้กับโทเค็นที่ลงนามโดยบริการยืนยันเอกสารรับรอง$PRIMUS_SERVICEACCOUNT
: บัญชีบริการที่$PRIMUS_WORKLOAD_IDENTITY_POOL
ใช้ในการเข้าถึงทรัพยากรที่มีการป้องกัน ในขั้นตอนนี้ ได้รับสิทธิ์ในการดูข้อมูลลูกค้าที่จัดเก็บไว้ในที่เก็บข้อมูล$PRIMUS_INPUT_STORAGE_BUCKET
$PRIMUS_ENC_KEY
: คีย์ KMS ที่ใช้เข้ารหัสข้อมูลที่จัดเก็บไว้ใน$PRIMUS_INPUT_STORAGE_BUCKET
แหล่งข้อมูลที่เพิ่งเริ่มใช้ Codelab นี้
$PRIMUS_COSIGN_REPOSITORY
: Artifact Registry ที่จะจัดเก็บลายเซ็นอิมเมจภาระงาน$PRIMUS_SIGNING_KEY
: คีย์ KMS ที่ใช้ในการลงนามอิมเมจภาระงานโดยผู้ตรวจสอบ/ผู้ทำงานร่วมกันข้อมูล (เช่น ธนาคาร Primetime ในกรณีนี้)
กําหนดค่าต่อไปนี้ในโปรเจ็กต์ Secundus
$SECUNDUS_ARTIFACT_REGISTRY
: รีจิสทรีอาร์ติแฟกต์ที่จะพุชอิมเมจ Docker ภาระงาน$WORKLOAD_IMAGE_NAME
: ชื่อของอิมเมจ Docker ภาระงาน$WORKLOAD_IMAGE_TAG
: แท็กของอิมเมจ Docker ภาระงาน$WORKLOAD_SERVICEACCOUNT
: บัญชีบริการที่มีสิทธิ์เข้าถึง Confidential VM ที่เรียกใช้ภาระงาน$SECUNDUS_RESULT_BUCKET
: ที่เก็บข้อมูลที่จัดเก็บผลลัพธ์ของภาระงาน
แหล่งข้อมูลอื่นๆ
primus_customer_list.csv
ประกอบด้วยข้อมูลลูกค้า เราจะอัปโหลดข้อมูลนี้ไปยัง$PRIMUS_INPUT_STORAGE_BUCKET
และสร้างภาระงานที่จะค้นหาข้อมูลนี้
เวิร์กโฟลว์ที่มีอยู่
เมื่อเรียกใช้ภาระงานในพื้นที่ลับ กระบวนการต่อไปนี้จะเกิดขึ้นโดยใช้ทรัพยากรที่กำหนดค่าไว้
- ภาระงานจะขอโทเค็นเพื่อการเข้าถึงทั่วไปของ Google สำหรับ
$PRIMUS_SERVICEACCOUNT
จาก WIP โดยมีโทเค็นบริการ Attestation Verifier พร้อมภาระงานและการอ้างสิทธิ์สภาพแวดล้อม - หากการอ้างสิทธิ์การวัดภาระงานในโทเค็นบริการเครื่องมือยืนยันเอกสารรับรองตรงกับเงื่อนไขแอตทริบิวต์ใน WIP ระบบจะแสดงโทเค็นเพื่อการเข้าถึงสำหรับ
$PRIMUS_SERVICEACCOUNT.
- ภาระงานใช้โทเค็นเพื่อการเข้าถึงบัญชีบริการที่เชื่อมโยงกับ
$PRIMUS_SERVICEACCOUNT
เพื่อเข้าถึงข้อมูลลูกค้าในที่เก็บข้อมูล$PRIMUS_INPUT_STORAGE_BUCKET
- โดยภาระงานจะดำเนินการกับข้อมูลนั้น
- ภาระงานใช้บัญชีบริการ
$WORKLOAD_SERVICEACCOUNT
เพื่อเขียนผลลัพธ์ของการดำเนินการดังกล่าวลงในที่เก็บข้อมูล$SECUNDUS_RESULT_STORAGE_BUCKET
เวิร์กโฟลว์ใหม่ที่รองรับคอนเทนเนอร์ที่ลงนามแล้ว
การรองรับคอนเทนเนอร์ที่ลงนามแล้วจะผสานรวมเข้ากับเวิร์กโฟลว์ที่มีอยู่ตามที่ไฮไลต์ด้านล่าง เมื่อคุณเรียกใช้ภาระงานใน Confidential Space ที่มีการรองรับอิมเมจคอนเทนเนอร์ที่ลงนามแล้ว กระบวนการต่อไปนี้จะเกิดขึ้นโดยใช้ทรัพยากรที่กำหนดค่าไว้
- Confidential Space จะค้นหาลายเซ็นของคอนเทนเนอร์ที่เกี่ยวข้องกับอิมเมจภาระงานที่กำลังทำงานปัจจุบันและส่งลายเซ็นดังกล่าวไปยังผู้ยืนยันเอกสารรับรอง ผู้ยืนยันเอกสารรับรองจะยืนยันลายเซ็น และรวมลายเซ็นที่ถูกต้องไว้ในการอ้างสิทธิ์ในเอกสารรับรอง
- ภาระงานจะขอโทเค็นเพื่อการเข้าถึงทั่วไปของ Google สำหรับ
$PRIMUS_SERVICEACCOUNT
จาก WIP โดยมีโทเค็นบริการ Attestation Verifier พร้อมภาระงานและการอ้างสิทธิ์สภาพแวดล้อม - หากการอ้างสิทธิ์ลายเซ็นคอนเทนเนอร์ในโทเค็นบริการเครื่องมือยืนยันเอกสารรับรองตรงกับเงื่อนไขแอตทริบิวต์ใน WIP ระบบจะแสดงผลโทเค็นเพื่อการเข้าถึงสำหรับ
$PRIMUS_SERVICEACCOUNT
- ภาระงานใช้โทเค็นเพื่อการเข้าถึงบัญชีบริการที่เชื่อมโยงกับ
$PRIMUS_SERVICEACCOUNT
เพื่อเข้าถึงข้อมูลลูกค้าในที่เก็บข้อมูล$PRIMUS_INPUT_STORAGE_BUCKET
- โดยภาระงานจะดำเนินการกับข้อมูลนั้น
- ภาระงานใช้
$WORKLOAD_SERVICEACCOUNT
เพื่อเขียนผลลัพธ์ของการดำเนินการดังกล่าวไปยังที่เก็บข้อมูล$SECUNDUS_RESULT_STORAGE_BUCKET
2. ตั้งค่าทรัพยากรในระบบคลาวด์
ในฐานะส่วนหนึ่งของการตั้งค่า Confidential Space ก่อนอื่นคุณจะต้องสร้างทรัพยากรระบบคลาวด์ที่จำเป็นภายใต้โปรเจ็กต์ GCP ของธนาคาร Primus และ Secundus นี่คือทรัพยากรที่ใหม่สำหรับ Codelab นี้
ในโปรเจ็กต์ Primus:
- คีย์การลงชื่อ KMS ที่ใช้เพื่อลงนามภาระงาน Secundus หลังจากตรวจสอบโค้ด
- อาร์ติแฟกต์ที่เก็บรีจิสทรีเพื่อจัดเก็บลายเซ็น Cosign
ไม่มีทรัพยากรใหม่ในโปรเจ็กต์ Secundus เมื่อตั้งค่าทรัพยากรเหล่านี้แล้ว คุณจะสร้างบัญชีบริการสำหรับภาระงานพร้อมบทบาทและสิทธิ์ที่จำเป็น จากนั้นสร้างอิมเมจภาระงาน และผู้ตรวจสอบ Primus bank จะรับรองอิมเมจภาระงาน จากนั้นผู้ทำงานร่วมกันข้อมูล (Primus Bank ใน Codelab) จะให้สิทธิ์ภาระงาน และโอเปอเรเตอร์ภาระงาน (ในกรณีนี้คือ Secundus Bank) จะเรียกใช้ภาระงาน
ในฐานะส่วนหนึ่งของการตั้งค่า Confidential Space คุณจะสร้างทรัพยากรระบบคลาวด์ที่จำเป็นในโปรเจ็กต์ Primus และ Secundus GCP
ก่อนเริ่มต้น
- โคลน ที่เก็บนี้โดยใช้คำสั่งด้านล่างเพื่อรับสคริปต์ที่จำเป็นซึ่งใช้เป็นส่วนหนึ่งของ Codelab นี้
$ git clone https://github.com/GoogleCloudPlatform/confidential-space
- ตรวจสอบว่าคุณได้ตั้งค่าโปรเจ็กต์ที่จําเป็นตามที่แสดงด้านล่างแล้ว
$ export PRIMUS_PROJECT_ID=<GCP project id of primus bank>
$ export SECUNDUS_PROJECT_ID=<GCP project id of secundus bank>
- กำหนดตัวแปรสำหรับชื่อทรัพยากรที่กล่าวถึงข้างต้นโดยใช้คำสั่งนี้ คุณลบล้างชื่อทรัพยากรโดยใช้ตัวแปรเหล่านี้ได้ (เช่น
export PRIMUS_INPUT_STORAGE_BUCKET='my-input-bucket'
) - เรียกใช้สคริปต์ต่อไปนี้เพื่อตั้งชื่อตัวแปรที่เหลือให้เป็นค่าโดยอิงตามรหัสโปรเจ็กต์สำหรับชื่อทรัพยากร
$ source config_env.sh
- ติดตั้งลายเซ็นร่วมตามคำแนะนำจากที่นี่
ตั้งค่าทรัพยากรธนาคาร Primus
ในขั้นตอนนี้ คุณจะได้ตั้งค่าทรัพยากรระบบคลาวด์ที่จำเป็นสำหรับธนาคาร Primus เรียกใช้สคริปต์ต่อไปนี้เพื่อตั้งค่าทรัพยากรสำหรับธนาคาร Primus ระบบจะสร้างแหล่งข้อมูลที่ระบุด้านล่างซึ่งเป็นส่วนหนึ่งของขั้นตอนเหล่านี้
- ที่เก็บข้อมูล Cloud Storage (
$PRIMUS_INPUT_STORAGE_BUCKET
) เพื่อจัดเก็บไฟล์ข้อมูลลูกค้าที่เข้ารหัสของธนาคาร Primus - คีย์การเข้ารหัส (
$PRIMUS_ENC_KEY
) และคีย์ริง ($PRIMUS_ENC_KEYRING
) ใน KMS เพื่อเข้ารหัสไฟล์ข้อมูลของธนาคาร Primus - Workload Identity Pool (
$PRIMUS_WORKLOAD_IDENTITY_POOL
) เพื่อตรวจสอบการอ้างสิทธิ์ตามเงื่อนไขแอตทริบิวต์ที่กำหนดค่าภายใต้ผู้ให้บริการ - บัญชีบริการ (
$PRIMUS_SERVICEACCOUNT
) ที่แนบกับ Workload Identity Pool ($PRIMUS_WORKLOAD_IDENTITY_POOL
) ข้างต้นที่มีสิทธิ์เข้าถึง IAM ต่อไปนี้ roles/cloudkms.cryptoKeyDecrypter
เพื่อถอดรหัสข้อมูลโดยใช้คีย์ KMSobjectViewer
เพื่ออ่านข้อมูลจากที่เก็บข้อมูล Cloud Storageroles/iam.workloadIdentityUser
สำหรับการเชื่อมต่อบัญชีบริการนี้กับพูล Workload Identity
$ ./setup_primus_bank_resources.sh
ตั้งค่าทรัพยากรธนาคาร Secundus
ในขั้นตอนนี้ คุณจะได้ตั้งค่าทรัพยากรระบบคลาวด์ที่จำเป็นสำหรับธนาคาร Secundus เรียกใช้สคริปต์ต่อไปนี้เพื่อตั้งค่าทรัพยากรสำหรับธนาคาร Secundus ระบบจะสร้างทรัพยากรซึ่งเป็นส่วนหนึ่งของขั้นตอนด้านล่างนี้
- ที่เก็บข้อมูล Cloud Storage (
$SECUNDUS_RESULT_STORAGE_BUCKET
) สำหรับจัดเก็บผลลัพธ์ของการดำเนินการของภาระงานโดยธนาคาร Secundus
$ ./setup_secundus_bank_resources.sh
3. สร้างและลงนามภาระงาน
สร้างบัญชีบริการภาระงาน
ตอนนี้ คุณจะสร้างบัญชีบริการสำหรับภาระงานพร้อมบทบาทและสิทธิ์ที่จำเป็น เรียกใช้สคริปต์ต่อไปนี้เพื่อสร้างบัญชีบริการภาระงานในโปรเจ็กต์ธนาคาร Secundus VM ที่เรียกใช้ภาระงานจะใช้บัญชีบริการนี้
- บัญชีบริการภาระงานนี้ (
$WORKLOAD_SERVICEACCOUNT
) จะมีบทบาทต่อไปนี้ confidentialcomputing.workloadUser
เพื่อรับโทเค็นเอกสารรับรองlogging.logWriter
เพื่อเขียนบันทึกไปยัง Cloud LoggingobjectViewer
เพื่ออ่านข้อมูลจากที่เก็บข้อมูล Cloud Storage ของ$PRIMUS_INPUT_STORAGE_BUCKET
objectAdmin
เพื่อเขียนผลลัพธ์ภาระงานลงในที่เก็บข้อมูลพื้นที่เก็บข้อมูลระบบคลาวด์ของ$SECUNDUS_RESULT_STORAGE_BUCKET
$ ./create_workload_serviceaccount.sh
สร้างภาระงาน
ในขั้นตอนนี้ คุณจะได้สร้างอิมเมจ Docker ภาระงาน ภาระงานที่ใช้ใน Codelab นี้เป็นแอป Go ง่ายๆ ที่ใช้ CLI ซึ่งนับลูกค้า (จากข้อมูลลูกค้าของธนาคาร Primus) จากสถานที่ตั้งทางภูมิศาสตร์ที่ระบุไว้ในอาร์กิวเมนต์ เรียกใช้สคริปต์ต่อไปนี้เพื่อสร้างภาระงานซึ่งกำลังดำเนินการตามขั้นตอนต่อไปนี้
- สร้าง Artifact Registry(
$SECUNDUS_ARTIFACT_REGISTRY
) ที่เป็นของธนาคาร Secundus - อัปเดตโค้ดภาระงานด้วยชื่อทรัพยากรที่จำเป็น ที่นี่คือโค้ดภาระงานที่ใช้สำหรับ Codelab นี้
- ไบนารี Build Go และสร้าง Dockerfile เพื่อสร้างอิมเมจ Docker ของโค้ดภาระงาน ที่นี่คือ Dockerfile ที่ใช้สำหรับ Codelab นี้
- สร้างและเผยแพร่อิมเมจ Docker ไปยัง Artifact Registry (
$SECUNDUS_ARTIFACT_REGISTRY
) ที่เป็นของธนาคาร Secundus - ให้สิทธิ์อ่าน
$WORKLOAD_SERVICEACCOUNT
แก่$SECUNDUS_ARTIFACT_REGISTRY
ซึ่งจำเป็นสำหรับคอนเทนเนอร์ภาระงานในการดึงอิมเมจ Docker ภาระงานจาก Artifact Registry
$ ./create_workload.sh
ลงนามในภาระงาน
เราจะใช้ Cosign เพื่อลงนามในอิมเมจภาระงาน Cosign จะใช้การจัดเก็บลายเซ็นในที่เก็บเดียวกับรูปภาพที่เซ็นชื่ออยู่โดยค่าเริ่มต้น หากต้องการระบุที่เก็บอื่นสำหรับลายเซ็น ให้ตั้งค่าตัวแปรสภาพแวดล้อม COSIGN_REPOSITORY
เราจะใช้ Artifact Registry เป็นตัวอย่าง นอกจากนี้ คุณยังเลือกรีจิสทรีแบบ OCI อื่นๆ เช่น Docker Hub, AWS CodeArtifact ได้ตามต้องการ
- สร้างที่เก็บ Docker ของ Artifact Registry
$ gcloud config set project $PRIMUS_PROJECT_ID
$ gcloud artifacts repositories create $PRIMUS_COSIGN_REPOSITORY \
--repository-format=docker --location=us
- สร้างคีย์ริงและคีย์ภายใต้ KMS เพื่อลงนามอิมเมจภาระงาน
$ gcloud config set project $PRIMUS_PROJECT_ID
$ gcloud kms keyrings create $PRIMUS_SIGNING_KEYRING \
--location=global
$ gcloud kms keys create $PRIMUS_SIGNING_KEY \
--keyring=$PRIMUS_SIGNING_KEYRING \
--purpose=asymmetric-signing \
--default-algorithm=ec-sign-p256-sha256
--location=us
- สำหรับ Artifact Registry ควรเป็นชื่อเต็มของอิมเมจ เช่น
$LOCATION/$PROJECT/$REPOSITORY/$IMAGE_NAME
คุณสามารถอัปโหลดรูปภาพคอนเทนเนอร์ไปยังที่เก็บสำหรับจัดเก็บลายเซ็นได้
$ export COSIGN_REPOSITORY=us-docker.pkg.dev/${PRIMUS_PROJECT_ID}/${PRIMUS_COSIGN_REPOSITORY}/demo
- มอบบทบาทผู้ดูในที่เก็บ
$PRIMUS_COSIGN_REPOSITORY
ให้กับบัญชีบริการ$WORKLOAD_SERVICEACCOUNT
การดำเนินการนี้จะช่วยให้ Confidential Space ค้นพบลายเซ็นอิมเมจคอนเทนเนอร์ที่อัปโหลดไปยัง$PRIMUS_COSIGN_REPOSITORY
$ gcloud artifacts repositories add-iam-policy-binding ${PRIMUS_COSIGN_REPOSITORY} \
--project=${PRIMUS_PROJECT_ID} --role='roles/viewer' --location=us \
--member="serviceAccount:${WORKLOAD_SERVICEACCOUNT}@${SECUNDUS_PROJECT_ID}.iam.gserviceaccount.com"
Cosign เป็นเครื่องมือทรงประสิทธิภาพที่มีฟีเจอร์การรับรองหลายรายการ สําหรับกรณีการใช้งานของเรา เรากำหนดให้ Cosign ลงนามด้วยคู่คีย์เท่านั้น ฟีเจอร์อิมเมจคอนเทนเนอร์ที่ลงนามนี้ไม่รองรับการลงชื่อแบบไม่ใช้คีย์แบบ Cosign
เมื่อลงนามด้วยคู่คีย์ คุณจะมี 2 ตัวเลือก ได้แก่
- ลงนามด้วยคู่คีย์ในเครื่องที่ Cosign สร้างขึ้น
- เซ็นชื่อด้วยคู่คีย์ที่เก็บไว้ในอื่น (เช่น ใน KMS)
- สร้างคู่คีย์ใน Cosign หากยังไม่มี โปรดดูรายละเอียดเพิ่มเติมที่หัวข้อการรับรองด้วยคีย์ที่จัดการด้วยตนเอง
// Set Application Default Credentials.
$ gcloud auth application-default login
// Generate keys using a KMS provider.
$ cosign generate-key-pair --kms <provider>://<key>
// Generate keys using Cosign.
$ cosign generate-key-pair
ในรายการด้านบนให้แทนที่ <provider>://<key> กับ gcpkms://projects/$PRIMUS_PROJECT_ID/locations/global/keyRings/$PRIMUS_SIGNING_KEYRING/cryptoKeys/$PRIMUS_SIGNING_KEY/cryptoKeyVersions/$PRIMUS_SIGNING_KEYVERSION
- <provider> : หมายถึงโซลูชัน KMS ที่คุณใช้
- <key> : หมายถึงเส้นทางคีย์ใน KMS
- เรียกข้อมูลคีย์สาธารณะสำหรับการยืนยัน
// For KMS providers.
$ cosign public-key --key <some provider>://<some key> > pub.pem
// For local key pair signing.
$ cosign public-key --key cosign.key > pub.pem
- ลงนามภาระงานโดยใช้ Cosign ทำการเข้ารหัส base64 แบบไม่ใช้กับคีย์สาธารณะ
$ PUB=$(cat pub.pem | openssl base64)
// Remove spaces and trailing "=" signs.
$ PUB=$(echo $PUB | tr -d '[:space:]' | sed 's/[=]*$//')
- ลงนามภาระงานโดยใช้ Cosign กับคีย์สาธารณะที่ส่งออกและอัลกอริทึมลายเซ็นที่แนบมา
$ IMAGE_REFERENCE=us-docker.pkg.dev/$SECUNDUS_PROJECT_ID/$SECUNDUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG
// Sign with KMS support.
$ cosign sign --key <some provider>://<some key> $IMAGE_REFERENCE \
-a dev.cosignproject.cosign/sigalg=ECDSA_P256_SHA256 \
-a dev.cosignproject.cosign/pub=$PUB
// Sign with a local key pair.
$ cosign sign --key cosign.key $IMAGE_REFERENCE \
-a dev.cosignproject.cosign/sigalg=ECDSA_P256_SHA256 \
-a dev.cosignproject.cosign/pub=$PUB
--key
[ต้องระบุ] ระบุคีย์การลงนามที่จะใช้ เมื่อพูดถึงคีย์ที่จัดการโดยผู้ให้บริการ KMS โปรดใช้รูปแบบ URI ที่เฉพาะเจาะจงจากทีมสนับสนุนของ Sigstore KMS เมื่ออ้างถึงคีย์ที่ Cosign สร้างขึ้น ให้ใช้ cosign.key แทน$IMAGE_REFERENCE
[ต้องระบุ] ระบุอิมเมจคอนเทนเนอร์ที่จะลงนาม ระบุรูปแบบของIMAGE_REFERENCE
ได้ด้วยแท็กหรือไดเจสต์รูปภาพ ตัวอย่างเช่นus-docker.pkg.dev/$SECUNDUS_PROJECT_ID/secundus-workloads/workload-container:latest or us-docker.pkg.dev/$SECUNDUS_PROJECT_ID/secundus-workloads/workload-container
[IMAGE-digest]
- -a [REQUIRED] ระบุคำอธิบายประกอบที่แนบมากับเพย์โหลดลายเซ็น สำหรับอิมเมจคอนเทนเนอร์ที่ลงนามใน Confidential Space จะต้องมีคีย์สาธารณะและอัลกอริทึมลายเซ็นแนบไปกับเพย์โหลดลายเซ็น
dev.cosignproject.cosign/sigalg
ยอมรับค่า 3 ค่าเท่านั้น ได้แก่- RSASSA_PSS_SHA256: อัลกอริทึม RSASSA ที่มีระยะห่างจากขอบของ PSS พร้อมไดเจสต์ SHA256
- RSASSA_PKCS1V15_SHA256: อัลกอริทึม RSASSA ที่มีระยะห่างจากขอบ PKCS#1 v1.5 พร้อมไดเจสต์ SHA256
- ECDSA_P256_SHA256: ECDSA บนเส้นโค้ง P-256 ที่มีไดเจสต์ SHA256 ส่วนนี้เป็นอัลกอริทึมลายเซ็นเริ่มต้นสำหรับคู่คีย์ที่สร้างโดย Cosign ด้วย
- อัปโหลดลายเซ็นไปยังที่เก็บ Docker
ป้าย Cosign จะอัปโหลดลายเซ็นไปยัง COSIGN_REPOSITORY.
ที่ระบุโดยอัตโนมัติ
4. ให้สิทธิ์และเรียกใช้ภาระงาน
ให้สิทธิ์ภาระงาน
ในขั้นตอนนี้ เราจะตั้งค่าผู้ให้บริการข้อมูลประจำตัวภาระงานภายใต้พูล Workload Identity ($PRIMUS_WORKLOAD_IDENTITY_POOL
) มีการกำหนดค่าเงื่อนไขแอตทริบิวต์สำหรับข้อมูลประจำตัวภาระงานดังที่แสดงด้านล่าง เงื่อนไขอย่างหนึ่งคือตรวจสอบลายนิ้วมือของลายเซ็นของอิมเมจภาระงานเทียบกับลายเซ็นลายนิ้วมือของคีย์สาธารณะ เมื่อใช้เงื่อนไขแอตทริบิวต์นี้ เมื่อ Secundus Bank เผยแพร่อิมเมจภาระงานใหม่ Primus Bank จะตรวจสอบโค้ดภาระงานและลงนามในอิมเมจภาระงานใหม่โดยไม่ต้องอัปเดตนโยบาย WIP ด้วยไดเจสต์อิมเมจ
$ gcloud config set project $PRIMUS_PROJECT_ID
$ PUBLIC_KEY_FINGERPRINT=$(openssl pkey -pubin -in pub.pem -outform DER | openssl sha256 | cut -d' ' -f2)
$ gcloud iam workload-identity-pools providers create-oidc ${PRIMUS_WIP_PROVIDER} \
--location="global" \
--workload-identity-pool="${PRIMUS_WORKLOAD_IDENTITY_POOL}" \
--issuer-uri="https://confidentialcomputing.googleapis.com/" \
--allowed-audiences="https://sts.googleapis.com" \
--attribute-mapping="google.subject='assertion.sub'" \
--attribute-condition="assertion.swname == 'CONFIDENTIAL_SPACE' &&
'STABLE' in assertion.submods.confidential_space.support_attributes
&& '${WORKLOAD_SERVICEACCOUNT}@${SECUNDUS_PROJECT_ID}.iam.gserviceaccount.com' in
assertion.google_service_accounts
&& ['ECDSA_P256_SHA256:${PUBLIC_KEY_FINGERPRINT}']
.exists(fingerprint, fingerprint in assertion.submods.container.image_signatures.map(sig,sig.signature_algorithm+':'+sig.key_id))"
เรียกใช้ภาระงาน
ในขั้นตอนนี้ เราจะเรียกใช้ภาระงานบน Confidential VM ระบบจะส่งอาร์กิวเมนต์ TEE ที่จำเป็นโดยใช้แฟล็กข้อมูลเมตา ระบบจะส่งอาร์กิวเมนต์สำหรับคอนเทนเนอร์ภาระงานโดยใช้ "tee-cmd
" ส่วนของธง ภาระงานได้รับการเข้ารหัสเพื่อเผยแพร่ผลลัพธ์ไปยัง $SECUNDUS_RESULT_STORAGE_BUCKET
$ gcloud config set project $SECUNDUS_PROJECT_ID
$ gcloud compute instances create signed-container-vm \
--confidential-compute-type=SEV \
--shielded-secure-boot \
--maintenance-policy=TERMINATE \
--scopes=cloud-platform --zone=us-west1-b \
--image-project=confidential-space-images \
--image-family=confidential-space \ --service-account=${WORKLOAD_SERVICEACCOUNT}@${SECUNDUS_PROJECT_ID}.iam.gserviceaccount.com \
--metadata "^~^tee-image-reference=us-docker.pkg.dev/${SECUNDUS_PROJECT_ID}/${SECUNDUS_ARTIFACT_REPOSITORY}/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}~tee-restart-policy=Never~tee-cmd="[\"count-location\",\"Seattle\",\"gs://${SECUNDUS_RESULT_STORAGE_BUCKET}/seattle-result\"]"~tee-signed-image-repos=us-docker.pkg.dev/${PRIMUS_PROJECT_ID}/${PRIMUS_COSIGN_REPOSITORY}/demo"
ดูผลลัพธ์
ในโปรเจ็กต์ Secundus ให้ดูผลลัพธ์ของภาระงาน
$ gcloud config set project $SECUNDUS_PROJECT_ID
$ gsutil cat gs://$SECUNDUS_RESULT_STORAGE_BUCKET/seattle-result
ผลลัพธ์ควรเป็น 3
เพราะนี่คือจำนวนคนจากซีแอตเทิลที่แสดงในไฟล์ primus_customer_list.csv
5. ล้างข้อมูล
สคริปต์ที่นี่คือสคริปต์ที่ใช้ทำความสะอาดทรัพยากรที่เราสร้างขึ้นเป็นส่วนหนึ่งของ Codelab นี้ ทรัพยากรต่อไปนี้จะถูกลบหลังจากทำความสะอาด
- ที่เก็บข้อมูลพื้นที่เก็บข้อมูลเข้าของธนาคาร Primus (
$PRIMUS_INPUT_STORAGE_BUCKET
) - บัญชีบริการของธนาคาร Primus (
$PRIMUS_SERVICEACCOUNT
) - รีจิสทรีอาร์ติแฟกต์ของธนาคาร Primus Bank ที่มีลายเซ็นรูปภาพ (
$PRIMUS_COSIGN_REPOSITORY
) - พูลภาระงานของ Primus Bank (
$PRIMUS_WORKLOAD_IDENTITY_POOL
) - บัญชีบริการภาระงานของ Secundus Bank (
$WORKLOAD_SERVICEACCOUNT
) - อินสแตนซ์ Compute Workload
- ที่เก็บข้อมูลพื้นที่เก็บผลลัพธ์ของ Secundus Bank (
$SECUNDUS_RESULT_STORAGE_BUCKET
) - สำนักทะเบียนวัตถุของ Secundus Bank (
$SECUNDUS_ARTIFACT_REGISTRY
)
// run the clean up script to delete the resources created as part of this codelab.
$ ./cleanup.sh
หากสำรวจเสร็จแล้ว โปรดลองลบโปรเจ็กต์
- ไปที่คอนโซล Cloud Platform
- เลือกโครงการที่คุณต้องการปิดการทำงาน แล้วคลิก "ลบ" ที่ด้านบน: การดำเนินการนี้จะกำหนดเวลาการลบโปรเจ็กต์
ขอแสดงความยินดี
ขอแสดงความยินดี คุณศึกษา Codelab เสร็จสมบูรณ์แล้ว
คุณได้เรียนรู้วิธีใช้ประโยชน์จากฟีเจอร์อิมเมจคอนเทนเนอร์ที่รับรองแล้วเพื่อปรับปรุงความสามารถในการใช้งาน Confidential Space
สิ่งที่ต้องทำต่อไป
ลองดู Codelab ที่คล้ายกันเหล่านี้บางส่วน...
- ใช้ข้อมูลที่แชร์อย่างปลอดภัยอยู่ในพื้นที่ลับ
- วิธีทำธุรกรรมสินทรัพย์ดิจิทัลด้วยการประมวลผลจากหลายฝ่ายและพื้นที่ที่เป็นความลับ
- วิเคราะห์ข้อมูลที่เป็นความลับด้วยพื้นที่ทำงานลับ
อ่านเพิ่มเติม
- รู้สึกโดดเดี่ยวใช่ไหม การประมวลผลที่เป็นความลับเพื่อช่วยเหลือ
- Confidential Computing ของ GCP
- Secret Space: อนาคตของการทำงานร่วมกันที่รักษาความเป็นส่วนตัว
- วิธีที่ Google และ Intel ทำให้ Confidential Computing ปลอดภัยมากขึ้น
- ความเป็นส่วนตัวกับความคืบหน้า - ยกระดับการรักษาความปลอดภัยด้วยการประมวลผลที่เป็นความลับของ Google Cloud