หน้านี้จะอธิบายวิธีดำเนินการงานที่เกี่ยวข้องกับ คีย์การเข้ารหัสที่จัดการโดยลูกค้า (CMEK) สำหรับ Cloud Firestore สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ CMEK โดยทั่วไป รวมถึงเวลาและเหตุผลในการเปิดใช้งาน โปรดดูเอกสาร Cloud KMS
เตรียมกุญแจ CMEK ของคุณ
ก่อนที่คุณจะสร้างฐานข้อมูล Cloud Firestore ที่ได้รับการปกป้องด้วย CMEK คุณต้องดำเนินการตามขั้นตอนต่อไปนี้:
- ขอสิทธิ์เข้าถึงฟีเจอร์ Cloud Firestore CMEK
- สร้าง (หรือดึงข้อมูล)Cloud Firestore ตัวแทนบริการ -
- สร้างคีย์ CMEK
- กำหนดค่าการตั้งค่า 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 Firestorenam5 - ใช้ตำแหน่งหลายภูมิภาคของ Cloud KMS
europeสำหรับตำแหน่งหลายภูมิภาค Cloud Firestoreeur3
- ใช้ตำแหน่งหลายภูมิภาคของ Cloud KMS
ในGoogle Cloudโปรเจ็กต์ที่คุณต้องการจัดการคีย์ ให้ทำดังนี้
สร้างพวงกุญแจและคีย์โดยใช้หนึ่งในตัวเลือกต่อไปนี้:
- สร้างคีย์ริงและคีย์ใน Cloud KMS โดยตรง
- ใช้คีย์ที่ได้รับการจัดการจากภายนอก สร้างคีย์ภายนอก จากนั้นสร้างคีย์ Cloud EKM เพื่อให้คีย์พร้อมใช้งานผ่าน Cloud KMS
กำหนดการตั้งค่า IAM สำหรับคีย์
คอนโซล
หากต้องการมอบบทบาท Cloud KMS ให้กับตัวแทนบริการของคุณ ให้ทำดังต่อไปนี้ นอกจากนี้ คุณยังให้สิทธิ์ในระดับคีย์หรือพวงกุญแจได้หากต้องการความละเอียดที่ต่ำกว่า
ในคอนโซล Google Cloud ให้ไปที่หน้า IAM
คลิกเพิ่ม
ป้อนรหัสในรูปแบบอีเมลสำหรับCloud Firestore ตัวแทนบริการ
เลือกบทบาท Cloud KMS CryptoKey Encrypter/Decrypter
คลิกบันทึก
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 เท่านั้น
คอนโซล
ในคอนโซล Google Cloud ให้ไปที่หน้าฐานข้อมูล
คลิกสร้างฐานข้อมูล
เลือกโหมดฐานข้อมูล คลิกต่อไป
ในหน้ากำหนดค่าฐานข้อมูลของคุณ ให้ป้อน ID ฐานข้อมูล
เลือกสถานที่
คลิกแสดงตัวเลือกการเข้ารหัส จากนั้นเลือกคีย์ Cloud KMS
เลือกหรือป้อนชื่อทรัพยากรสำหรับคีย์ CMEK ที่คุณต้องการใช้สำหรับฐานข้อมูล
รายการคีย์จะถูกจำกัดเฉพาะโครงการ Google Cloud ปัจจุบันและตำแหน่งฐานข้อมูลที่คุณเลือก หากต้องการใช้คีย์จากโครงการ Google Cloud อื่น ให้คลิกสลับโครงการหรือป้อนคีย์ด้วยตนเอง
หากได้รับข้อความแจ้งให้สิทธิ์คีย์แก่บัญชีบริการ Cloud Firestore ให้คลิกให้สิทธิ์ ในการสร้างฐานข้อมูล CMEK บัญชีบริการ Cloud Firestore ของคุณจะต้องได้รับบทบาท
cloudkms.cryptoKeyEncrypterDecrypterเลือกกฎความปลอดภัยสำหรับไคลเอนต์มือถือและเว็บ
คลิกสร้างฐานข้อมูล
เมื่อสร้างฐานข้อมูลแล้ว คุณสามารถตรวจยืนยันว่าฐานข้อมูลเปิดใช้งาน 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_IDFIRESTORE_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ที่มีโปรเจ็กต์ที่มีคีย์ CMEKKMS_LOCATIONที่มีตำแหน่งที่ตั้งซึ่งมีคีย์และคีย์ริง CMEKKMS_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 FirestoreDATABASE_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 FirestoreFIRESTORE_LOCATIONพร้อมตำแหน่งของฐานข้อมูล Cloud FirestoreBACKUP_IDด้วยรหัสของข้อมูลสำรองKMS_PROJECTที่มีโปรเจ็กต์ที่มีคีย์ CMEKKMS_LOCATIONที่มีตำแหน่งที่ตั้งซึ่งมีคีย์และคีย์ริง CMEKKMS_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 FirestoreFIRESTORE_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 FirestoreFIRESTORE_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) ให้ตั้งค่า
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: ชื่อทรัพยากรคีย์แบบเต็มของคีย์ที่ใช้เข้ารหัส ฐานข้อมูลที่ป้องกันด้วย 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 Audit Logs
บันทึกการตรวจสอบการเข้าถึงข้อมูลของ Cloud KMS จะแสดงให้คุณเห็นเมื่อ Cloud Firestore หรือผลิตภัณฑ์อื่นๆ ที่กำหนดค่าให้ใช้คีย์ CMEK ทำการเรียกเข้ารหัส/ถอดรหัสไปยัง Cloud KMS Cloud Firestore จะไม่ส่งคำสั่งเรียกเข้ารหัส/ถอดรหัสในทุกคำขอข้อมูล แต่จะใช้ตัวสำรวจที่ตรวจสอบคีย์เป็นระยะๆ แทน ผลการสำรวจจะปรากฏในบันทึกการตรวจสอบ
คุณสามารถตั้งค่าและโต้ตอบกับบันทึกการตรวจสอบได้ในคอนโซล Google Cloud:
ตรวจสอบให้แน่ใจว่ามีการเปิดใช้งานการบันทึกข้อมูลแล้วสำหรับ Cloud KMS API ในโครงการของคุณ
ไปที่ Cloud Logging ในคอนโซล Google Cloud
จำกัดรายการบันทึกให้เฉพาะคีย์ 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โดยมีชื่อคีย์ CMEKKMS_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." } ] } ] } }