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

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

เตรียมคีย์ CMEK

ก่อนที่จะสร้างฐานข้อมูล Cloud Firestore ที่ได้รับการปกป้องด้วย CMEK คุณต้องทำตามขั้นตอนต่อไปนี้ให้เสร็จสมบูรณ์

  1. ขอสิทธิ์เข้าถึงCloud Firestoreฟีเจอร์ CMEK
  2. สร้าง (หรือเรียก) Cloud Firestoreตัวแทนบริการ
  3. สร้างคีย์ CMEK
  4. กำหนดการตั้งค่า IAM สำหรับคีย์นั้น

ทำตามขั้นตอนเหล่านี้สำหรับแต่ละโปรเจ็กต์ที่จะมีฐานข้อมูลที่ได้รับการปกป้องด้วย CMEK Cloud Firestore หากสร้างคีย์ CMEK ใหม่ในภายหลัง คุณต้องกำหนดค่าการตั้งค่า IAM สำหรับคีย์นั้น

ขอสิทธิ์เข้าถึง

ก่อนสร้างCloud Firestoreตัวแทนบริการ ให้ขอสิทธิ์เข้าถึงฟีเจอร์ CMEK โดยกรอกแบบฟอร์มนี้

สร้างCloud Firestoreตัวแทนบริการ

ก่อนสร้างคีย์ CMEK คุณต้องมีCloud Firestore ตัวแทนบริการ ซึ่งเป็นบัญชีบริการที่ Google จัดการประเภทหนึ่งที่ Cloud Firestoreใช้เพื่อเข้าถึงคีย์

เรียกใช้คำสั่ง services identity create เพื่อสร้างตัวแทนบริการที่ Cloud Firestore ใช้เพื่อเข้าถึงคีย์ CMEK ในนามของคุณ คำสั่งนี้จะสร้างบัญชีบริการหากยังไม่มี จากนั้นจะแสดงบัญชีบริการ

gcloud beta services identity create \
    --service=firestore.googleapis.com \
    --project FIRESTORE_PROJECT

แทนที่ FIRESTORE_PROJECT ด้วยโปรเจ็กต์ที่คุณวางแผน จะใช้สำหรับฐานข้อมูล Cloud Firestore

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

Service identity created:
service-xxx@gcp-sa-firestore.iam.gserviceaccount.com

สร้างคีย์

คุณใช้คีย์ที่สร้างใน Cloud KMS โดยตรงหรือคีย์ที่จัดการภายนอกซึ่งคุณทำให้พร้อมใช้งานด้วย Cloud External Key Manager ได้

ตำแหน่งคีย์ Cloud KMS ต้องเหมือนกับตำแหน่งของฐานข้อมูล Cloud Firestore ที่จะใช้ร่วมกัน

  • สำหรับตำแหน่งฐานข้อมูลระดับภูมิภาค ให้ใช้ชื่อตำแหน่งเดียวกันสำหรับพวงกุญแจ คีย์ และฐานข้อมูล เนื่องจากชื่อตำแหน่งมีการแมปแบบหนึ่งต่อหนึ่ง

    เช่น หากต้องการสร้างฐานข้อมูลที่ป้องกันด้วย CMEK ใน us-west1 ให้สร้างพวงกุญแจและคีย์ใน us-west1

  • สำหรับตำแหน่งฐานข้อมูลหลายภูมิภาค ให้ใช้ชื่อตำแหน่งของตำแหน่งหลายภูมิภาคของ KMS ดังนี้

    • ใช้usตำแหน่งแบบหลายภูมิภาคของ Cloud KMS สำหรับCloud Firestoreตำแหน่งแบบหลายภูมิภาคของ nam5
    • ใช้europeตำแหน่งแบบหลายภูมิภาคของ Cloud KMS สำหรับCloud Firestoreตำแหน่งแบบหลายภูมิภาคของ eur3

ในโปรเจ็กต์ Google Cloud ที่คุณต้องการจัดการคีย์ ให้ทำดังนี้

  1. เปิดใช้ Cloud KMS API

  2. สร้างคีย์ริงและคีย์โดยใช้ตัวเลือกใดตัวเลือกหนึ่งต่อไปนี้

กำหนดการตั้งค่า IAM สำหรับคีย์

คอนโซล

หากต้องการมอบบทบาท Cloud KMS ให้กับตัวแทนบริการ ให้ทำตาม ขั้นตอนต่อไปนี้ นอกจากนี้ คุณยังให้สิทธิ์ในระดับคีย์หรือพวงกุญแจได้หากต้องการความละเอียดที่ต่ำกว่า

  1. ไปที่หน้า IAM ในคอนโซล Google Cloud

    ไปที่หน้า IAM

  2. คลิกเพิ่ม

  3. ป้อนรหัสในรูปแบบอีเมลสำหรับCloud Firestore ตัวแทนบริการ

  4. เลือกบทบาทผู้เข้ารหัส/ผู้ถอดรหัส Cloud KMS CryptoKey

  5. คลิกบันทึก

gcloud

