ใช้คีย์การเข้ารหัสที่จัดการโดยลูกค้า (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 ของคุณ

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

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:

    • ใช้ตำแหน่งหลายภูมิภาคของ Cloud KMS us สำหรับตำแหน่งหลายภูมิภาค Cloud Firestore nam5
    • ใช้ตำแหน่งหลายภูมิภาคของ Cloud KMS europe สำหรับตำแหน่งหลายภูมิภาค 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 Encrypter/Decrypter

  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. ในหน้ากำหนดค่าฐานข้อมูลของคุณ ให้ป้อน ID ฐานข้อมูล

  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 พร้อม 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:

โพสต์ https://firestore.googleapis.com/v1/projects/{FIRESTORE_PROJECT}/ฐานข้อมูล

ในเนื้อความของคำขอ ให้กำหนดค่า 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 พร้อม ID ของพวงกุญแจ CMEK ของคุณ
  • FIRESTORE_PROJECT กับโปรเจ็กต์เพื่อใช้สำหรับฐานข้อมูล Cloud Firestore

ยืนยันว่าฐานข้อมูล Cloud Firestore ของคุณได้รับการปกป้องด้วย Firebase CLI:

firebase firestore:databases:get DATABASE_ID --project FIRESTORE_PROJECT

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

  • ฟิลด์ ชื่อคีย์ KMS จะให้ชื่อทรัพยากรคีย์แบบเต็มที่ใช้ในการเข้ารหัสฐานข้อมูล Cloud Firestore CMEK ของคุณ
  • ฟิลด์ Active Key Versions แสดงรายการ Key Versions ทั้งหมดที่ใช้โดยฐานข้อมูล 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) ให้ตั้งค่า 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 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) ให้ตั้งค่า Flag 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) ให้ตั้งค่า Flag 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 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 พร้อมตำแหน่งของคีย์และคีย์ริง

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

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

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