1. ภาพรวม
พื้นที่ทำงานที่ปลอดภัยมีการแชร์และทำงานร่วมกันกับหลายฝ่ายอย่างปลอดภัย ทั้งยังช่วยให้องค์กรรักษาความลับของข้อมูลได้ ซึ่งหมายความว่าองค์กรต่างๆ สามารถทำงานร่วมกันได้ในขณะที่ยังคงควบคุมข้อมูลและปกป้องข้อมูลจากการเข้าถึงที่ไม่ได้รับอนุญาต
พื้นที่ส่วนบุคคลจะปลดล็อกสถานการณ์ที่คุณต้องการรับคุณค่าร่วมกันจากการรวบรวมและวิเคราะห์ข้อมูลที่ละเอียดอ่อนซึ่งมักอยู่ภายใต้การควบคุมดูแลของรัฐ ขณะเดียวกันก็ยังคงควบคุมข้อมูลดังกล่าวได้อย่างเต็มที่ พื้นที่ทำงานที่ปลอดภัยช่วยให้องค์กรต่างๆ ได้รับคุณค่าร่วมกันจากการรวบรวมและวิเคราะห์ข้อมูลที่ละเอียดอ่อน เช่น ข้อมูลส่วนบุคคลที่ระบุตัวบุคคลนั้นได้ (PII) ข้อมูลสุขภาพที่ได้รับการคุ้มครอง (PHI) ทรัพย์สินทางปัญญา และข้อมูลลับที่เข้ารหัส ขณะเดียวกันก็ยังคงควบคุมข้อมูลดังกล่าวได้อย่างเต็มที่
สิ่งที่ต้องมี
- โปรเจ็กต์ Google Cloud Platform
 - เบราว์เซอร์ เช่น Chrome หรือ Firefox
 - ความรู้พื้นฐานเกี่ยวกับ Google Compute Engine ( codelab), VM ที่มีข้อมูลลับ, คอนเทนเนอร์ และที่เก็บข้อมูลระยะไกล
 - ความรู้พื้นฐานเกี่ยวกับ Cloud KMS ( codelab)
 - ความรู้พื้นฐานเกี่ยวกับบัญชีบริการ การรวมศูนย์ Workload Identity และเงื่อนไขแอตทริบิวต์
 
สิ่งที่คุณจะได้เรียนรู้
- วิธีกำหนดค่าทรัพยากรในระบบคลาวด์ที่จำเป็นสำหรับเรียกใช้พื้นที่ทำงานที่มีข้อมูลลับ
 - วิธีเรียกใช้เวิร์กโหลดใน VM ที่เป็นความลับซึ่งใช้รูปภาพ VM ของพื้นที่ทำงานที่เป็นความลับ
 - วิธีให้สิทธิ์เข้าถึงทรัพยากรที่ได้รับการปกป้องตามแอตทริบิวต์ของโค้ดภาระงาน (สิ่งที่) สภาพแวดล้อมของพื้นที่ทำงานที่ปลอดภัย (ตำแหน่ง) และบัญชีที่เรียกใช้ภาระงาน (ผู้ใช้)
 