มอบบทบาท cloudkms.cryptoKeyEncrypterDecrypter ให้กับ ตัวแทนบริการ

gcloud kms keys add-iam-policy-binding KMS_KEY \
--keyring KMS_KEYRING\
--location KMS_LOCATION \
--member serviceAccount:SERVICE_AGENT_EMAIL \
--role roles/cloudkms.cryptoKeyEncrypterDecrypter \
--project KMS_PROJECT

แทนที่ค่าต่อไปนี้

  • KMS_KEY โดยมีชื่อที่คุณกำหนดให้กับคีย์
  • KMS_KEYRING ที่มีคีย์ริง KMS ที่มีคีย์
  • KMS_LOCATION ที่มีภูมิภาคที่มีคีย์ริง
  • SERVICE_AGENT_EMAIL พร้อมตัวระบุรูปแบบอีเมลสำหรับตัวแทนบริการที่คุณให้สิทธิ์เข้าถึง
  • KMS_PROJECT ที่มีโปรเจ็กต์ที่มีคีย์

เทอร์มินัลควรแสดงการตอบกลับที่คล้ายกับตัวอย่างต่อไปนี้

Updated IAM policy for key KMS_KEY.
bindings:
- members:
- serviceAccount:
service-{project-number}@gcp-sa-firestore.iam.gserviceaccount.com
role: roles/cloudkms.cryptoKeyEncrypterDecrypter

สร้างฐานข้อมูลที่เปิดใช้ CMEK

หลังจากสร้างและกำหนดค่าคีย์ CMEK แล้ว คุณจะสร้างฐานข้อมูลที่ป้องกันด้วย CMEK ได้ Cloud Firestoreฐานข้อมูลที่มีอยู่ซึ่งได้รับการปกป้องโดย การเข้ารหัสเริ่มต้นของ Google จะไม่สามารถแปลงไปใช้ CMEK ได้

คุณจะเลือกประเภทการเข้ารหัสและคีย์ได้ก็ต่อเมื่อสร้างฐานข้อมูลที่เปิดใช้ CMEK เท่านั้น

คอนโซล

  1. ในคอนโซล Google Cloud ให้ไปที่หน้าฐานข้อมูล

    ไป ที่หน้าฐานข้อมูล

  2. คลิกสร้างฐานข้อมูล

  3. เลือกโหมดฐานข้อมูล คลิกต่อไป

  4. ในหน้ากำหนดค่าฐานข้อมูล ให้ป้อนรหัสฐานข้อมูล

  5. เลือกสถานที่

  6. คลิกแสดงตัวเลือกการเข้ารหัส แล้วเลือกคีย์ Cloud KMS

  7. เลือกหรือป้อนชื่อทรัพยากรสำหรับคีย์ CMEK ที่ต้องการใช้กับฐานข้อมูล

  8. รายการคีย์จะจำกัดเฉพาะGoogle Cloudโปรเจ็กต์ปัจจุบันและตำแหน่งฐานข้อมูลที่คุณเลือก หากต้องการใช้คีย์จากGoogle Cloudโปรเจ็กต์อื่น ให้คลิกเปลี่ยนโปรเจ็กต์หรือป้อนคีย์ด้วยตนเอง

  9. หากได้รับข้อความแจ้งให้มอบสิทธิ์คีย์ให้กับบัญชีบริการ Cloud Firestore ให้คลิกให้สิทธิ์ หากต้องการสร้างฐานข้อมูล CMEK Cloud Firestore บัญชีบริการต้องได้รับcloudkms.cryptoKeyEncrypterDecrypterบทบาท

  10. เลือกกฎความปลอดภัยสำหรับไคลเอ็นต์บนอุปกรณ์เคลื่อนที่และเว็บ

  11. คลิกสร้างฐานข้อมูล

เมื่อสร้างฐานข้อมูลแล้ว คุณจะยืนยันได้ว่าฐานข้อมูลเปิดใช้ CMEK โดยดูรายละเอียดฐานข้อมูล

  • หากฐานข้อมูลได้รับการปกป้องโดย CMEK ฟิลด์ประเภทการเข้ารหัสจะแสดงเป็นจัดการโดยลูกค้า และฟิลด์คีย์การเข้ารหัสจะแสดง Cloud KMS ที่เกี่ยวข้องและเวอร์ชันคีย์ที่ใช้เพื่อปกป้องฐานข้อมูลนี้
  • หากฐานข้อมูลไม่ได้ป้องกันด้วย CMEK ช่องประเภทการเข้ารหัสจะแสดงเป็นจัดการโดย Google

gcloud

ก่อนสร้างฐานข้อมูลที่เปิดใช้ CMEK ด้วย Google Cloud CLI ให้ติดตั้ง เวอร์ชันล่าสุดและให้สิทธิ์ gcloud CLI ดูข้อมูลเพิ่มเติมได้ที่ติดตั้ง gcloud CLI

gcloud firestore databases create --location=FIRESTORE_DATABASE_LOCATION \
      --database=DATABASE_ID \
      --kms-key-name=KMS_KEY_NAME \
      --project=FIRESTORE_PROJECT

