เข้ารหัส Cloud Functions โดยใช้คีย์การเข้ารหัสที่จัดการโดยลูกค้า (CMEK)

1. บทนำ

ภาพรวม

Cloud Functions เป็นโซลูชันประมวลผลที่ใช้งานง่ายสำหรับนักพัฒนาแอปในการสร้างฟังก์ชันแบบสแตนด์อโลนวัตถุประสงค์เดียวที่ตอบสนองต่อเหตุการณ์ระบบคลาวด์ โดยไม่ต้องจัดการเซิร์ฟเวอร์หรือสภาพแวดล้อมรันไทม์

คุณสามารถใช้คีย์การเข้ารหัสที่จัดการโดยลูกค้า (CMEK) ของบริการการจัดการคีย์ระบบคลาวด์เพื่อปกป้อง Cloud Functions และข้อมูลที่เกี่ยวข้องเมื่อไม่มีการเคลื่อนไหว การทำให้ฟังก์ชันที่มี CMEK ใช้งานได้ช่วยปกป้องข้อมูลที่เชื่อมโยงกับฟังก์ชันดังกล่าวโดยใช้คีย์การเข้ารหัสที่อยู่ในการควบคุมอย่างเต็มรูปแบบ การเข้ารหัสประเภทนี้ช่วยให้คุณสามารถปฏิบัติตามข้อกำหนดในบางอุตสาหกรรม เช่น บริการทางการเงิน เนื่องจากคีย์เป็นของคุณและ Google ไม่ได้ควบคุมคีย์ดังกล่าว จึงไม่มีผู้ใด (รวมถึงตัวคุณเอง) เข้าถึงข้อมูลที่ได้รับการปกป้องโดยคีย์การเข้ารหัสเหล่านี้ได้เมื่อปิดใช้หรือทำลายคีย์ดังกล่าว

สำหรับ Cloud Functions นั้น CMEK จะเข้ารหัสข้อมูลต่อไปนี้

  • ซอร์สโค้ดของฟังก์ชันที่อัปโหลดเพื่อการติดตั้งใช้งานและจัดเก็บไว้โดย Google ใน Cloud Storage ซึ่งใช้ในกระบวนการบิลด์
  • ผลลัพธ์ของกระบวนการบิลด์ฟังก์ชัน รวมถึงอิมเมจคอนเทนเนอร์ที่สร้างขึ้นจากซอร์สโค้ดของฟังก์ชัน และอินสแตนซ์แต่ละรายการของฟังก์ชันที่มีการทำให้ใช้งานได้
  • ข้อมูลที่ไม่มีการเคลื่อนไหวสำหรับช่องทางการส่งกิจกรรมภายใน (รุ่นที่ 1 เท่านั้น)

ดูข้อมูลเพิ่มเติมเกี่ยวกับข้อมูลที่เข้ารหัสได้ในเอกสารประกอบของ Cloud Function CMEK

สิ่งที่คุณจะสร้าง

Codelab นี้แสดงวิธีทำให้ Cloud Function (รุ่นที่ 1 หรือรุ่นที่ 2) ที่เข้ารหัสโดยใช้ CMEK ได้ Codelab นี้ใช้ Cloud Function สาธารณะ กล่าวคือเป็นฟังก์ชันที่ไม่ต้องมีการตรวจสอบสิทธิ์ในการสาธิต คุณสามารถเรียกใช้ฟังก์ชันที่เปิดใช้ CMEK ที่ตรวจสอบสิทธิ์แล้วได้เช่นเดียวกับ Cloud Function อื่นๆ ที่ต้องมีการตรวจสอบสิทธิ์

สิ่งที่คุณจะได้เรียนรู้

  • วิธีสร้างคีย์ CMEK บนคีย์ริงแบบสมมาตรที่มีอยู่
  • วิธีสร้างที่เก็บ Artifact Registry
  • วิธีกำหนดค่า CMEK บน Cloud Function สำหรับทั้งรุ่นที่ 1 และ 2

2. การตั้งค่าและข้อกำหนด