ในโค้ดแล็บนี้ คุณจะต้องสร้างพื้นที่ส่วนบุคคลระหว่าง Primus Bank กับ Secundus Bank เพื่อระบุลูกค้าร่วมกันโดยไม่ต้องแชร์รายการบัญชีทั้งหมด ซึ่งประกอบด้วยขั้นตอนต่อไปนี้
- ขั้นตอนที่ 1: ตั้งค่าทรัพยากรระบบคลาวด์ที่จําเป็นสําหรับธนาคาร Primus และ Secundus ทรัพยากรระบบคลาวด์เหล่านี้รวมถึงที่เก็บข้อมูลระบบคลาวด์ คีย์ KMS, Workload Identity Pool และบัญชีบริการของ Primus และ Secundus Banks Primus Bank และ Secundus Bank จัดเก็บข้อมูลลูกค้าไว้ในที่เก็บข้อมูล Cloud Storage และเข้ารหัสข้อมูลโดยใช้คีย์ของบริการจัดการคีย์ระบบคลาวด์
 - ขั้นตอนที่ 2: สร้างบัญชีบริการของเวิร์กโหลดที่จะใช้โดย VM ของเวิร์กโหลด Secundus Bank ที่จะเป็นผู้ดำเนินการของเวิร์กโหลดจะเปิดใช้งาน VM ของเวิร์กโหลด Primus Bank จะเป็นผู้เขียนโค้ดภาระงาน
 - ขั้นตอนที่ 3: สร้างเวิร์กโหลดซึ่งมีคําสั่ง CLI 2 รายการ รายการหนึ่งสําหรับนับลูกค้าจากสถานที่ที่ระบุ และอีกรายการสําหรับค้นหาลูกค้าทั่วไปของ Primus และ Secundus Bank Primus Bank จะเป็นผู้เขียนเวิร์กโหลดและจะแพ็กเกจเป็นอิมเมจ Docker ระบบจะเผยแพร่อิมเมจ Docker นี้ไปยัง Artifact Registry
 - ขั้นตอนที่ 4: ให้สิทธิ์เวิร์กโหลด Primus Bank จะใช้พูล Workload Identity เพื่อให้สิทธิ์ภาระงานในการเข้าถึงข้อมูลลูกค้าตามแอตทริบิวต์ของบุคคลที่เรียกใช้ภาระงาน การดำเนินการของภาระงาน และตำแหน่งที่เรียกใช้ภาระงาน
 - ขั้นตอนที่ 5: เมื่อภาระงานทำงาน ภาระงานจะขอสิทธิ์เข้าถึงทรัพยากรระบบคลาวด์ของผู้ร่วมให้ข้อมูล (Primus Bank และ Secundus Bank) โดยเสนอโทเค็นบริการโปรแกรมตรวจสอบการรับรองพร้อมการอ้างสิทธิ์ภาระงานและสภาพแวดล้อม หากการอ้างสิทธิ์การวัดผลภาระงานในโทเค็นตรงกับเงื่อนไขแอตทริบิวต์ใน Workload Identity Pool ของ Primus และ Secundus Banks ระบบจะแสดงโทเค็นการเข้าถึงบัญชีบริการที่มีสิทธิ์เข้าถึงทรัพยากรระบบคลาวด์ที่เกี่ยวข้อง เฉพาะเวิร์กโหลดที่ทำงานภายในพื้นที่ทำงานที่มีข้อมูลลับเท่านั้นที่จะเข้าถึงทรัพยากรในระบบคลาวด์ได้
 - ขั้นตอนที่ 5(ก): เรียกใช้เวิร์กโหลดแรกซึ่งนับลูกค้าของ Primus Bank จากสถานที่ที่เฉพาะเจาะจง สำหรับเวิร์กโหลดนี้ Primus Bank จะเป็นผู้ทำงานร่วมกันด้านข้อมูลและผู้เขียนเวิร์กโหลด ซึ่งจะให้รายชื่อลูกค้าที่เข้ารหัสแก่เวิร์กโหลดที่ทำงานในพื้นที่ทำงานที่ปลอดภัย Secundus Bank จะเป็นผู้ให้บริการระบบเวิร์กโหลดและจะเรียกใช้เวิร์กโหลดในพื้นที่ทำงานที่ปลอดภัย
 - ขั้นตอนที่ 5(ข): เรียกใช้เวิร์กโหลดที่ 2 ซึ่งจะค้นหาลูกค้าทั่วไปของธนาคาร Primus และ Secundus สำหรับภาระงานนี้ Primus Bank และ Secundus Bank จะเป็นทั้งผู้ทำงานร่วมกันด้านข้อมูล โดยจะให้รายชื่อลูกค้าที่เข้ารหัสไว้กับเวิร์กโหลดที่ทำงานในพื้นที่ทำงานที่ปลอดภัย Secundus Bank จะเป็นผู้ให้บริการเวิร์กโหลดอีกครั้ง ธนาคาร Secundus จะเป็นผู้ให้สิทธิ์สำหรับเวิร์กโหลดนี้ด้วย เนื่องจากเวิร์กโหลดต้องเข้าถึงรายชื่อลูกค้าที่เข้ารหัสของธนาคาร Secundus เพื่อค้นหาลูกค้าทั่วไปด้วย ในกรณีนี้ Secundus Bank จะให้สิทธิ์ภาระงานเข้าถึงข้อมูลลูกค้าตามแอตทริบิวต์ของบุคคลที่เรียกใช้ภาระงาน การดำเนินการของภาระงาน และตำแหน่งที่เรียกใช้ภาระงานตามที่ระบุไว้ในขั้นตอนที่ 4 สำหรับ Primus Bank
 

2. ตั้งค่าทรัพยากรระบบคลาวด์
ก่อนเริ่มต้น
- โคลน ที่เก็บนี้โดยใช้คําสั่งด้านล่างเพื่อรับสคริปต์ที่จําเป็นซึ่งใช้ในโค้ดแล็บนี้
 
git clone https://github.com/GoogleCloudPlatform/confidential-space.git
- เปลี่ยนไดเรกทอรีของ Codelab นี้
 
cd confidential-space/codelabs/bank_data_analysis_codelab/scripts
- ตรวจสอบว่าคุณได้ตั้งค่าตัวแปรสภาพแวดล้อมของโปรเจ็กต์ที่จําเป็นดังที่แสดงด้านล่าง ดูข้อมูลเพิ่มเติมเกี่ยวกับการสร้างโปรเจ็กต์ GCP ได้ที่ โค้ดแล็บนี้ โปรดดูรายละเอียดเกี่ยวกับวิธีเรียกข้อมูลรหัสโปรเจ็กต์และความแตกต่างระหว่างรหัสโปรเจ็กต์กับชื่อโปรเจ็กต์และหมายเลขโปรเจ็กต์ได้ที่นี่
 
export PRIMUS_PROJECT_ID=<GCP project id of Primus bank>
export SECUNDUS_PROJECT_ID=<GCP project id of Secundus bank>
- เปิดใช้การเรียกเก็บเงินสำหรับโปรเจ็กต์
 - เปิดใช้ Confidential Computing API และ API ต่อไปนี้สําหรับโปรเจ็กต์ทั้ง 2 รายการ
 
gcloud services enable \
    cloudapis.googleapis.com \
    cloudkms.googleapis.com \
    cloudresourcemanager.googleapis.com \
    cloudshell.googleapis.com \
    container.googleapis.com \
    containerregistry.googleapis.com \
    iam.googleapis.com \
    confidentialcomputing.googleapis.com