แทนที่ค่าต่อไปนี้

  • FIRESTORE_DATABASE_LOCATION โดยมีตำแหน่ง Cloud Firestore สำหรับฐานข้อมูล
  • DATABASE_ID ที่มีรหัสสำหรับฐานข้อมูล
  • KMS_KEY_NAME โดยใช้ชื่อที่คุณกำหนดให้กับคีย์ ใช้ชื่อทรัพยากรแบบเต็มสำหรับคีย์ในรูปแบบต่อไปนี้

    projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID

  • FIRESTORE_PROJECT กับโปรเจ็กต์เพื่อใช้สำหรับฐานข้อมูล Cloud Firestore

REST API

คำขอ HTTP:

POST https://firestore.googleapis.com/v1/projects/{FIRESTORE_PROJECT}/databases

ในเนื้อความของคำขอ ให้กำหนดค่า CMEK ในฟิลด์ cmek_config.kms_key_name

ตั้งค่าเป็นรหัสทรัพยากรแบบเต็มของคีย์ Cloud KMS อนุญาตเฉพาะคีย์ที่อยู่ในตำแหน่งเดียวกับฐานข้อมูลนี้เท่านั้น

ค่านี้ควรเป็นรหัสทรัพยากรคีย์ Cloud KMS ในรูปแบบ projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}

ดูข้อมูลเพิ่มเติมเกี่ยวกับฟิลด์อื่นๆ ได้ที่หน้าdatabase create

ตัวอย่างคำขอ

curl -X POST 'https://firestore.googleapis.com/v1/projects/FIRESTORE_PROJECT/databases?databaseId={DATABASE_ID}' \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-type: application/json" \
-d '{
  "type":"FIRESTORE_NATIVE",
  "locationId":"{FIRESTORE_DATABASE_LOCATION}",
  "cmekConfig": {
    "kmsKeyName":"projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID"
  }
}'

Firebase CLI

หากต้องการสร้างฐานข้อมูลที่เปิดใช้ CMEK ให้ใช้ช่องชื่อคีย์ KMS หากไม่ได้ระบุพารามิเตอร์ --kms-key-name Cloud Firestore จะสร้างฐานข้อมูลที่ไม่ใช่ CMEK โดยค่าเริ่มต้น

firebase firestore:databases:create DATABASE_ID
--location LOCATION
--kms-key-name projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID
--project FIRESTORE_PROJECT

แทนที่ค่าต่อไปนี้

  • DATABASE_ID โดยมีรหัสของฐานข้อมูล
  • LOCATION พร้อมตำแหน่งของฐานข้อมูล
  • KMS_PROJECT ที่มีโปรเจ็กต์ที่มีคีย์ CMEK
  • KMS_LOCATION ที่มีตำแหน่งที่ตั้งคีย์ CMEK และคีย์ริง
  • KMS_KEYRING_ID ด้วยรหัสของพวงกุญแจ CMEK
  • FIRESTORE_PROJECT กับโปรเจ็กต์เพื่อใช้สำหรับฐานข้อมูล Cloud Firestore

ยืนยันว่าฐานข้อมูล Cloud Firestore ได้รับการปกป้องด้วย Firebase CLI โดยทำดังนี้

firebase firestore:databases:get DATABASE_ID --project FIRESTORE_PROJECT

ข้อมูล CMEK ต่อไปนี้จะปรากฏในข้อความตอบกลับ

  • ฟิลด์ชื่อคีย์ KMS จะระบุชื่อทรัพยากรคีย์แบบเต็มที่ใช้ในการเข้ารหัสฐานข้อมูล CMEK ของ Cloud Firestore
  • ฟิลด์เวอร์ชันคีย์ที่ใช้งานอยู่แสดงรายการเวอร์ชันคีย์ทั้งหมดที่ฐานข้อมูล CMEK นี้ใช้อยู่ในปัจจุบัน ในระหว่างการหมุนเวียนคีย์ คุณจะมีคีย์เวอร์ชันที่ใช้งานได้หลายเวอร์ชัน

Terraform

หากต้องการสร้างฐานข้อมูลที่เปิดใช้ CMEK ให้ใช้google_firestore_database resource ดูข้อมูลและตัวอย่างเพิ่มเติมได้ที่ google_firestore_database

resource "google_firestore_database" "database" {
  project     = "FIRESTORE_PROJECT"
  name        = "DATABASE_ID"
  location_id = "FIRESTORE_DATABASE_LOCATION"
  type        = "DATABASE_TYPE"

  cmek_config {
    kms_key_name = "KMS_KEY_NAME"
  }

}