ข้อกำหนดเบื้องต้น

  • คุณเข้าสู่ระบบ Cloud Console แล้ว
  • ก่อนหน้านี้คุณได้ทำให้ Cloud Function ที่ทริกเกอร์ HTTP ใช้งานได้ (เพื่อยืนยันว่าคุณเปิดใช้บทบาทและ API ที่เหมาะสม)

เปิดใช้งาน Cloud Shell

  1. คลิกเปิดใช้งาน Cloud Shell 853e55310c205094.png จาก Cloud Console

55efc1aaa7a4d3ad.png

หากเริ่มต้นใช้งาน Cloud Shell เป็นครั้งแรก คุณจะเห็นหน้าจอตรงกลางที่อธิบายว่านี่คืออะไร หากระบบแสดงหน้าจอตรงกลาง ให้คลิกต่อไป

9c92662c6a846a5c.png

การจัดสรรและเชื่อมต่อกับ Cloud Shell ใช้เวลาเพียงไม่กี่นาที

9f0e51b578fecce5.png

เครื่องเสมือนนี้โหลดด้วยเครื่องมือการพัฒนาทั้งหมดที่จำเป็น โดยมีไดเรกทอรีหลักขนาด 5 GB ถาวรและทำงานใน Google Cloud ซึ่งช่วยเพิ่มประสิทธิภาพของเครือข่ายและการตรวจสอบสิทธิ์ได้อย่างมาก งานส่วนใหญ่ใน Codelab นี้สามารถทำได้โดยใช้เบราว์เซอร์

เมื่อเชื่อมต่อกับ Cloud Shell แล้ว คุณควรเห็นข้อความตรวจสอบสิทธิ์และโปรเจ็กต์ได้รับการตั้งค่าเป็นรหัสโปรเจ็กต์แล้ว

  1. เรียกใช้คำสั่งต่อไปนี้ใน Cloud Shell เพื่อยืนยันว่าคุณได้รับการตรวจสอบสิทธิ์แล้ว
gcloud auth list

เอาต์พุตจากคำสั่ง

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. เรียกใช้คำสั่งต่อไปนี้ใน Cloud Shell เพื่อยืนยันว่าคำสั่ง gcloud รู้เกี่ยวกับโปรเจ็กต์ของคุณ
gcloud config list project

เอาต์พุตจากคำสั่ง

[core]
project = <PROJECT_ID>

หากไม่ใช่ ให้ตั้งคำสั่งด้วยคำสั่งนี้

gcloud config set project <PROJECT_ID>

เอาต์พุตจากคำสั่ง

Updated property [core/project].

3. สร้างคีย์ริงและคีย์ใหม่สำหรับ Cloud Functions

ตรวจสอบว่า Cloud KMS API เปิดใช้อยู่โดยเรียกใช้คำสั่งต่อไปนี้

gcloud services enable cloudkms.googleapis.com

ก่อนอื่น ให้สร้างตัวแปรสภาพแวดล้อมเพื่อให้มีชื่อคีย์ริง ชื่อคีย์ ภูมิภาค และตัวแปรอื่นๆ ที่ใช้ใน Codelab นี้

KEYRING_NAME="keyring-functions"
REGION="us-central1"
KEY_NAME="key-encrypted-function"
PROJECT_ID=$(gcloud config get-value project)
PROJECT_NUMBER="$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')"
USER_EMAIL="$(gcloud config list account --format "value(core.account)")"

จากนั้นสร้างคีย์ริง ซึ่งเป็นทรัพยากรรูทสำหรับคีย์ Cloud KMS และเวอร์ชันคีย์

gcloud kms keyrings create $KEYRING_NAME --location $REGION

สุดท้ายนี้ ตอนนี้คุณสร้างคีย์แบบสมมาตรในคีย์ริงใหม่ภายใน Cloud KMS ได้แล้ว

gcloud kms keys create $KEY_NAME --keyring $KEYRING_NAME --location $REGION --purpose "encryption"

4. สร้างที่เก็บ Artifact Registry รูปแบบ Docker ที่เปิดใช้ CMEK