- ตั้งค่าตัวแปรสำหรับชื่อทรัพยากรตามที่ระบุไว้ด้านล่างโดยใช้คําสั่งนี้ คุณสามารถลบล้างชื่อทรัพยากรได้โดยใช้ตัวแปรเหล่านี้ (เช่น 
export PRIMUS_INPUT_STORAGE_BUCKET='my-input-bucket') - คุณสามารถตั้งค่าตัวแปรต่อไปนี้โดยใช้ชื่อทรัพยากรระบบคลาวด์ที่มีอยู่ในโปรเจ็กต์ Primus หากตั้งค่าตัวแปร ระบบจะใช้ทรัพยากรระบบคลาวด์ที่มีอยู่ที่เกี่ยวข้องจากโปรเจ็กต์ Primus หากไม่ได้ตั้งค่าตัวแปร ระบบจะสร้างชื่อทรัพยากรระบบคลาวด์จาก project-name และสร้างทรัพยากรระบบคลาวด์ใหม่เป็นส่วนหนึ่งของการดำเนินการต่อไปนี้
 
  | ที่เก็บข้อมูลซึ่งจัดเก็บไฟล์ข้อมูลลูกค้าของ Primus Bank  | 
  | พูล Workload Identity (WIP) ของ Primus Bank ที่ตรวจสอบการอ้างสิทธิ์  | 
  | ผู้ให้บริการ Workload Identity Pool ของ Primus Bank ซึ่งมีเงื่อนไขการให้สิทธิ์เพื่อใช้กับโทเค็นที่ Service Verifier ของการรับรองลงนาม  | 
  | บัญชีบริการของ Primus Bank ที่   | 
  | คีย์ KMS ที่ใช้เข้ารหัสข้อมูลที่จัดเก็บไว้ใน   | 
  | กระเป๋าสตางค์ KMS ที่จะใช้สําหรับสร้างคีย์การเข้ารหัส   | 
  | ที่เก็บอาร์ติแฟกต์ที่จะพุชอิมเมจ Docker ของเวิร์กโหลด  | 
- คุณสามารถตั้งค่าตัวแปรต่อไปนี้ด้วยชื่อทรัพยากรระบบคลาวด์ที่มีอยู่ได้ในโปรเจ็กต์ Secundus หากตั้งค่าตัวแปร ระบบจะใช้ทรัพยากรระบบคลาวด์ที่มีอยู่ที่เกี่ยวข้องจากโปรเจ็กต์ Secundus หากไม่ได้ตั้งค่าตัวแปร ระบบจะสร้างชื่อทรัพยากรในระบบคลาวด์จาก project-name และสร้างทรัพยากรใหม่ในระบบคลาวด์โดยเป็นส่วนหนึ่งของการดำเนินการต่อไปนี้
 
  | ที่เก็บข้อมูลที่จัดเก็บไฟล์ข้อมูลลูกค้าของ Secundus Bank  | 
  | พูล Workload Identity (WIP) ของธนาคาร Secundus ที่ตรวจสอบการอ้างสิทธิ์  | 
  | ผู้ให้บริการ Workload Identity Pool ของ Secundus Bank ซึ่งมีเงื่อนไขการให้สิทธิ์เพื่อใช้กับโทเค็นที่ Service Verifier ของการรับรองลงนาม  | 
  | บัญชีบริการของธนาคาร Secundus ที่   | 
  | คีย์ KMS ที่ใช้เข้ารหัสข้อมูลที่จัดเก็บไว้ใน   | 
  | กระเป๋าสตางค์ KMS ที่ใช้สร้างคีย์การเข้ารหัส   | 
  | ที่เก็บข้อมูลที่จัดเก็บผลลัพธ์ของภาระงาน  | 
  | ชื่ออิมเมจคอนเทนเนอร์ของภาระงาน  | 
  | แท็กของอิมเมจคอนเทนเนอร์ของภาระงาน  | 
  | บัญชีบริการที่มีสิทธิ์เข้าถึง VM ข้อมูลที่เป็นความลับซึ่งเรียกใช้ภาระงาน  | 
- มีอาร์ติแฟกต์บางส่วนที่ใช้เป็นส่วนหนึ่งของโค้ดแล็บนี้ตามที่ระบุไว้ด้านล่าง
 primus_customer_list.csv: ไฟล์ที่มีข้อมูลลูกค้าของ Primus Bank ที่นี่เป็นไฟล์ตัวอย่างที่ใช้ในโค้ดแล็บนี้secundus_customer_list.csv: ไฟล์ที่มีข้อมูลลูกค้าของธนาคาร Secundus ที่นี่เป็นไฟล์ตัวอย่างที่ใช้ในโค้ดแล็บนี้- คุณจะต้องมีสิทธิ์บางอย่างสำหรับโปรเจ็กต์ 2 รายการนี้
 - สำหรับ 
$PRIMUS_PROJECT_IDคุณจะต้องมีผู้ดูแลระบบ Cloud KMS, ผู้ดูแลระบบพื้นที่เก็บข้อมูล, ผู้ดูแลระบบรีจิสทรีอาร์ติแฟกต์, ผู้ดูแลระบบบัญชีบริการ, ผู้ดูแลระบบพูล Workload Identity ของ IAM - สำหรับ 
$SECUNDUS_PROJECT_IDคุณจะต้องมีผู้ดูแลระบบ Compute, ผู้ดูแลระบบพื้นที่เก็บข้อมูล, ผู้ดูแลระบบบัญชีบริการ, ผู้ดูแลระบบ Cloud KMS, ผู้ดูแลระบบพูล Workload Identity ของ IAM, ผู้ดูแลระบบความปลอดภัย (ไม่บังคับ) - เรียกใช้สคริปต์ต่อไปนี้เพื่อตั้งค่าชื่อตัวแปรที่เหลือเป็นค่าตามรหัสโปรเจ็กต์สำหรับชื่อทรัพยากร
 
