หน้านี้อธิบายวิธีทำงานที่เกี่ยวข้องกับคีย์การเข้ารหัสที่จัดการโดยลูกค้า (CMEK) สำหรับ Cloud Firestore ดูข้อมูลเพิ่มเติมเกี่ยวกับ CMEK โดยทั่วไป รวมถึงกรณีและเหตุผลที่ควรเปิดใช้ได้ในเอกสารประกอบของ Cloud KMS
เตรียมคีย์ CMEK
ก่อนที่จะสร้างฐานข้อมูล Cloud Firestore ที่ได้รับการปกป้องด้วย CMEK คุณต้องทำตามขั้นตอนต่อไปนี้ให้เสร็จสมบูรณ์
- ขอสิทธิ์เข้าถึงฟีเจอร์ CMEK ของ Cloud Firestore
- สร้าง (หรือดึงข้อมูล) Cloud Firestore Service Agent
- สร้างคีย์ CMEK
- กำหนดการตั้งค่า 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 ที่คุณต้องการจัดการคีย์ ให้ทำดังนี้
สร้างคีย์ริงและคีย์โดยใช้ตัวเลือกใดตัวเลือกหนึ่งต่อไปนี้
- สร้างคีย์ริงและคีย์ใน Cloud KMS โดยตรง
- ใช้คีย์ที่จัดการจากภายนอก สร้างคีย์ภายนอก แล้วสร้างคีย์ Cloud EKM เพื่อให้คีย์พร้อมใช้งานผ่าน Cloud KMS
กำหนดการตั้งค่า IAM สำหรับคีย์
คอนโซล
หากต้องการมอบบทบาท Cloud KMS ให้กับตัวแทนบริการ ให้ทำดังนี้ นอกจากนี้ คุณยังให้สิทธิ์ที่ระดับคีย์หรือคีย์ริงได้หากต้องการรายละเอียดที่ต่ำลง
ไปที่หน้า IAM ในคอนโซล Google Cloud
คลิกเพิ่ม
ป้อนรหัสในรูปแบบอีเมลสำหรับ Agent บริการ Cloud Firestore
เลือกบทบาทผู้เข้ารหัส/ผู้ถอดรหัส Cloud KMS CryptoKey
คลิกบันทึก
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 เท่านั้น
คอนโซล
ในคอนโซล Google Cloud ให้ไปที่หน้าฐานข้อมูล
คลิก Create Database
เลือกโหมดฐานข้อมูล คลิกต่อไป
ในหน้ากำหนดค่าฐานข้อมูล ให้ป้อนรหัสฐานข้อมูล
เลือกสถานที่ตั้ง
คลิกแสดงตัวเลือกการเข้ารหัส แล้วเลือกคีย์ Cloud KMS
เลือกหรือป้อนชื่อทรัพยากรสำหรับคีย์ CMEK ที่ต้องการใช้กับฐานข้อมูล
รายการคีย์จะจำกัดเฉพาะโปรเจ็กต์ Google Cloud ปัจจุบันและตำแหน่งฐานข้อมูลที่คุณเลือก หากต้องการใช้คีย์จากโปรเจ็กต์ Google Cloud อื่น ให้คลิกเปลี่ยนโปรเจ็กต์หรือป้อนคีย์ด้วยตนเอง
หากระบบแจ้งให้คุณให้สิทธิ์คีย์แก่บัญชีบริการ Cloud Firestore ให้คลิกให้สิทธิ์ หากต้องการสร้างฐานข้อมูล CMEK บัญชีบริการ Cloud Firestore ของคุณต้องได้รับบทบาท
cloudkms.cryptoKeyEncrypterDecrypterเลือกกฎความปลอดภัยสำหรับไคลเอ็นต์บนอุปกรณ์เคลื่อนที่และเว็บ
คลิก 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_IDFIRESTORE_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ด้วยโปรเจ็กต์ที่มีคีย์ CMEKKMS_LOCATIONพร้อมตำแหน่งที่มีคีย์ CMEK และคีย์ริงKMS_KEYRING_IDด้วยรหัสของคีย์ริง CMEKFIRESTORE_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สำหรับโหมด DatastoreKMS_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 FirestoreBACKUP_IDด้วยรหัสของข้อมูลสำรองKMS_PROJECTด้วยโปรเจ็กต์ที่มีคีย์ CMEKKMS_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 FirestoreBACKUP_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 FirestoreBACKUP_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: ชื่อทรัพยากรคีย์แบบเต็มของคีย์ที่ใช้ในการเข้ารหัสฐานข้อมูลที่ได้รับการปกป้องด้วย CMEKactiveKeyVersion: รายการเวอร์ชันคีย์ทั้งหมดที่ฐานข้อมูลที่ได้รับการปกป้องด้วย 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"
]
},
……
}
ปิดใช้คีย์
หากต้องการปิดใช้คีย์ที่เชื่อมโยงกับฐานข้อมูล ให้ทำตามขั้นตอนต่อไปนี้
- ดูเวอร์ชันคีย์ที่ใช้สำหรับฐานข้อมูล
- ปิดใช้เวอร์ชันคีย์เหล่านี้ที่ใช้งานอยู่
- รอให้การเปลี่ยนแปลงมีผลและตรวจสอบว่าข้อมูลเข้าถึงไม่ได้แล้ว โดยทั่วไปการเปลี่ยนแปลงจะมีผลภายในเวลาไม่กี่นาที แต่ก็อาจใช้เวลาถึง 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)" } ] } }
เปิดใช้คีย์
หากต้องการเปิดใช้คีย์ที่เชื่อมโยงกับฐานข้อมูลอีกครั้ง ให้ทำตามขั้นตอนต่อไปนี้
- ดูเวอร์ชันคีย์ที่ใช้สำหรับฐานข้อมูล
- เปิดใช้เวอร์ชันคีย์เหล่านี้ที่ใช้งานอยู่
- รอให้การเปลี่ยนแปลงมีผลและตรวจสอบว่าข้อมูลเข้าถึงไม่ได้แล้ว โดยทั่วไปการเปลี่ยนแปลงจะมีผลภายในเวลาไม่กี่นาที แต่ก็อาจใช้เวลาถึง 3 ชั่วโมง
ดูบันทึกการตรวจสอบสำหรับคีย์ Cloud KMS
ก่อนเปิดใช้บันทึกการตรวจสอบการเข้าถึงข้อมูล Cloud KMS คุณควรทำความคุ้นเคยกับบันทึกการตรวจสอบระบบคลาวด์
บันทึกการตรวจสอบการเข้าถึงข้อมูลของ Cloud KMS จะแสดงให้เห็นเมื่อ Cloud Firestore หรือผลิตภัณฑ์อื่นๆ ที่กำหนดค่าให้ใช้คีย์ CMEK ทำการเรียกใช้การเข้ารหัส/ถอดรหัสไปยัง Cloud KMS Cloud Firestore ไม่ได้ออกการเรียกใช้การเข้ารหัส/ถอดรหัสในคำขอข้อมูลทุกรายการ แต่จะรักษาตัวสอบถามที่ตรวจสอบคีย์เป็นระยะๆ แทน ผลการสำรวจความคิดเห็นจะปรากฏในบันทึกการตรวจสอบ
คุณสามารถตั้งค่าและโต้ตอบกับบันทึกการตรวจสอบในคอนโซล Google Cloud ได้โดยทำดังนี้
ตรวจสอบว่าเปิดใช้การบันทึกสำหรับ Cloud KMS API ในโปรเจ็กต์แล้ว
ไปที่ Cloud Logging ในคอนโซล Google Cloud
จำกัดรายการบันทึกไว้ที่คีย์ 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พร้อมชื่อคีย์ CMEKKMS_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." } ] } ] } }