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

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

เตรียมคีย์ CMEK

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

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

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

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

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

สร้าง Agent บริการ Cloud Firestore

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

เรียกใช้คำสั่ง services identity create เพื่อสร้าง Service Agent ที่ 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. ป้อนรหัสในรูปแบบอีเมลสำหรับ Agent บริการ Cloud Firestore

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

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

gcloud

มอบบทบาท cloudkms.cryptoKeyEncrypterDecrypter ให้กับ Service Agent ของคุณ

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 พร้อมตัวระบุรูปแบบอีเมลสำหรับ Service Agent ที่คุณให้สิทธิ์เข้าถึง
  • 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. คลิก Create Database

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

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

  5. เลือกสถานที่ตั้ง

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

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

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

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

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

  11. คลิก Create Database

เมื่อสร้างฐานข้อมูลแล้ว คุณสามารถยืนยันว่าฐานข้อมูลเปิดใช้ 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 ดูข้อมูลเพิ่มเติมและตัวอย่างได้ที่ 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) ให้ตั้งค่าแฟล็ก 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) ให้ตั้งค่าแฟล็ก 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 firestore databases clone พร้อมแฟล็ก encryption-type และ kms-key-name (ไม่บังคับ) เพื่อกำหนดค่าประเภทการเข้ารหัสสำหรับฐานข้อมูลที่โคลน หากคุณไม่ได้ระบุประเภทการเข้ารหัส ฐานข้อมูลที่โคลนจะใช้การกำหนดค่าการเข้ารหัสเดียวกันกับฐานข้อมูลต้นทาง

gcloud 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) ให้ตั้งค่าแฟล็ก encryption-type ด้วยวิธีต่อไปนี้

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

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

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

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

และยังเป็นลักษณะการทำงานเริ่มต้นหากไม่ได้ระบุ --encryption-type ด้วย

Firebase CLI

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

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

firebase firestore:databases:clone \
SOURCE_DATABASE \
DESTINATION_DATABASE \
--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) ให้ตั้งค่าแฟล็ก encryption-type ด้วยวิธีต่อไปนี้

firebase firestore:databases:clone \
SOURCE_DATABASE \
DESTINATION_DATABASE \
--encryption-type=GOOGLE_DEFAULT_ENCRYPTION

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

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

firebase firestore:databases:clone \
SOURCE_DATABASE \
DESTINATION_DATABASE \
--encryption-type=USE_SOURCE_ENCRYPTION

และยังเป็นลักษณะการทำงานเริ่มต้นหากไม่ได้ระบุ --encryption-type ด้วย

ดูคีย์ที่ใช้อยู่

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

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

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

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

    ไปที่ Cloud Logging

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

    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."
          }
        ]
      }
    ]
  }
}

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