แทนที่ค่าต่อไปนี้

  • FIRESTORE_PROJECT กับโปรเจ็กต์เพื่อใช้สำหรับฐานข้อมูล Cloud Firestore
  • DATABASE_ID ที่มีรหัสสำหรับฐานข้อมูล
  • FIRESTORE_DATABASE_LOCATION โดยมีตำแหน่ง Cloud Firestore สำหรับฐานข้อมูล
  • DATABASE_TYPE โดยใช้ FIRESTORE_NATIVE สำหรับโหมดดั้งเดิม หรือ DATASTORE_MODE สำหรับโหมด Datastore
  • KMS_KEY_NAME โดยใช้ชื่อที่คุณกำหนดให้กับคีย์ ใช้ชื่อทรัพยากรแบบเต็มสำหรับคีย์ในรูปแบบต่อไปนี้

    projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID

เข้าถึงฐานข้อมูลที่ได้รับการปกป้องด้วย CMEK

การดำเนินการอ่าน เขียน และค้นหาทั้งหมดที่ส่งไปยังฐานข้อมูลที่ป้องกันด้วย CMEK ควรทำงานเหมือนกับฐานข้อมูลที่เข้ารหัสเริ่มต้นของ Google เช่น คุณไม่จำเป็นต้องระบุคีย์สำหรับคำขอแต่ละรายการ

กู้คืนฐานข้อมูลที่ป้องกันด้วย CMEK

ก่อนที่จะกู้คืนฐานข้อมูลที่ป้องกันด้วย CMEK จากข้อมูลสำรอง ให้ทำดังนี้

  • ตัดสินใจว่าต้องการกู้คืนฐานข้อมูลเป็นการเข้ารหัส CMEK, การเข้ารหัสเริ่มต้นของ Google (ไม่ใช่ CMEK) หรือการเข้ารหัสเดียวกันกับข้อมูลสำรอง
  • เตรียมคีย์ (เวอร์ชันหลัก) และเวอร์ชันคีย์ที่คุณใช้เข้ารหัสข้อมูลสำรอง เปิดใช้ทั้งคีย์และเวอร์ชันคีย์

gcloud

กู้คืนฐานข้อมูลที่ป้องกันด้วย CMEK ไปยังการเข้ารหัส CMEK

หากต้องการกู้คืนไปยังการเข้ารหัส CMEK ให้เรียกใช้คำสั่ง gcloud firestore databases restore พร้อมด้วยแฟล็ก encryption-type และ kms-key-name ที่ไม่บังคับเพื่อกำหนดค่า ประเภทการเข้ารหัสสำหรับฐานข้อมูลที่กู้คืน หากไม่ได้ระบุประเภทการเข้ารหัส ฐานข้อมูลที่กู้คืนจะใช้การกำหนดค่าการเข้ารหัสเดียวกันกับข้อมูลสำรอง

  gcloud firestore databases restore
  --encryption-type=customer-managed-encryption
  --kms-key-name=KMS_KEY_NAME

แทนที่ KMS_KEY_NAME ด้วยชื่อที่คุณกำหนดให้กับคีย์ ใช้ชื่อทรัพยากรแบบเต็มสำหรับคีย์ในรูปแบบต่อไปนี้

projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID

กู้คืนฐานข้อมูลที่ป้องกันด้วย CMEK ไปเป็นการเข้ารหัสเริ่มต้น

หากต้องการกู้คืนเป็นการเข้ารหัสเริ่มต้นของ Google (ไม่ใช่ CMEK) ให้ตั้งค่า Flag encryption-type ดังนี้

  gcloud firestore databases restore
  --encryption-type=google-default-encryption

กู้คืนฐานข้อมูลที่ป้องกันด้วย CMEK ไปยังการเข้ารหัสประเภทเดียวกับข้อมูลสำรอง

หากต้องการกู้คืนไปยังการเข้ารหัสประเภทเดียวกับข้อมูลสำรอง ให้ตั้งค่าสถานะ encryption-type ดังนี้

  gcloud firestore databases restore --encryption-type=use-source-encryption

Firebase CLI

กู้คืนฐานข้อมูลที่ป้องกันด้วย CMEK ไปยังการเข้ารหัส CMEK

หากต้องการกู้คืนเป็นการเข้ารหัส CMEK ให้ใช้แฟล็ก encryption-type และ kms-key-name ซึ่งเป็นแฟล็กที่ไม่บังคับ หากไม่ได้ระบุประเภทการเข้ารหัส ฐานข้อมูลที่กู้คืนจะใช้การกำหนดค่าการเข้ารหัสเดียวกับข้อมูลสำรอง

firebase firestore:databases:restore \
--database DATABASE_ID \
--backup 'projects/FIRESTORE_PROJECT/locations/FIRESTORE_LOCATION/backups/BACKUP_ID' \
--encryption-type CUSTOMER_MANAGED_ENCRYPTION \
--kms-key-name projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID \
--project FIRESTORE_PROJECT

แทนที่ค่าต่อไปนี้

  • DATABASE_ID โดยมีรหัสของฐานข้อมูล
  • FIRESTORE_PROJECT กับโปรเจ็กต์เพื่อใช้สำหรับฐานข้อมูล Cloud Firestore
  • FIRESTORE_LOCATION พร้อมตำแหน่งของฐานข้อมูล Cloud Firestore
  • BACKUP_ID โดยใช้รหัสของข้อมูลสำรอง
  • KMS_PROJECT ที่มีโปรเจ็กต์ที่มีคีย์ CMEK
  • KMS_LOCATION ที่มีตำแหน่งที่ตั้งคีย์ CMEK และคีย์ริง
  • KMS_KEYRING_ID ด้วยรหัสของพวงกุญแจ CMEK