source config_env.sh
ตั้งค่าทรัพยากรระบบคลาวด์สำหรับ Primus Bank
ต้องใช้ทรัพยากรระบบคลาวด์ต่อไปนี้สำหรับ Primus Bank เรียกใช้สคริปต์นี้เพื่อตั้งค่าทรัพยากรสําหรับ Primus Bank
- ที่เก็บข้อมูล Cloud Storage (
$PRIMUS_INPUT_STORAGE_BUCKET) เพื่อจัดเก็บไฟล์ข้อมูลลูกค้าที่เข้ารหัสของ Primus Bank - คีย์การเข้ารหัส (
$PRIMUS_ENC_KEY) และพวงกุญแจ ($PRIMUS_ENC_KEYRING) ใน KMS เพื่อเข้ารหัสไฟล์ข้อมูลลูกค้าของ Primus Bank - Workload Identity Pool (
$PRIMUS_WORKLOAD_IDENTITY_POOL) เพื่อตรวจสอบการอ้างสิทธิ์ตามเงื่อนไขแอตทริบิวต์ที่กำหนดค่าไว้ภายใต้ผู้ให้บริการ - บัญชีบริการ (
$PRIMUS_SERVICE_ACCOUNT) ที่แนบกับพูลข้อมูลระบุตัวตนของเวิร์กโหลดที่กล่าวถึงข้างต้น ($PRIMUS_WORKLOAD_IDENTITY_POOL) มีสิทธิ์เข้าถึงเพื่อถอดรหัสข้อมูลโดยใช้คีย์ KMS (โดยใช้บทบาทroles/cloudkms.cryptoKeyDecrypter) อ่านข้อมูลจากที่เก็บข้อมูลระบบคลาวด์ (โดยใช้บทบาทobjectViewer) และเชื่อมต่อบัญชีบริการกับพูลข้อมูลระบุตัวตนของเวิร์กโหลด (โดยใช้roles/iam.workloadIdentityUser) 
./setup_primus_bank_resources.sh
ตั้งค่าทรัพยากรระบบคลาวด์สำหรับ Secundus Bank
สำหรับธนาคาร Secundus คุณต้องใช้ทรัพยากรระบบคลาวด์ต่อไปนี้ เรียกใช้สคริปต์นี้เพื่อตั้งค่าทรัพยากรของธนาคาร Secundus ขั้นตอนนี้จะสร้างทรัพยากรต่อไปนี้
- ที่เก็บข้อมูล Cloud Storage (
$SECUNDUS_INPUT_STORAGE_BUCKET) เพื่อจัดเก็บไฟล์ข้อมูลลูกค้าที่เข้ารหัสของ Secundus Bank - คีย์การเข้ารหัส (
$SECUNDUS_ENC_KEY) และพวงกุญแจ ($SECUNDUS_ENC_KEYRING) ใน KMS เพื่อเข้ารหัสไฟล์ข้อมูลของธนาคาร Secundus - Workload Identity Pool (
$SECUNDUS_WORKLOAD_IDENTITY_POOL) เพื่อตรวจสอบการอ้างสิทธิ์ตามเงื่อนไขแอตทริบิวต์ที่กำหนดค่าไว้ภายใต้ผู้ให้บริการ - บัญชีบริการ (
$SECUNDUS_SERVICE_ACCOUNT) ที่แนบกับพูลข้อมูลระบุตัวตนของเวิร์กโหลดที่กล่าวถึงข้างต้น ($SECUNDUS_WORKLOAD_IDENTITY_POOL) มีสิทธิ์เข้าถึงเพื่อถอดรหัสข้อมูลโดยใช้คีย์ KMS (โดยใช้บทบาทroles/cloudkms.cryptoKeyDecrypter) อ่านข้อมูลจากที่เก็บข้อมูลระบบคลาวด์ (โดยใช้บทบาทobjectViewer) และเชื่อมต่อบัญชีบริการกับพูลข้อมูลระบุตัวตนของเวิร์กโหลด (โดยใช้บทบาทroles/iam.workloadIdentityUser) - ที่เก็บข้อมูล Cloud Storage (
$SECUNDUS_RESULT_STORAGE_BUCKET) เพื่อจัดเก็บผลลัพธ์ของเวิร์กโหลดที่ดำเนินการโดย Secundus Bank 
./setup_secundus_bank_resources.sh
3. สร้างภาระงาน
สร้างบัญชีบริการของเวิร์กโหลด
ตอนนี้คุณจะต้องสร้างบัญชีบริการสําหรับเวิร์กโหลดที่มีบทบาทและสิทธิ์ที่จําเป็นตามที่ระบุไว้ด้านล่าง เรียกใช้สคริปต์ต่อไปนี้เพื่อสร้างบัญชีบริการเวิร์กโหลดในโปรเจ็กต์ Secundus Bank VM ที่เรียกใช้เวิร์กโหลดจะใช้บัญชีบริการนี้
บัญชีบริการของเวิร์กโหลดนี้ ($WORKLOAD_SERVICE_ACCOUNT) จะมีบทบาทต่อไปนี้
- มอบบทบาท 
confidentialcomputing.workloadUserให้กับบัญชีบริการของภาระงาน ซึ่งจะช่วยให้บัญชีผู้ใช้สร้างโทเค็นการรับรองได้ - ให้สิทธิ์บทบาท 
logging.logWriterแก่บัญชีบริการของภาระงาน ซึ่งจะช่วยให้สภาพแวดล้อมของพื้นที่ทำงานที่ปลอดภัยเขียนบันทึกไปยัง Cloud Logging ได้นอกเหนือจากคอนโซลอนุกรม เพื่อให้บันทึกพร้อมใช้งานหลังจากที่ VM สิ้นสุดการทำงาน objectViewerเพื่ออ่านข้อมูลจากที่เก็บข้อมูลระบบคลาวด์$PRIMUS_INPUT_STORAGE_BUCKETobjectViewerเพื่ออ่านข้อมูลจากที่เก็บข้อมูลระบบคลาวด์$SECUNDUS_INPUT_STORAGE_BUCKETobjectAdminเพื่อเขียนผลลัพธ์ของเวิร์กโหลดไปยังที่เก็บข้อมูลระบบคลาวด์$SECUNDUS_RESULT_STORAGE_BUCKET
./create_workload_service_account.sh
สร้างภาระงาน
ในขั้นตอนนี้ คุณจะต้องสร้างอิมเมจ Docker สําหรับภาระงานที่ใช้ในโค้ดแล็บนี้ เวิร์กโหลดเป็นแอปพลิเคชัน GoLang ง่ายๆ ดังนี้
- นับลูกค้าในสถานที่ตั้งทางภูมิศาสตร์ที่ระบุ
 - ค้นหาลูกค้าทั่วไปของ Primus และ Secundus Bank จากรายชื่อลูกค้าที่จัดเก็บไว้ในที่เก็บข้อมูลระบบคลาวด์ที่เกี่ยวข้อง
 