ในส่วนนี้ คุณจะสร้างที่เก็บที่มีรูปแบบ Docker ใน Artifact Registry ที่เปิดใช้ CMEK คีย์นี้จะเป็นคีย์เดียวกับที่ใช้ในการทำให้ Cloud Function ใช้งานได้

ก่อนอื่น คุณจะต้องมีบัญชีบริการสำหรับ Artifact Registry คุณสร้างแท็กได้โดยเรียกใช้คำสั่งนี้

gcloud beta services identity create --service=artifactregistry.googleapis.com --project=$PROJECT_ID

ใช้คำสั่งต่อไปนี้เพื่อมอบบทบาท IAM สำหรับ CryptoKey Encrypter/Derypter IAM (roles/cloudkms.cryptoKeyEncrypterDecrypter) ให้กับบัญชีบริการ Artifact Registry เพื่อให้มีสิทธิ์เข้าถึงคีย์

gcloud kms keys add-iam-policy-binding \
  $KEY_NAME --location $REGION --keyring=$KEYRING_NAME \
  --member serviceAccount:service-$PROJECT_NUMBER@gcp-sa-artifactregistry.iam.gserviceaccount.com \
  --role roles/cloudkms.cryptoKeyEncrypterDecrypter

และให้บทบาทกับหลักการที่จะสร้างที่เก็บในรีจิสทรีอาร์ติแฟกต์ เช่น บัญชีที่ใช้งานอยู่ในปัจจุบัน คุณยืนยันบัญชีที่ใช้งานอยู่ในปัจจุบันได้โดยเรียกใช้รายการการตรวจสอบสิทธิ์ gcloud

gcloud kms keys add-iam-policy-binding \
       $KEY_NAME --location $REGION --keyring=$KEYRING_NAME \
       --member user:$USER_EMAIL \
       --role roles/cloudkms.cryptoKeyEncrypterDecrypter

ตอนนี้คุณสร้างที่เก็บในรูปแบบ Docker ที่เปิดใช้ CMEK ได้แล้ว

หมายเหตุ: ภูมิภาคต้องเป็นภูมิภาคเดียวกับคีย์ CMEK

REPO_NAME=my-cmek-encrypted-repo 

KEY_FULLPATH=projects/"$PROJECT_ID"/locations/"$REGION"/keyRings/"$KEYRING_NAME"/cryptoKeys/"$KEY_NAME" 

gcloud artifacts repositories create $REPO_NAME \
    --repository-format=docker \
    --location=$REGION \
    --kms-key=$KEY_FULLPATH \
    --async

คุณจะดูที่เก็บ Artifact Registry ใหม่ได้โดยใช้คำสั่งนี้

gcloud artifacts repositories describe $REPO_NAME --location=$REGION

5. ให้สิทธิ์เข้าถึงคีย์แก่บัญชีบริการ (รุ่นที่ 2)

ส่วนนี้จะครอบคลุมการสร้างบัญชีบริการสำหรับฟังก์ชันรุ่นที่ 2 หากคุณกำลังสร้างฟังก์ชันรุ่นที่ 1 โปรดไปยังส่วนถัดไป

คุณต้องให้สิทธิ์เข้าถึงคีย์แก่ตัวแทนบริการหลายรายโดยมอบบทบาท IAM ผู้เข้ารหัส/ผู้ถอดรหัส CryptoKey (roles/cloudkms.cryptoKeyEncrypterDecrypter) Agent บริการเหล่านี้ใช้เพื่อเข้าถึงซอร์สโค้ดที่จัดเก็บไว้ใน Cloud Storage จัดเก็บอิมเมจฟังก์ชันในที่เก็บที่มีการป้องกันด้วย CMEK ใน Artifact Registry และเพื่อติดตั้งใช้งาน Cloud Function ที่เข้ารหัส CMEK

ขั้นตอนสำหรับฟังก์ชันรุ่นที่ 2

  1. ให้สิทธิ์เข้าถึงคีย์แก่ Agent บริการ Cloud Run ด้วยคำสั่งต่อไปนี้
CLOUDRUN_SA=service-$PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com

