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

1. บทนำ

ภาพรวม

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

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

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

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

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

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

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

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

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

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

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

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

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

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

55efc1aaa7a4d3ad.png

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

9c92662c6a846a5c.png

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

9f0e51b578fecce5.png

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

เมื่อเชื่อมต่อกับ 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

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

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 (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 auth list

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) ตัวแทนบริการเหล่านี้ใช้เพื่อรับสิทธิ์เข้าถึงซอร์สโค้ดที่จัดเก็บไว้ใน 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 ไว้แล้ว โปรดไปที่ส่วนถัดไป

คุณต้องให้สิทธิ์ Agent บริการหลายตัวในการเข้าถึงคีย์ดังกล่าวโดยมอบบทบาท 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 มีดังนี้

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

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

ก่อนอื่น ให้สร้างไดเรกทอรีและ cd ไปยังไดเรกทอรีนั้น

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 Functions รุ่นที่ 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 $REGION | grep kmsKeyName

ทดสอบฟังก์ชันรุ่นที่ 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

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

ก่อนอื่น ให้สร้างไดเรกทอรีและ cd ไปยังไดเรกทอรีนั้น

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 $REGION | grep kmsKeyName

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

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

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

curl $FUNCTION_URL

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

Hello World!

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

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

9. เรียกใช้ฟังก์ชันที่เข้ารหัส CMEK ซึ่งปิดใช้คีย์การเข้ารหัสแล้ว

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

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

คุณเรียกใช้คําสั่งนี้เพื่อปิดใช้คีย์ได้ เนื่องจากโค้ดแล็บนี้สร้างคีย์เพียงเวอร์ชันเดียว คุณจึงจะปิดใช้เวอร์ชัน 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 Functions

ดูข้อมูลเพิ่มเติม

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