เรียกใช้สคริปต์ต่อไปนี้เพื่อสร้างภาระงานที่จะทำตามขั้นตอนต่อไปนี้
- สร้าง Artifact Registry (
$PRIMUS_ARTIFACT_REPOSITORY) ของ Primus Bank ที่จะใช้เผยแพร่เวิร์กโหลด - สร้างโค้ดและอัปเดตด้วยชื่อทรัพยากรที่จำเป็น ดูโค้ดเวิร์กโหลดที่ใช้ใน Codelab นี้ได้ที่นี่
 - สร้างโค้ดและแพ็กเกจในอิมเมจ Docker ดู Dockerfile ที่เกี่ยวข้องได้ที่นี่
 - เผยแพร่อิมเมจ Docker ไปยัง Artifact Registry (
$PRIMUS_ARTIFACT_REGISTRY) ของ Primus Bank - ให้สิทธิ์บัญชีบริการ 
$WORKLOAD_SERVICE_ACCOUNTอ่านสำหรับ Artifact Registry ($PRIMUS_ARTIFACT_REGISTRY) 
./create_workload.sh
4. ให้สิทธิ์และเรียกใช้ภาระงาน
ให้สิทธิ์ภาระงาน
Primus Bank ต้องการให้สิทธิ์เวิร์กโหลดเข้าถึงข้อมูลลูกค้าตามแอตทริบิวต์ของทรัพยากรต่อไปนี้
- สิ่งที่เป็น: รหัสที่ได้รับการยืนยัน
 - สถานที่: สภาพแวดล้อมที่ปลอดภัย
 - Who: ผู้ให้บริการที่เชื่อถือได้
 
Primus ใช้การรวมข้อมูลระบุตัวตนของเวิร์กโหลดเพื่อบังคับใช้นโยบายการเข้าถึงตามข้อกำหนดเหล่านี้
การรวมศูนย์ข้อมูลระบบ Workload Identity ช่วยให้คุณระบุเงื่อนไขแอตทริบิวต์ได้ เงื่อนไขเหล่านี้จะจำกัดข้อมูลประจำตัวที่ตรวจสอบสิทธิ์กับ Workload Identity Pool (WIP) ได้ คุณสามารถเพิ่มบริการเครื่องตรวจสอบการรับรองลงใน WIP เป็นผู้ให้บริการ Workload Identity Pool เพื่อแสดงการวัดผลและบังคับใช้นโยบาย
มีการสร้าง Workload Identity Pool ไว้แล้วก่อนหน้านี้ในขั้นตอนการตั้งค่าทรัพยากรระบบคลาวด์ ตอนนี้ Primus Bank จะสร้างผู้ให้บริการพูล Workload Identity ของ OIDC ใหม่ --attribute-condition ที่ระบุจะให้สิทธิ์เข้าถึงคอนเทนเนอร์ภาระงาน โดยต้องมีสิ่งต่อไปนี้
- สิ่งที่ทำ: 
$WORKLOAD_IMAGE_NAMEล่าสุดที่อัปโหลดไปยังที่เก็บ$PRIMUS_ARTIFACT_REPOSITORY - ตำแหน่ง: สภาพแวดล้อมการดำเนินการที่เชื่อถือได้ของพื้นที่ทำงานที่เป็นความลับกำลังทำงานบนอิมเมจ VM ของพื้นที่ทำงานที่เป็นความลับที่รองรับอย่างเต็มรูปแบบ
 - ผู้ส่ง: บัญชีบริการ 
$WORKLOAD_SERVICE_ACCOUNTของธนาคาร Secundus 
gcloud config set project $PRIMUS_PROJECT_ID
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 &&
   assertion.submods.container.image_reference == 'us-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG' && 