gcloud kms keys add-iam-policy-binding $KEY_NAME \
--keyring=$KEYRING_NAME \
--location=$REGION \
--member=serviceAccount:$CLOUDRUN_SA \
--role=roles/cloudkms.cryptoKeyEncrypterDecrypter
  1. มอบสิทธิ์เข้าถึงคีย์ให้แก่ Agent บริการ Eventarc ดังนี้
EVENTARC_SA=service-$PROJECT_NUMBER@gcp-sa-eventarc.iam.gserviceaccount.com

gcloud kms keys add-iam-policy-binding $KEY_NAME \
--keyring=$KEYRING_NAME \
--location=$REGION \
--member=serviceAccount:$EVENTARC_SA \
--role=roles/cloudkms.cryptoKeyEncrypterDecrypter
  1. มอบสิทธิ์เข้าถึงคีย์ให้แก่ Agent บริการ Artifact Registry
AR_SA=service-$PROJECT_NUMBER@gcp-sa-artifactregistry.iam.gserviceaccount.com

gcloud kms keys add-iam-policy-binding $KEY_NAME \
--keyring=$KEYRING_NAME \
--location=$REGION \
--member=serviceAccount:$AR_SA \
--role=roles/cloudkms.cryptoKeyEncrypterDecrypter
  1. มอบสิทธิ์เข้าถึงคีย์ให้แก่ Agent บริการ Cloud Storage
STORAGE_SA=service-$PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com

gcloud kms keys add-iam-policy-binding $KEY_NAME \
--keyring=$KEYRING_NAME \
--location=$REGION \
--member=serviceAccount:$STORAGE_SA \
--role=roles/cloudkms.cryptoKeyEncrypterDecrypter

ในส่วนถัดไป คุณจะเห็นวิธีสร้างและทำให้ฟังก์ชันที่เข้ารหัส CMEK ใช้งานได้

6. ให้สิทธิ์เข้าถึงคีย์แก่บัญชีบริการ (รุ่นที่ 1)

ส่วนนี้จะครอบคลุมการสร้างบัญชีบริการสำหรับฟังก์ชันรุ่นที่ 1 หากเคยสร้างบัญชีบริการสำหรับฟังก์ชันรุ่นที่ 2 ไว้แล้ว โปรดไปที่ส่วนถัดไป

คุณต้องให้สิทธิ์เข้าถึงคีย์แก่ตัวแทนบริการหลายรายโดยมอบบทบาท IAM ผู้เข้ารหัส/ผู้ถอดรหัส CryptoKey (roles/cloudkms.cryptoKeyEncrypterDecrypter) Agent บริการเหล่านี้ใช้เพื่อเข้าถึงซอร์สโค้ดที่จัดเก็บไว้ใน Cloud Storage จัดเก็บอิมเมจฟังก์ชันในที่เก็บที่มีการป้องกันด้วย CMEK ใน Artifact Registry และเพื่อติดตั้งใช้งาน Cloud Function ที่เข้ารหัส CMEK

ขั้นตอนสำหรับฟังก์ชันรุ่นที่ 1

  1. มอบสิทธิ์เข้าถึงคีย์ให้แก่ Agent บริการ Cloud Functions
FUNCTION_SA=service-$PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com

gcloud kms keys add-iam-policy-binding $KEY_NAME \
--keyring=$KEYRING_NAME \
--location=$REGION \
--member=serviceAccount:$FUNCTION_SA \
--role=roles/cloudkms.cryptoKeyEncrypterDecrypter
  1. มอบสิทธิ์เข้าถึงคีย์ให้แก่ Agent บริการ Artifact Registry
AR_SA=service-$PROJECT_NUMBER@gcp-sa-artifactregistry.iam.gserviceaccount.com

gcloud kms keys add-iam-policy-binding $KEY_NAME \
--keyring=$KEYRING_NAME \
--location=$REGION \
--member=serviceAccount:$AR_SA \
--role=roles/cloudkms.cryptoKeyEncrypterDecrypter
  1. มอบสิทธิ์เข้าถึงคีย์ให้แก่ Agent บริการ Cloud Storage
STORAGE_SA=service-$PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com

