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

1. บทนำ

ภาพรวม

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

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

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

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

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

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

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

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

  • วิธีสร้างคีย์ 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 เป็นครั้งแรก คุณจะเห็นหน้าจอระดับกลางที่อธิบายว่า 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 ที่เปิดใช้ CMEK ในรูปแบบ Docker

ในส่วนนี้ คุณจะสร้างที่เก็บในรูปแบบ 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

และมอบบทบาทให้กับผู้ที่จะสร้างที่เก็บใน Artifact Registry เช่น บัญชีที่ใช้งานอยู่ในปัจจุบัน คุณยืนยันบัญชีที่ใช้งานอยู่ปัจจุบันได้โดยเรียกใช้ 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 ไว้แล้ว โปรดไปที่ส่วนถัดไป

คุณต้องให้สิทธิ์เข้าถึงคีย์แก่ตัวแทนบริการหลายรายโดยการให้บทบาท IAM ของผู้เข้ารหัส/ผู้ถอดรหัส CryptoKey (roles/cloudkms.cryptoKeyEncrypterDecrypter) ตัวแทนบริการเหล่านี้ใช้เพื่อรับสิทธิ์เข้าถึงซอร์สโค้ดที่จัดเก็บไว้ใน 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. สร้างฟังก์ชัน (รุ่นที่ 2) ที่เข้ารหัสด้วย CMEK

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

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

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

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

แม้ว่า Codelab นี้จะใช้ 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 functions describe $FUNCTION_NAME –region $REGION | grep kmsKeyName

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

คุณทดสอบฟังก์ชันได้โดยใช้คำสั่ง curl ดังนี้

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 แต่คุณสามารถใช้รันไทม์ที่รองรับได้

ก่อนอื่น ให้สร้างไดเรกทอรีแล้วใช้คำสั่ง 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 Functions รุ่นที่ 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 functions describe $FUNCTION_NAME –region $REGION | grep kmsKeyName

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

คุณทดสอบฟังก์ชันได้โดยใช้คำสั่ง curl ดังนี้

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 Functions

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

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