ยืนยันว่าCloud Firestoreฐานข้อมูลที่กู้คืนได้รับการเข้ารหัส CMEK

firebase firestore:databases:get DATABASE_ID --project FIRESTORE_PROJECT

กู้คืนฐานข้อมูลที่ป้องกันด้วย CMEK ไปเป็นการเข้ารหัสเริ่มต้น

หากต้องการกู้คืนเป็นการเข้ารหัสเริ่มต้นของ Google (ไม่ใช่ CMEK) ให้ตั้งค่า Flag encryption-type ดังนี้

firebase firestore:databases:restore \
--database DATABASE_ID \
--backup 'projects/FIRESTORE_PROJECT/locations/FIRESTORE_LOCATION/backups/BACKUP_ID' \
--encryption-type GOOGLE_DEFAULT_ENCRYPTION \
--project FIRESTORE_PROJECT

แทนที่ค่าต่อไปนี้

  • DATABASE_ID โดยมีรหัสของฐานข้อมูล
  • FIRESTORE_PROJECT กับโปรเจ็กต์เพื่อใช้สำหรับฐานข้อมูล Cloud Firestore
  • FIRESTORE_LOCATION พร้อมตำแหน่งของฐานข้อมูล Cloud Firestore
  • BACKUP_ID โดยใช้รหัสของข้อมูลสำรอง

กู้คืนฐานข้อมูลที่ป้องกันด้วย CMEK ไปยังการเข้ารหัสประเภทเดียวกับข้อมูลสำรอง

หากต้องการกู้คืนไปยังการเข้ารหัสประเภทเดียวกับข้อมูลสำรอง ให้ตั้งค่าสถานะ encryption-type ดังนี้

firebase firestore:databases:restore \
--database DATABASE_IDD \
--backup 'projects/FIRESTORE_PROJECT/locations/FIRESTORE_LOCATION/backups/BACKUP_ID' \
--encryption-type USE_SOURCE_ENCRYPTION

แทนที่ค่าต่อไปนี้

  • DATABASE_ID โดยมีรหัสของฐานข้อมูล
  • FIRESTORE_PROJECT กับโปรเจ็กต์เพื่อใช้สำหรับฐานข้อมูล Cloud Firestore
  • FIRESTORE_LOCATION พร้อมตำแหน่งของฐานข้อมูล Cloud Firestore
  • BACKUP_ID โดยใช้รหัสของข้อมูลสำรอง

โคลนฐานข้อมูลที่ได้รับการปกป้องด้วย CMEK

ก่อนที่จะโคลนฐานข้อมูลที่ป้องกันด้วย CMEK ให้ทำดังนี้

  • ตัดสินใจว่าต้องการโคลนฐานข้อมูลเป็นการเข้ารหัส CMEK, การเข้ารหัสเริ่มต้นของ Google (ไม่ใช่ CMEK) หรือการเข้ารหัสเดียวกันกับฐานข้อมูลต้นทาง
  • เตรียมคีย์ (เวอร์ชันหลัก) และเวอร์ชันคีย์ที่คุณใช้เข้ารหัสฐานข้อมูลต้นทาง เปิดใช้ทั้งคีย์และเวอร์ชันคีย์

gcloud

โคลนฐานข้อมูลที่ป้องกันด้วย CMEK ไปยังการเข้ารหัส CMEK

หากต้องการโคลนไปยังการเข้ารหัส CMEK ให้เรียกใช้คำสั่ง gcloud alpha firestore databases clone พร้อมด้วยแฟล็ก encryption-type และ kms-key-name ที่ไม่บังคับเพื่อกำหนดค่า ประเภทการเข้ารหัสสำหรับฐานข้อมูลที่โคลน หากไม่ได้ระบุประเภทการเข้ารหัส ฐานข้อมูลที่โคลนจะใช้การกำหนดค่าการเข้ารหัสเดียวกับฐานข้อมูลต้นทาง

gcloud alpha firestore databases clone \
--encryption-type=customer-managed-encryption \
--kms-key-name=KMS_KEY_NAME

แทนที่ KMS_KEY_NAME ด้วยชื่อที่คุณกำหนดให้กับ คีย์ ใช้ชื่อทรัพยากรแบบเต็มสำหรับคีย์ในรูปแบบต่อไปนี้

projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID

โคลนฐานข้อมูลที่ป้องกันด้วย CMEK ไปเป็นการเข้ารหัสเริ่มต้น

หากต้องการโคลนไปยังการเข้ารหัสเริ่มต้นของ Google (ไม่ใช่ CMEK) ให้ตั้งค่า Flag encryption-type ดังนี้

gcloud alpha firestore databases clone \
--encryption-type=google-default-encryption