gcloud kms keys add-iam-policy-binding $KEY_NAME \
--keyring=$KEYRING_NAME \
--location=$REGION \
--member=serviceAccount:$STORAGE_SA \
--role=roles/cloudkms.cryptoKeyEncrypterDecrypter

ในส่วนถัดไป คุณจะเห็นวิธีสร้างและทำให้ฟังก์ชันที่เข้ารหัส CMEK ใช้งานได้

7. สร้างฟังก์ชันที่เข้ารหัส CMEK (รุ่นที่ 2)

ส่วนนี้จะครอบคลุมการสร้างฟังก์ชันรุ่นที่ 2 คุณสามารถดำเนินการต่อในหัวข้อถัดไปเพื่อดูวิธีสำหรับรุ่นที่ 1

ตอนนี้คุณมีที่เก็บ Artifact Registry ที่กำหนดค่าด้วย CMEK และให้สิทธิ์เข้าถึง Cloud Functions กับคีย์แล้ว ตอนนี้คุณทำให้ฟังก์ชันที่เข้ารหัสโดยใช้คีย์ CMEK ใช้งานได้แล้ว

ขั้นตอนสำหรับฟังก์ชันรุ่นที่ 2 มีดังนี้

สร้างซอร์สโค้ดสำหรับฟังก์ชัน

แม้ว่า Codelab นี้จะใช้ Node.js แต่คุณก็ใช้รันไทม์ที่รองรับเวอร์ชันใดก็ได้

ขั้นแรก ให้สร้างไดเรกทอรีและซีดีลงในไดเรกทอรีนั้น

mkdir ~/cmek-function-2ndgen && cd $_

จากนั้นสร้างไฟล์package.json

touch package.json

echo '{
  "dependencies": {
    "@google-cloud/functions-framework": "^2.1.0"
  }
}
' > package.json

ต่อไป ให้สร้างไฟล์ต้นฉบับ index.js

touch index.js

echo 'const functions = require("@google-cloud/functions-framework");

functions.http("helloWorld", (req, res) => {
 res.send(`Hello ${req.query.name || req.body.name || "World"}!`);
});' > index.js

ทำให้ Cloud Function รุ่นที่ 2 ใช้งานได้โดยใช้การเข้ารหัส CMEK

หมายเหตุ: ตัวอย่างด้านล่างแสดงวิธีทำให้ฟังก์ชันใช้งานได้โดยใช้แหล่งที่มาจากไดเรกทอรีปัจจุบัน ตรวจสอบว่าคุณอยู่ในไดเรกทอรีเดียวกับซอร์สโค้ดสำหรับฟังก์ชัน

FUNCTION_NAME=protect-me-cmek-2ndgen
ENTRY_POINT=helloWorld

REPO_FULLPATH=projects/"$PROJECT_ID"/locations/"$REGION"/repositories/$REPO_NAME

gcloud beta functions deploy $FUNCTION_NAME  \
--gen2 \
--region $REGION \
--kms-key $KEY_FULLPATH \
--docker-repository $REPO_FULLPATH \
--source . \
--trigger-http \
--allow-unauthenticated \
--runtime nodejs16 \
--entry-point $ENTRY_POINT

คุณสามารถดูคีย์ CMEK จากผลลัพธ์ที่ปรากฏขึ้นโดยการเรียกใช้คำสั่งนี้

ฟังก์ชัน gcloud อธิบาย $FUNCTION_NAME –ภูมิภาค $REGION | ชื่อคีย์ grep kms

ทดสอบฟังก์ชันรุ่นที่ 2

คุณทดสอบฟังก์ชันได้โดยการทำให้ม้วนฟังก์ชันต่อไปนี้

FUNCTION_URL="$(gcloud functions describe $FUNCTION_NAME --region $REGION --format='get(serviceConfig.uri)')"

curl $FUNCTION_URL

ซึ่งส่งผลให้เกิดสิ่งต่อไปนี้

Hello World!

หากเปิดใช้คีย์การเข้ารหัสอยู่ ฟังก์ชันนี้จะส่งคืนให้ผู้โทรดำเนินการสำเร็จ อย่างไรก็ตาม เมื่อปิดใช้คีย์การเข้ารหัสแล้ว ผู้โทรจะได้รับข้อผิดพลาด