'$WORKLOAD_SERVICE_ACCOUNT@$SECUNDUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts"
เช่นเดียวกับ WIP ที่สร้างขึ้นสำหรับ Primus Bank ธนาคาร Secundus ต้องการให้สิทธิ์ภาระงานเข้าถึงข้อมูลลูกค้าตามเงื่อนไขต่อไปนี้
- สิ่งที่ทำ: ปริมาณงาน
 - ตำแหน่ง: สภาพแวดล้อมของพื้นที่ทำงานที่เป็นความลับ
 - ใคร: บัญชี (
$WORKLOAD_SERVICE_ACCOUNT) ที่ใช้เวิร์กโหลด 
Primus Bank ใช้การอ้างสิทธิ์ image_reference ซึ่งรวมถึงแท็กรูปภาพ เพื่อพิจารณาว่าควรให้สิทธิ์เข้าถึงหรือไม่ ผู้ใช้ควบคุมที่เก็บข้อมูลระยะไกลได้ จึงมั่นใจได้ว่าจะติดแท็กเฉพาะรูปภาพที่ไม่มีการรั่วไหลข้อมูล
ในทางกลับกัน Secundus Bank ไม่ได้ควบคุมที่เก็บถาวรที่ใช้รับรูปภาพ จึงไม่สามารถทำการคาดเดาดังกล่าวได้อย่างปลอดภัย แต่เลือกให้สิทธิ์เข้าถึงเวิร์กโหลดตาม image_digest แทน ซึ่งแตกต่างจาก image_reference ที่ Primus Bank เปลี่ยนให้ชี้ไปยังรูปภาพอื่นได้ แต่ Primus Bank ไม่สามารถให้ image_digest อ้างอิงรูปภาพอื่นนอกเหนือจากรูปภาพที่ Secundus Bank ตรวจสอบในขั้นตอนก่อนหน้า
ก่อนสร้างผู้ให้บริการพูล Workload Identity เราจะรวบรวม image_digest สำหรับรูปภาพคอนเทนเนอร์เวิร์กโหลดที่จะใช้ในเงื่อนไขแอตทริบิวต์ของผู้ให้บริการ
export WORKLOAD_IMAGE_DIGEST=$(gcloud artifacts docker images describe ${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG  --format="value(image_summary.digest)" --project ${PRIMUS_PROJECT_ID})
gcloud config set project $SECUNDUS_PROJECT_ID
gcloud iam workload-identity-pools providers create-oidc $SECUNDUS_WIP_PROVIDER \
  --location="global" \
  --workload-identity-pool="$SECUNDUS_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 && 
assertion.submods.container.image_digest == '${WORKLOAD_IMAGE_DIGEST}' &&
 assertion.submods.container.image_reference == '${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG' && 
'$WORKLOAD_SERVICE_ACCOUNT@$SECUNDUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts"
เรียกใช้ภาระงาน
ในขั้นตอนนี้ Secundus Bank จะเรียกใช้ภาระงานในพื้นที่ทำงานที่มีการรักษาความปลอดภัย ภาระงานนี้จะรับโทเค็นการเข้าถึงจากพูล Workload Identity ของ Primus และพูล Workload Identity ของ Secundus เพื่ออ่านและถอดรหัสข้อมูลลูกค้าของ Primus Bank และ Secundus Bank ตามลำดับ
ระบบจะส่งอาร์กิวเมนต์ TEE ที่จำเป็นโดยใช้แฟล็กข้อมูลเมตา ระบบจะส่งอาร์กิวเมนต์สำหรับคอนเทนเนอร์เวิร์กโหลดโดยใช้ส่วน "tee-cmd" ของ Flag ระบบจะเผยแพร่ผลลัพธ์ของการดำเนินการเวิร์กโหลดไปยัง $SECUNDUS_RESULT_STORAGE_BUCKET
เรียกใช้ภาระงานแรก
ในการเรียกใช้เวิร์กโหลดครั้งแรก เวิร์กโหลดจะนับลูกค้าของ Primus Bank จากตำแหน่งที่ระบุไว้ในอาร์กิวเมนต์คอนเทนเนอร์เวิร์กโหลด ดังที่แสดงด้านล่าง เวิร์กโหลดแรกจะเรียกใช้คําสั่ง "count-location" และระบบจะจัดเก็บผลลัพธ์ที่ $SECUNDUS_RESULT_STORAGE_BUCKET/seattle-result
gcloud compute instances create ${WORKLOAD_VM1} \
 --project=${SECUNDUS_PROJECT_ID} \
 --confidential-compute-type=SEV \
 --shielded-secure-boot \
 --maintenance-policy=MIGRATE \
 --scopes=cloud-platform \
 --zone=${SECUNDUS_PROJECT_ZONE} \
 --image-project=confidential-space-images \
 --image-family=confidential-space \
--service-account=${WORKLOAD_SERVICE_ACCOUNT}@${SECUNDUS_PROJECT_ID}.iam.gserviceaccount.com \
 --metadata "^~^tee-image-reference=${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/${PRIMUS_PROJECT_ID}/${PRIMUS_ARTIFACT_REPOSITORY}/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}~tee-restart-policy=Never~tee-cmd="[\"count-location\",\"Seattle\",\"gs://${SECUNDUS_RESULT_STORAGE_BUCKET}/seattle-result\"]""
ดูผลลัพธ์
ในโปรเจ็กต์ Secundus ให้ดูผลลัพธ์ของเวิร์กโหลดแรก รอ 3-5 นาทีเพื่อให้ภาระงานทำงานเสร็จสมบูรณ์และผลลัพธ์จะพร้อมใช้งานในที่เก็บข้อมูลระบบคลาวด์
gcloud config set project $SECUNDUS_PROJECT_ID
gsutil cat gs://$SECUNDUS_RESULT_STORAGE_BUCKET/seattle-result
ผลลัพธ์ควรเป็น 3 เนื่องจากเป็นจํานวนผู้ที่มาจากซีแอตเทิลซึ่งแสดงอยู่ในไฟล์ primus_customer_list.csv
เรียกใช้ภาระงานที่สอง
ในการดําเนินการของเวิร์กโหลดที่ 2 เราจะค้นหาลูกค้าทั่วไปของ Primus Bank และ Secundus Bank ดังที่แสดงด้านล่าง เวิร์กโหลดที่ 2 จะเรียกใช้คําสั่ง "list-common-customers" และระบบจะจัดเก็บผลลัพธ์ที่ $SECUNDUS_RESULT_STORAGE_BUCKET/list-common-count
gcloud compute instances create ${WORKLOAD_VM2} \
 --project=${SECUNDUS_PROJECT_ID} \
 --confidential-compute-type=SEV \
 --shielded-secure-boot \
 --maintenance-policy=MIGRATE \
 --scopes=cloud-platform \
 --zone=${SECUNDUS_PROJECT_ZONE} \
 --image-project=confidential-space-images \
 --image-family=confidential-space \
--service-account=${WORKLOAD_SERVICE_ACCOUNT}@${SECUNDUS_PROJECT_ID}.iam.gserviceaccount.com \
  --metadata "^~^tee-image-reference=${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/${PRIMUS_PROJECT_ID}/${PRIMUS_ARTIFACT_REPOSITORY}/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}~tee-restart-policy=Never~tee-cmd="[\"list-common-customers\",\"gs://$SECUNDUS_RESULT_STORAGE_BUCKET/list-common-result\"]""
ดูผลลัพธ์
ในโปรเจ็กต์ Secundus ให้ดูผลลัพธ์ของเวิร์กโหลดที่ 2 รอ 3-5 นาทีเพื่อให้ภาระงานทำงานเสร็จสมบูรณ์และผลลัพธ์จะพร้อมใช้งานในที่เก็บข้อมูลระบบคลาวด์
gcloud config set project $SECUNDUS_PROJECT_ID
gsutil cat gs://$SECUNDUS_RESULT_STORAGE_BUCKET/list-common-result
ผลลัพธ์ควรเป็นรายการต่อไปนี้ เนื่องจากเป็นลูกค้าร่วมกันระหว่าง Primus และ Secundus Bank
เอาต์พุต:
Eric
Clinton
Ashley
Cooper
เรียกใช้ภาระงานที่ไม่ได้รับอนุญาต
สัญญาของ Primus Bank ที่อนุญาตให้ Secundus Bank เข้าถึงข้อมูลของ Primus Bank หมดอายุ Primus Bank จึงอัปเดตเงื่อนไขแอตทริบิวต์เพื่ออนุญาตให้ VM ที่มีบัญชีบริการจากพาร์ทเนอร์รายใหม่อย่าง Tertius Bank เข้าถึงได้
Primus Bank แก้ไขผู้ให้บริการพูล Workload Identity
ใน $PRIMUS_PROJECT_ID ให้อัปเดตเงื่อนไขแอตทริบิวต์สำหรับผู้ให้บริการระบุตัวตนของผู้ตรวจสอบการรับรองเพื่อให้สิทธิ์ภาระงานในตำแหน่งใหม่
- ตั้งค่าโปรเจ็กต์เป็น $PRIMUS_PROJECT_ID
 
gcloud config set project $PRIMUS_PROJECT_ID
- ส่งออกรหัสโปรเจ็กต์ GCP ของ Tertius Bank โดยใช้คำสั่งด้านล่าง หลังจากนั้น Primus Bank จะใช้ข้อมูลนี้เพื่ออัปเดตเงื่อนไขแอตทริบิวต์ของผู้ให้บริการพูล Workload Identity ธนาคาร Primus จะไม่หยุดให้สิทธิ์บัญชีบริการเวิร์กโหลดของธนาคาร Secundus โดยตอนนี้จะอนุญาตให้ใช้บัญชีบริการเวิร์กโหลดของ Tertius Bank
 
export TERTIUS_PROJECT_ID=<GCP project-id of Tertius Bank>
- อัปเดตผู้ให้บริการ OIDC ในพูล Workload Identity ที่นี่ 
'$WORKLOAD_SERVICE_ACCOUNT@$SECUNDUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accountsจะเปลี่ยนเป็น'$WORKLOAD_SERVICE_ACCOUNT@$TERTIUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts.แทนการให้สิทธิ์บัญชีบริการเวิร์กโหลดจากธนาคาร Secundus แต่จะให้สิทธิ์บัญชีบริการเวิร์กโหลดจากธนาคาร Tertius แทน 
gcloud iam workload-identity-pools providers update-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 &&
   assertion.submods.container.image_reference == '${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/$PRIMUS_PROJECT_ID/$PRIMUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG' && 
'$WORKLOAD_SERVICE_ACCOUNT@$TERTIUS_PROJECT_ID.iam.gserviceaccount.com' in assertion.google_service_accounts"
เรียกใช้ภาระงานอีกครั้ง
เมื่อธนาคาร Secundus พยายามเรียกใช้เวิร์กโหลดเดิม การดำเนินการก็ล้มเหลว หากต้องการดูข้อผิดพลาด ให้ลบไฟล์ผลลัพธ์ต้นฉบับและอินสแตนซ์ VM แล้วลองเรียกใช้เวิร์กโหลดอีกครั้ง
ลบไฟล์ผลลัพธ์และอินสแตนซ์ VM ที่มีอยู่
- ตั้งค่าโปรเจ็กต์เป็นโปรเจ็กต์ 
$SECUNDUS_PROJECT_ID 
gcloud config set project $SECUNDUS_PROJECT_ID
- ลบไฟล์ผลลัพธ์
 
gsutil rm gs://$SECUNDUS_RESULT_STORAGE_BUCKET/list-common-result
- ลบอินสแตนซ์ VM ที่เป็นข้อมูลลับ
 
gcloud compute instances delete ${WORKLOAD_VM2} --zone=${SECUNDUS_PROJECT_ZONE}
เรียกใช้ภาระงานที่ไม่ได้รับอนุญาต
gcloud compute instances create ${WORKLOAD_VM2} \
 --confidential-compute-type=SEV \
 --shielded-secure-boot \
 --maintenance-policy=MIGRATE \
 --scopes=cloud-platform \
 --zone=${SECUNDUS_PROJECT_ZONE}\
 --image-project=confidential-space-images \
 --image-family=confidential-space \
--service-account=${WORKLOAD_SERVICE_ACCOUNT}@${SECUNDUS_PROJECT_ID}.iam.gserviceaccount.com \
 --metadata "^~^tee-image-reference=${PRIMUS_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/${PRIMUS_PROJECT_ID}/${PRIMUS_ARTIFACT_REPOSITORY}/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}~tee-restart-policy=Never~tee-cmd="[\"list-common-customers\",\"gs://$SECUNDUS_RESULT_STORAGE_BUCKET/list-common-result\"]""
ดูข้อผิดพลาด
คุณจะเห็นข้อผิดพลาด (The given credential is rejected by the attribute condition) แทนผลลัพธ์ของภาระงาน
gsutil cat gs://$SECUNDUS_RESULT_STORAGE_BUCKET/list-common-result
ในทำนองเดียวกัน หาก Primus Bank ทำการแก้ไขเวิร์กโหลดอย่างลับๆ เพื่อส่งรายชื่อลูกค้าทั้งหมดของ Secundus Bank ไปยังที่เก็บข้อมูลของ Primus Bank เอง การดำเนินการดังกล่าวก็จะล้มเหลวเนื่องจากข้อมูลสรุปของเวิร์กโหลดที่เป็นอันตรายจะแตกต่างจากข้อมูลสรุปของรูปภาพที่ให้สิทธิ์ในพูลข้อมูลระบุตัวตนของเวิร์กโหลดของ Secundus Bank
5. ล้าง
ที่นี่เป็นสคริปต์ที่ใช้ล้างทรัพยากรที่เราสร้างขึ้นเป็นส่วนหนึ่งของ Codelab นี้ ในการล้างข้อมูลนี้ ระบบจะลบทรัพยากรต่อไปนี้
- ป้อนที่เก็บข้อมูลระบบคลาวด์ของ Primus Bank (
$PRIMUS_INPUT_STORAGE_BUCKET) - บัญชีบริการของ Primus Bank  (
$PRIMUS_SERVICE_ACCOUNT) - รีจิสทรีอาร์ติแฟกต์ของ Primus Bank ซึ่งมีลายเซ็นรูปภาพ (
$PRIMUS_COSIGN_REPOSITORY) - พูล Workload Identity ของ Primus Bank(
$PRIMUS_WORKLOAD_IDENTITY_POOL) - บัญชีบริการภาระงานของธนาคาร Secundus (
$WORKLOAD_SERVICE_ACCOUNT) - ป้อนที่เก็บข้อมูล Cloud Storage ของธนาคาร Secundus (
$SECUNDUS_INPUT_STORAGE_BUCKET) - บัญชีบริการของธนาคาร Secundus (
$SECUNDUS_SERVICE_ACCOUNT) - รีจิสทรีอาร์ติแฟกต์ของธนาคาร Secundus ซึ่งมีลายเซ็นรูปภาพ (
$SECUNDUS_COSIGN_REPOSITORY) - พูล Workload Identity ของ Secundus Bank(
$SECUNDUS_WORKLOAD_IDENTITY_POOL) - บัญชีบริการภาระงานของธนาคาร Secundus (
$WORKLOAD_SERVICE_ACCOUNT) - อินสแตนซ์ Compute สำหรับภาระงาน
 - ที่เก็บข้อมูลผลลัพธ์ของธนาคาร Secundus (
$SECUNDUS_RESULT_STORAGE_BUCKET) - ที่เก็บอาร์ติแฟกต์ของ Primus Bank (
$PRIMUS_ARTIFACT_REPOSITORY) 
./cleanup.sh
หากสำรวจเสร็จแล้ว โปรดพิจารณาลบโปรเจ็กต์
- ไปที่คอนโซลแพลตฟอร์มระบบคลาวด์
 - เลือกโปรเจ็กต์ที่ต้องการปิด แล้วคลิก "ลบ" ที่ด้านบน ซึ่งจะเป็นการกำหนดเวลาการลบโปรเจ็กต์
 
ยินดีด้วย
ยินดีด้วย คุณทำ Codelab เสร็จเรียบร้อยแล้ว
คุณได้เรียนรู้วิธีรักษาความปลอดภัยของข้อมูลที่แชร์ไปพร้อมกับรักษาความลับโดยใช้พื้นที่ทำงานที่ปลอดภัย
ขั้นตอนถัดไป
ลองดู Codelab ที่คล้ายกันเหล่านี้...
- Codelab เกี่ยวกับอิมเมจคอนเทนเนอร์ที่เซ็นชื่อกำกับ
 - วิธีทำธุรกรรมสินทรัพย์ดิจิทัลด้วยการคำนวณแบบหลายฝ่ายและพื้นที่ทำงานที่เป็นความลับ
 - วิเคราะห์ข้อมูลที่เป็นความลับด้วยพื้นที่ทำงานที่ปลอดภัย
 
อ่านเพิ่มเติม
- รู้สึกโดดเดี่ยวใช่ไหม การใช้ระบบประมวลผลข้อมูลที่เป็นความลับช่วยแก้ปัญหาได้
 - การประมวลผลข้อมูลที่เป็นความลับใน GCP
 - พื้นที่ทำงานที่เป็นความลับ: อนาคตของการทำงานร่วมกันที่รักษาความเป็นส่วนตัว
 - วิธีที่ Google และ Intel ทําให้ระบบประมวลผลข้อมูลที่เป็นความลับปลอดภัยยิ่งขึ้น
 - ความเป็นส่วนตัวกับการพัฒนา - ยกระดับความปลอดภัยด้วย Google Cloud Confidential Computing