โคลนฐานข้อมูลที่ป้องกันด้วย CMEK ให้มีการเข้ารหัสประเภทเดียวกับฐานข้อมูลต้นทาง

หากต้องการโคลนไปยังการเข้ารหัสประเภทเดียวกับฐานข้อมูลต้นทาง ให้ตั้งค่า encryption-type ในลักษณะต่อไปนี้

gcloud alpha firestore databases clone \
--encryption-type=use-source-encryption

ดูกุญแจที่ใช้งานอยู่

gcloud

คุณใช้คำสั่ง databases describe gcloud CLI เพื่อยืนยันการกำหนดค่า CMEK ของฐานข้อมูลได้

gcloud firestore databases describe --database=DATABASE_ID --project=FIRESTORE_PROJECT

คุณควรเห็นข้อมูล CMEK ในช่อง cmekConfig ในการตอบกลับ คล้ายกับตัวอย่างต่อไปนี้

cmekConfig:
    activeKeyVersion:
    - projects/PROJECT_ID/locations/us/keyRings/KEYRING_NAME/cryptoKeys/KEY_NAME/cryptoKeyVersions/1
    kmsKeyName: projects/PROJECT_ID/locations/us/keyRings/KEYRING_NAME/cryptoKeys/KEY_NAME
  locationId: nam5
  name: projects/PROJECT_ID/databases/DATABASE_ID

การตอบกลับจะมีข้อมูลต่อไปนี้

  • kmsKeyName: ชื่อทรัพยากรคีย์แบบเต็มของคีย์ที่ใช้เข้ารหัส ฐานข้อมูลที่ป้องกันด้วย CMEK
  • activeKeyVersion: รายการเวอร์ชันคีย์ทั้งหมดที่ฐานข้อมูลที่ป้องกันด้วย CMEK ใช้อยู่ ในระหว่างการหมุนเวียนคีย์ คุณจะมีคีย์เวอร์ชันที่ใช้งานได้หลายเวอร์ชัน ทั้งเวอร์ชันคีย์เก่าและเวอร์ชันคีย์ใหม่ต้องพร้อมใช้งานในระหว่างการหมุนเวียนคีย์ อย่าปิดใช้เวอร์ชันคีย์เก่าจนกว่าจะไม่ปรากฏในช่องactiveKeyVersion

REST API

คำขอ HTTP:

GET https://firestore.googleapis.com/v1/{name=projects/FIRESTORE_PROJECT/databases/DATABASE_ID}

ในเนื้อความของคำขอ ให้กำหนดค่า CMEK ในฟิลด์ cmek_config.kms_key_name ตั้งค่าเป็นรหัสทรัพยากรแบบเต็มของคีย์ Cloud KMS อนุญาตเฉพาะคีย์ที่อยู่ในตำแหน่งเดียวกับฐานข้อมูลนี้เท่านั้น

ค่านี้ควรเป็นรหัสทรัพยากรคีย์ Cloud KMS ในรูปแบบ projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}

ดูข้อมูลเพิ่มเติมเกี่ยวกับฟิลด์อื่นๆ ได้ที่database create หน้า

ตัวอย่างคำขอและการตอบกลับ

curl 'https://firestore.googleapis.com/v1/projects/FIRESTORE_PROJECT/databases/{DATABASE_ID}' \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-type: application/json"

----------------------------------------- Response --------------------------------------------
{
  "name": "projects/FIRESTORE_PROJECT/databases/{DATABASE_ID}",
  "locationId": "{FIRESTORE_DATABASE_LOCATION}",
  "type": "FIRESTORE_NATIVE",
  "cmekConfig": {
    "kmsKeyName": "projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}",
    "activeKeyVersion": [
      "projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}/cryptoKeyVersions/1"
    ]
  },
  ……
}

ปิดใช้คีย์

หากต้องการปิดใช้คีย์ที่เชื่อมโยงกับฐานข้อมูล ให้ทำดังนี้

  1. ดูเวอร์ชันคีย์ที่ใช้สำหรับฐานข้อมูล
  2. ปิดใช้เวอร์ชันคีย์เหล่านี้ที่ใช้อยู่
  3. รอให้การเปลี่ยนแปลงมีผลและตรวจสอบว่าข้อมูลเข้าถึงไม่ได้อีกต่อไปหรือไม่ โดยทั่วไปการเปลี่ยนแปลงจะมีผลภายในเวลาไม่กี่นาที แต่ก็อาจใช้เวลาถึง 3 ชั่วโมง

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

{
  "error": {
    "code": 400,
    "message": "The customer-managed encryption key required by the requested resource is not accessible. Error reason:  generic::permission_denied: Permission 'cloudkms.cryptoKeyVersions.useToEncrypt' denied on resource 'projects/FIRESTORE_PROJECT/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}' (or it may not exist).",
    "status": "FAILED_PRECONDITION",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.DebugInfo",
        "detail": "The customer-managed encryption key required by the requested resource is not accessible. Error reason:  generic::permission_denied: Permission 'cloudkms.cryptoKeyVersions.useToEncrypt' denied on resource 'projects/FIRESTORE_PROJECT/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}' (or it may not exist)"
      }
    ]
  }
}