ในส่วนถัดไป คุณจะเห็นสิ่งที่จะเกิดขึ้นเมื่อเรียกใช้ฟังก์ชันหลังจากปิดใช้คีย์

8. สร้างฟังก์ชันที่เข้ารหัส CMEK (รุ่นที่ 1)

ส่วนนี้จะครอบคลุมการสร้างฟังก์ชันรุ่นที่ 1 หากคุณได้สร้างฟังก์ชันรุ่นที่ 2 ไว้ก่อนหน้านี้ โปรดไปยังส่วนถัดไป

ตอนนี้คุณมีที่เก็บ Artifact Registry ที่กำหนดค่าด้วย CMEK และให้สิทธิ์เข้าถึง Cloud Functions กับคีย์แล้ว ตอนนี้คุณทำให้ฟังก์ชันที่เข้ารหัสโดยใช้คีย์ CMEK ใช้งานได้แล้ว

ขั้นตอนสำหรับฟังก์ชันรุ่นที่ 1 มีดังนี้

สร้างซอร์สโค้ดสำหรับฟังก์ชันรุ่นที่ 1

แม้ว่า Codelab นี้จะใช้ Node.js แต่คุณก็ใช้รันไทม์ที่รองรับเวอร์ชันใดก็ได้

ขั้นแรก ให้สร้างไดเรกทอรีและซีดีลงในไดเรกทอรีนั้น

mkdir ~/cmek-function-1stgen && cd $_

ต่อไป ให้สร้างไฟล์package.json

touch package.json

echo '{
    "name": "function-cmek-codelab",
    "version": "0.0.1"
}' > package.json

จากนั้นสร้างไฟล์ต้นฉบับ index.js

touch index.js

echo "exports.helloWorld = (req, res) => {
    let message = req.query.message || req.body.message || 'Hello World!';
    res.status(200).send(message);
};" > index.js

ทำให้ Cloud Function รุ่นที่ 1 ใช้งานได้โดยใช้การเข้ารหัส CMEK

หมายเหตุ: ตัวอย่างด้านล่างแสดงวิธีทำให้ฟังก์ชันใช้งานได้โดยใช้แหล่งที่มาจากไดเรกทอรีปัจจุบัน ตรวจสอบว่าคุณอยู่ในไดเรกทอรีเดียวกับซอร์สโค้ดสำหรับฟังก์ชัน

FUNCTION_NAME=protect-me-cmek-1stgen
ENTRY_POINT=helloWorld

REPO_FULLPATH=projects/"$PROJECT_ID"/locations/"$REGION"/repositories/$REPO_NAME

gcloud functions deploy $FUNCTION_NAME  \
--region $REGION \
--kms-key $KEY_FULLPATH \
--docker-repository $REPO_FULLPATH \
--source . \
--trigger-http \
--allow-unauthenticated \
--runtime nodejs16 \
--entry-point $ENTRY_POINT

คุณสามารถดูคีย์ CMEK จากผลลัพธ์ที่ปรากฏขึ้นโดยการเรียกใช้คำสั่งนี้

ฟังก์ชัน gcloud อธิบาย $FUNCTION_NAME –ภูมิภาค $REGION | ชื่อคีย์ grep kms

ทดสอบฟังก์ชันรุ่นที่ 1

คุณทดสอบฟังก์ชันได้โดยการทำให้ม้วนฟังก์ชันต่อไปนี้

FUNCTION_URL="$(gcloud functions describe $FUNCTION_NAME --region $REGION --format='get(httpsTrigger.url)')"

curl $FUNCTION_URL

ซึ่งส่งผลให้เกิดสิ่งต่อไปนี้

Hello World!

หากเปิดใช้คีย์การเข้ารหัสอยู่ ฟังก์ชันนี้จะส่งคืนให้ผู้โทรดำเนินการสำเร็จ อย่างไรก็ตาม เมื่อปิดใช้คีย์การเข้ารหัสแล้ว ผู้โทรจะได้รับข้อผิดพลาด

