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

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

เตรียมคีย์ CMEK

คุณต้องทําตามขั้นตอนต่อไปนี้ก่อนจึงจะสร้างฐานข้อมูล Cloud Firestore ที่ปกป้องโดย CMEK ได้

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

ทําตามขั้นตอนเหล่านี้สําหรับโปรเจ็กต์แต่ละรายการที่จะมีฐานข้อมูล Cloud Firestore ที่ได้รับการปกป้องโดย CMEK หากสร้างคีย์ 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 ที่จะใช้

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

    เช่น หากต้องการสร้างฐานข้อมูลที่ป้องกันด้วย 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. ในคอนโซล Google Cloud ให้ไปที่หน้า IAM

    ไปที่หน้า 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 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) หรือการเข้ารหัสเดียวกับข้อมูลสํารอง
  • เตรียมคีย์ (primary-version) และเวอร์ชันคีย์ที่คุณใช้เข้ารหัสข้อมูลสํารอง เปิดใช้ทั้งคีย์และเวอร์ชันคีย์

gcloud

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

หากต้องการกู้คืนเป็นการเข้ารหัส CMEK ให้เรียกใช้คำสั่ง gcloud firestore databases restore พร้อม Flag 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 เป็นการเข้ารหัสประเภทเดียวกับข้อมูลสํารอง

หากต้องการกู้คืนเป็นประเภทการเข้ารหัสเดียวกับข้อมูลสํารอง ให้ตั้งค่า Flag 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 เป็นการเข้ารหัสประเภทเดียวกับข้อมูลสํารอง

หากต้องการกู้คืนเป็นประเภทการเข้ารหัสเดียวกับข้อมูลสํารอง ให้ตั้งค่า Flag 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 พร้อมรหัสข้อมูลสำรอง

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

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 โดยเพิ่มบรรทัดต่อไปนี้ลงในเครื่องมือสร้างคําค้นหา

    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-3 รายการทุกๆ 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."
          }
        ]
      }
    ]
  }
}

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