เปิดใช้คีย์

หากต้องการเปิดใช้คีย์ที่เชื่อมโยงกับฐานข้อมูลอีกครั้ง ให้ทำดังนี้

  1. ดูเวอร์ชันคีย์ที่ใช้สำหรับฐานข้อมูล
  2. เปิดใช้เวอร์ชันคีย์ที่ใช้งานอยู่
  3. รอให้การเปลี่ยนแปลงมีผลและตรวจสอบว่าข้อมูลเข้าถึงไม่ได้อีกต่อไปหรือไม่ โดยทั่วไปการเปลี่ยนแปลงจะมีผลภายในเวลาไม่กี่นาที แต่ก็อาจใช้เวลาถึง 3 ชั่วโมง

ดูบันทึกการตรวจสอบสำหรับคีย์ Cloud KMS

ก่อนเปิดใช้บันทึกการตรวจสอบการเข้าถึงข้อมูลของ Cloud KMS คุณควรทำความคุ้นเคยกับ Cloud Audit Logs

บันทึกการตรวจสอบการเข้าถึงข้อมูลของ Cloud KMS จะแสดงให้คุณเห็นเมื่อ Cloud Firestore หรือผลิตภัณฑ์อื่นๆ ที่กำหนดค่าให้ใช้คีย์ CMEK ของคุณทำการเรียกเข้ารหัส/ถอดรหัสไปยัง Cloud KMS Cloud Firestore ไม่ได้ออกการเรียกเข้ารหัส/ถอดรหัสในทุกคำขอข้อมูล แต่จะดูแลรักษาเครื่องมือสำรวจที่ตรวจสอบคีย์เป็นระยะๆ แทน ผลการสำรวจจะปรากฏในบันทึกการตรวจสอบ

คุณสามารถตั้งค่าและโต้ตอบกับบันทึกการตรวจสอบในคอนโซล Google Cloud ได้โดยทำดังนี้

  1. ตรวจสอบว่าเปิดใช้การบันทึกสำหรับ Cloud KMS API ในโปรเจ็กต์

  2. ไปที่ Cloud Logging ในคอนโซล Google Cloud

    ไปที่ Cloud Logging

  3. จำกัดรายการบันทึกให้เฉพาะคีย์ Cloud KMS โดยเพิ่มบรรทัดต่อไปนี้ลงในเครื่องมือสร้างคำค้นหา

    resource.type="cloudkms_cryptokey"
    resource.labels.key_ring_id = KMS_KEYRING
    resource.labels.crypto_key_id = KMS_KEY
    resource.labels.location=KMS_LOCATION
    

    แทนที่ค่าต่อไปนี้

    • KMS_KEY โดยมีชื่อคีย์ CMEK
    • KMS_KEYRING ที่มีคีย์ริง KMS ที่มีคีย์
    • KMS_LOCATION พร้อมตำแหน่งของคีย์และคีย์ริง

    บันทึกจะแสดงรายการบันทึก 2 รายการทุกๆ 5 นาทีต่อฐานข้อมูล รายการบันทึกจะมีลักษณะคล้ายกับตัวอย่างต่อไปนี้

    Info 2021-03-20 08:02:24.869 EDT Cloudkms.googleapis.com Decrypt projects/cloud-kms-project/locations/us-central1/keyRings/firestore-keys/cryptoKeys/my-cmek-key service-123456789123@gcp-sa-firestore.iam.gserviceaccount.com
    audit_log, method: "Decrypt", principal_email: "service-1234567891011@gcp-sa-firestore.iam.gserviceaccount.com"
    
    Info 2021-03-20 08:02:24.913 EDT Cloudkms.googleapis.com Encrypt projects/cloud-kms-project/locations/us-central1/keyRings/firestore-keys/cryptoKeys/my-cmek-key service-123456789123@gcp-sa-firestore.iam.gserviceaccount.com
    audit_log, method: "Encrypt", principal_email: "service-123456789123@gcp-sa-firestore.iam.gserviceaccount.com"
    

ดูรายละเอียดเกี่ยวกับการตีความบันทึกการตรวจสอบได้ที่หัวข้อทำความเข้าใจบันทึกการตรวจสอบ

กำหนดค่านโยบายองค์กร CMEK

หากต้องการระบุข้อกำหนดด้านการปฏิบัติตามข้อกำหนดการเข้ารหัสสำหรับCloud Firestore ฐานข้อมูลในองค์กร ให้ใช้ข้อจำกัดด้านนโยบายขององค์กร CMEK

ต้องใช้การปกป้อง CMEK

กำหนดค่า constraints/gcp.restrictNonCmekServices ให้ต้องใช้ CMEK สำหรับ Cloud Firestore การสร้างฐานข้อมูล ตั้งค่าข้อจำกัดเป็น deny และ เพิ่ม firestore.googleapis.com ลงในรายการปฏิเสธ เช่น

 gcloud resource-manager org-policies deny gcp.restrictNonCmekServices  is:firestore.googleapis.com --project=FIRESTORE_PROJECT