ในส่วนถัดไป คุณจะเห็นสิ่งที่จะเกิดขึ้นเมื่อเรียกใช้ฟังก์ชันหลังจากปิดใช้คีย์

9. เรียกใช้ฟังก์ชันที่เข้ารหัส CMEK เมื่อปิดใช้คีย์การเข้ารหัส

ในส่วนสุดท้ายนี้ คุณจะทำให้คีย์เป็นโมฆะและเรียกใช้ฟังก์ชันอีกครั้งเพื่อดูข้อผิดพลาดที่เกิดขึ้น

ปิดใช้คีย์การเข้ารหัส

โดยคุณจะเรียกใช้คำสั่งนี้เพื่อปิดใช้คีย์ได้ เนื่องจาก Codelab นี้จะสร้างคีย์เพียงเวอร์ชันเดียว คุณจะต้องปิดใช้เวอร์ชัน 1

gcloud kms keys versions disable 1 \
    --key=$KEY_NAME \
    --keyring=$KEYRING_NAME \
    --location=$REGION

และคุณควรเห็นข้อมูลผลลัพธ์

algorithm: GOOGLE_SYMMETRIC_ENCRYPTION
createTime: '2023-04-11T03:30:49.111832653Z'
generateTime: '2023-04-11T03:30:49.111832653Z'
name: projects/dogfood-gcf-saraford/locations/us-central1/keyRings/myKeyRing/cryptoKeys/encrypted-function/cryptoKeyVersions/1
protectionLevel: SOFTWARE
state: DISABLED

เรียกใช้ฟังก์ชันด้วยแป้นที่ปิดใช้

ตอนนี้ให้curlฟังก์ชันอีกครั้ง

curl $FUNCTION_URL

และคุณจะไม่ได้รับการตอบกลับ Hello World ในครั้งนี้

ในบันทึกสำหรับ Cloud Function คุณจะเห็น

User's CMEK key has been disabled. CMEK key: projects/<PROJECT-NAME>/locations/us-central1/keyRings/myKeyRing/cryptoKeys/encrypted-function

พยายามดูทรัพยากรเมื่อปิดใช้คีย์ CMEK

ในส่วนนี้ คุณจะเห็นทรัพยากรต่อไปนี้ซึ่งจะใช้งานไม่ได้เมื่อปิดใช้คีย์ CMEK

  • ซอร์สโค้ดของฟังก์ชัน
  • บิลด์อิมเมจคอนเทนเนอร์จากซอร์สโค้ด

เช่น การไปที่แท็บแหล่งที่มาของ Cloud Function จะแสดงข้อผิดพลาดขณะดึงข้อมูลที่เก็บถาวร คุณจะได้รับข้อผิดพลาดที่คล้ายกันหากพยายามดูไฟล์ .zip ที่มีซอร์สโค้ดโดยตรงใน Cloud Storage

ac3307bb05d30e19.png

นอกจากนี้ คุณจะไม่สามารถใช้อิมเมจคอนเทนเนอร์สำหรับฟังก์ชันจาก Artifact Registry ได้ เช่น หากพยายามทำให้อิมเมจคอนเทนเนอร์ดังกล่าวใช้งานได้ใน Cloud Run คุณจะได้รับข้อผิดพลาดว่าไม่พบอิมเมจ

โปรดดูเอกสารฟังก์ชัน CMEK เพื่อดูรายการทรัพยากรที่เข้ารหัสทั้งหมด

10. ขอแสดงความยินดี

ยินดีด้วย คุณศึกษา Codelab จบแล้ว

หัวข้อที่ครอบคลุม

  • วิธีสร้างคีย์ CMEK บนคีย์ริงแบบสมมาตรที่มีอยู่
  • วิธีสร้างที่เก็บ Artifact Registry
  • วิธีกำหนดค่า CMEK บน Cloud Function

สำหรับข้อมูลเพิ่มเติม

ดูข้อมูลเพิ่มเติมเกี่ยวกับ Cloud Functions และ CMEK ได้ในลิงก์ต่อไปนี้