แทนที่ FIRESTORE_PROJECT ด้วยโปรเจ็กต์ที่จะจำกัด

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

หลังจากนโยบายมีผลบังคับใช้ คุณจะได้รับFAILED_PRECONDITIONข้อยกเว้นและข้อความแสดงข้อผิดพลาดหากพยายามสร้างฐานข้อมูลที่ไม่ใช่ CMEK ภายใต้โปรเจ็กต์ที่ได้รับผลกระทบ ตัวอย่างเช่น ข้อยกเว้นจะมีลักษณะดังนี้

{
  "error": {
    "code": 400,
    "message": "Constraint 'constraints/gcp.restrictNonCmekServices' violated for 'projects/FIRESTORE_PROJECT' attempting to perform the operation 'google.firestore.admin.v1.FirestoreAdmin.CreateDatabase' with violated value 'firestore.googleapis.com'. See https://cloud.google.com/resource-manager/docs/organization-policy/org-policy-constraints for more information.",
    "status": "FAILED_PRECONDITION",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.PreconditionFailure",
        "violations": [
          {
            "type": "constraints/gcp.restrictNonCmekServices",
            "subject": "orgpolicy:projects/FIRESTORE_PROJECT",
            "description": "Constraint 'constraints/gcp.restrictNonCmekServices' violated for 'projects/FIRESTORE_PROJECT' attempting to perform the operation 'google.firestore.admin.v1.FirestoreAdmin.CreateDatabase' with violated value 'firestore.googleapis.com'. See https://cloud.google.com/resource-manager/docs/organization-policy/org-policy-constraints for more information."
          }
        ]

จำกัดการใช้คีย์สำหรับ CMEK

หากต้องการจำกัดคีย์ Cloud KMS ที่ใช้สำหรับการป้องกัน CMEK ให้กำหนดค่าข้อจำกัด constraints/gcp.restrictCmekCryptoKeyProjects

ค่าที่ยอมรับได้ในข้อจำกัดของรายการคือตัวบ่งชี้ลำดับชั้นของทรัพยากร (เช่น projects/PROJECT_ID, under:folders/FOLDER_ID และ under:organizations/ORGANIZATION_ID) ใช้ข้อจำกัดนี้โดยการกำหนดค่ารายการตัวบ่งชี้ลำดับชั้นของทรัพยากรและตั้งค่าข้อจำกัดเป็นอนุญาต การกำหนดค่านี้จะจำกัดบริการที่รองรับเพื่อให้เลือกคีย์ CMEK ได้จากโปรเจ็กต์ โฟลเดอร์ และองค์กรที่ระบุไว้เท่านั้น คำขอสร้างทรัพยากรที่ป้องกันด้วย CMEK ในบริการที่กำหนดค่าไว้จะไม่สำเร็จหากไม่มีCloud Firestoreคีย์จากทรัพยากรที่อนุญาต

ตัวอย่างต่อไปนี้อนุญาตเฉพาะคีย์จาก ALLOWED_KEY_PROJECT_ID สำหรับฐานข้อมูลที่ได้รับการปกป้องด้วย CMEK ในโปรเจ็กต์ที่ระบุ

gcloud resource-manager org-policies allow gcp.restrictCmekCryptoKeyProjects \
under:projects/ALLOWED_KEY_PROJECT_ID \
--project=FIRESTORE_PROJECT

หลังจากนโยบายมีผลบังคับใช้ คุณจะได้รับFAILED_PRECONDITIONข้อยกเว้น และข้อความแสดงข้อผิดพลาดหากละเมิดข้อจำกัด ข้อยกเว้น มีลักษณะดังนี้

{
  "error": {
    "code": 400,
    "message": "Constraint 'constraints/gcp.restrictCmekCryptoKeyProjects' violated for 'projects/FIRESTORE_PROJECT' attempting to perform the operation 'google.firestore.admin.v1.FirestoreAdmin.CreateDatabase' with violated value 'projects/{NOT_ALLOWED_KEY_PROJECT}'. See https://cloud.google.com/resource-manager/docs/organization-policy/org-policy-constraints for more information.",
    "status": "FAILED_PRECONDITION",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.PreconditionFailure",
        "violations": [
          {
            "type": "constraints/gcp.restrictCmekCryptoKeyProjects",
            "subject": "orgpolicy:projects/FIRESTORE_PROJECT",
            "description": "Constraint 'constraints/gcp.restrictCmekCryptoKeyProjects' violated for 'projects/FIRESTORE_PROJECT' attempting to perform the operation 'google.firestore.admin.v1.FirestoreAdmin.CreateDatabase' with violated value 'projects/{NOT_ALLOWED_KEY_PROJECT}'. See https://cloud.google.com/resource-manager/docs/organization-policy/org-policy-constraints for more information."
          }
        ]
      }
    ]
  }
}

ขั้นตอนถัดไป