שימוש במפתחות הצפנה בניהול הלקוח (CMEK)
בדף הזה מוסבר איך לבצע משימות שקשורות למפתחות הצפנה בניהול הלקוח (CMEK) ב-Firestore. מידע נוסף על CMEK באופן כללי, כולל מתי ולמה כדאי להפעיל אותו, מופיע במסמכי התיעוד של Cloud KMS.
הכנת מפתחות CMEK
כדי ליצור מסד נתונים של Firestore שמוגן באמצעות CMEK, צריך לבצע את השלבים הבאים:
- בקשת גישה לתכונה CMEK ב-Firestore.
- יצירה (או אחזור) של סוכן שירות של Firestore.
- יצירת מפתח CMEK
- הגדרת הגדרות IAM למפתח הזה.
צריך לבצע את השלבים האלה לכל פרויקט שיכיל מסדי נתונים של Firestore שמוגנים באמצעות CMEK. אם יוצרים מפתח CMEK חדש בשלב מאוחר יותר, צריך להגדיר את הרשאות ה-IAM עבור המפתח הזה.
אני רוצה לקבל גישה
לפני שיוצרים סוכן שירות של Firestore, צריך למלא את הטופס הזה כדי לבקש גישה לתכונה CMEK.
יצירה של סוכן שירות של Firestore
לפני שיוצרים מפתח CMEK, צריך שיהיה לכם סוכן שירות של Firestore. זהו סוג של חשבון שירות שמנוהל על ידי Google, ו-Firestore משתמש בו כדי לגשת למפתח.
מריצים את הפקודה services identity create כדי ליצור את סוכן השירות ש-Firestore משתמש בו כדי לגשת למפתח ה-CMEK בשמכם. הפקודה הזו יוצרת את חשבון השירות אם הוא עדיין לא קיים, ואז מציגה אותו.
gcloud beta services identity create \
--service=firestore.googleapis.com \
--project FIRESTORE_PROJECT
מחליפים את FIRESTORE_PROJECT בפרויקט שבו אתם מתכננים להשתמש במסדי הנתונים של Firestore.
הפקודה מציגה את מזהה סוכן השירות, שמופיע בפורמט של כתובת אימייל. שומרים את מחרוזת האימייל שמופיעה בפלט, כי תצטרכו להשתמש בה בשלב מאוחר יותר.
Service identity created: service-xxx@gcp-sa-firestore.iam.gserviceaccount.com
יצירת מפתח
אתם יכולים להשתמש במפתח שנוצר ישירות ב-Cloud KMS או במפתח שמנוהל באופן חיצוני וזמין באמצעות Cloud External Key Manager.
מיקום המפתח ב-Cloud KMS צריך להיות זהה למיקום של מסד הנתונים של Firestore שבו ישמש המפתח.
במיקומים של מסדי נתונים אזוריים, צריך להשתמש באותו שם מיקום עבור אוסף המפתחות, המפתח ומסד הנתונים, כי יש מיפוי של אחד לאחד בין שמות המיקומים.
לדוגמה, אם רוצים ליצור מסד נתונים שמוגן באמצעות CMEK במיקום
us-west1, צריך ליצור אוסף מפתחות ומפתח במיקוםus-west1.במיקומי מסדי נתונים עם מספר אזורים, משתמשים בשם המיקום של מיקום KMS עם מספר אזורים:
- להשתמש במיקום
usמרובה אזורים ב-Cloud KMS למיקוםnam5מרובה אזורים ב-Firestore. - להשתמש במיקום
europeמרובה אזורים ב-Cloud KMS למיקוםeur3מרובה אזורים ב-Firestore.
- להשתמש במיקום
בפרויקט Google Cloud שבו רוצים לנהל את המפתחות, מבצעים את הפעולות הבאות:
כדי ליצור אוסף מפתחות ומפתח, משתמשים באחת מהאפשרויות הבאות:
- יוצרים את אוסף המפתחות ואת המפתח ישירות ב-Cloud KMS.
- שימוש במפתח שמנוהל חיצונית. יוצרים את המפתח החיצוני ואז יוצרים מפתח Cloud EKM כדי שהמפתח יהיה זמין דרך Cloud KMS.
הגדרת הרשאות IAM למפתח
המסוף
כדי להעניק תפקיד Cloud KMS לסוכן השירות, מבצעים את השלבים הבאים. אפשר גם להעניק הרשאה ברמת המפתח או אוסף המפתחות אם רוצים רמת גרנולריות נמוכה יותר.
נכנסים לדף IAM במסוף Google Cloud .
לוחצים על הוספה.
מזינים את המזהה בפורמט אימייל של סוכן השירות של Firestore.
בוחרים בתפקיד Cloud KMS CryptoKey Encrypter/Decrypter.
לוחצים על Save.
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. אי אפשר להמיר מסדי נתונים קיימים ב-Firestore שמוגנים באמצעות הצפנת ברירת המחדל של Google לשימוש ב-CMEK.
אפשר לבחור סוג הצפנה ומפתח רק כשיוצרים מסד נתונים עם CMEK.
המסוף
נכנסים לדף Databases במסוף Google Cloud .
לוחצים על יצירת מסד נתונים.
בוחרים את מצב מסד הנתונים. לוחצים על Continue.
בדף Configure your database, מזינים מזהה של מסד נתונים.
בוחרים מיקום.
לוחצים על הצגת אפשרויות ההצפנה ואז בוחרים באפשרות מפתח Cloud KMS.
בוחרים או מזינים את שם המשאב של מפתח ה-CMEK שרוצים להשתמש בו עבור מסד הנתונים.
רשימת המפתחות מוגבלת לפרויקט הנוכחי Google Cloud ולמיקום של מסד הנתונים שבחרתם. כדי להשתמש במפתח מפרויקט אחר של Google Cloud Google Cloud, לוחצים על Switch Project (החלפת פרויקט) או על Enter Key Manually (הזנת מפתח באופן ידני).
אם מתבקשים לתת הרשאת מפתח לחשבון השירות של Firestore, לוחצים על Grant (מתן הרשאה). כדי ליצור מסד נתונים עם CMEK, צריך להקצות לחשבון השירות של Firestore את התפקיד
cloudkms.cryptoKeyEncrypterDecrypter.בוחרים כללי אבטחה ללקוחות ניידים וללקוחות אינטרנט.
לוחצים על יצירת מסד נתונים.
אחרי שיוצרים את מסד הנתונים, אפשר לוודא ש-CMEK מופעל במסד הנתונים על ידי הצגת פרטי מסד הנתונים:
- אם מסד הנתונים מוגן על ידי CMEK, בשדה סוג ההצפנה מופיעה האפשרות בניהול הלקוח, ובשדה מפתח ההצפנה מופיעים Cloud KMS המתאים וגרסת המפתח שמשמשת להגנה על מסד הנתונים הזה.
- אם מסד הנתונים שלכם לא מוגן באמצעות CMEK, בשדה סוג ההצפנה יופיע הערך בניהול Google.
gcloud
לפני שיוצרים מסד נתונים עם הצפנה באמצעות CMEK באמצעות Google Cloud CLI, צריך להתקין את הגרסה העדכנית ביותר ולאשר את ה-CLI של gcloud. למידע נוסף, אפשר לעיין במאמר בנושא התקנת ה-CLI של gcloud.
gcloud firestore databases create --location=FIRESTORE_DATABASE_LOCATION \
--database=DATABASE_ID \
--kms-key-name=KMS_KEY_NAME \
--project=FIRESTORE_PROJECT
מחליפים את מה שכתוב בשדות הבאים:
-
FIRESTORE_DATABASE_LOCATIONעם המיקום של מסד הנתונים ב-Firestore -
DATABASE_IDעם מזהה למסד הנתונים
KMS_KEY_NAMEעם השם שהקציתם למפתח. משתמשים בשם המלא של המשאב עבור המפתח בפורמט הבא:projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID
FIRESTORE_PROJECTעם הפרויקט שבו רוצים להשתמש במסד הנתונים של Firestore
API בארכיטקטורת REST
בקשת 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, 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עם הפרויקט שבו רוצים להשתמש במסד הנתונים של Firestore
כדי לוודא שמסד הנתונים שלכם ב-Firestore מוגן באמצעות Firebase CLI:
firebase firestore:databases:get DATABASE_ID --project FIRESTORE_PROJECT
הפרטים הבאים לגבי CMEK מופיעים בהודעת התגובה:
- בשדה KMS Key Name (שם מפתח KMS) מופיע שם מקום האחסון המלא של המפתח שמשמש להצפנה של מסד הנתונים של Firestore CMEK.
- בשדה Active 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עם הפרויקט שבו רוצים להשתמש במסד הנתונים של Firestore -
DATABASE_IDעם מזהה למסד הנתונים -
FIRESTORE_DATABASE_LOCATIONעם המיקום של מסד הנתונים ב-Firestore -
DATABASE_TYPEעםFIRESTORE_NATIVEלמצב 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עם הפרויקט שבו רוצים להשתמש במסד הנתונים של Firestore -
FIRESTORE_LOCATIONעם המיקום של מסד הנתונים שלכם ב-Firestore -
BACKUP_IDעם המזהה של הגיבוי KMS_PROJECTעם הפרויקט שמכיל את מפתח ה-CMEK-
KMS_LOCATIONבמיקום שמכיל את מפתח ה-CMEK ואת אוסף המפתחות -
KMS_KEYRING_IDבמזהה של מחזיק מפתחות ה-CMEK
מוודאים שמסד הנתונים של 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עם הפרויקט שבו רוצים להשתמש במסד הנתונים של Firestore -
FIRESTORE_LOCATIONעם המיקום של מסד הנתונים שלכם ב-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עם הפרויקט שבו רוצים להשתמש במסד הנתונים של Firestore -
FIRESTORE_LOCATIONעם המיקום של מסד הנתונים שלכם ב-Firestore -
BACKUP_IDעם המזהה של הגיבוי
שכפול מסד נתונים שמוגן באמצעות CMEK
לפני שמשכפלים מסד נתונים שמוגן באמצעות CMEK:
- מחליטים אם רוצים לשכפל את מסד הנתונים להצפנה באמצעות CMEK, להצפנה שמוגדרת כברירת מחדל ב-Google (לא CMEK) או לאותה הצפנה כמו במסד הנתונים של המקור.
מכינים את המפתח (הגרסה הראשית) ואת גרסת המפתח שבה השתמשתם להצפנת מסד הנתונים של המקור. מפעילים גם את המפתח וגם את גרסת המפתח.
gcloud
שיבוט מסד נתונים שמוגן באמצעות CMEK להצפנת CMEK
כדי לשכפל להצפנת CMEK, מריצים את הפקודה gcloud firestore databases clone עם הדגלים האופציונליים encryption-type ו-kms-key-name כדי להגדיר את סוג ההצפנה למסד הנתונים המשוכפל. אם לא מציינים את סוג ההצפנה, מסד הנתונים המשוכפל ישתמש באותה הגדרת הצפנה כמו מסד הנתונים המקורי.
gcloud firestore databases clone \
--encryption-type=customer-managed-encryption \
--kms-key-name=KMS_KEY_NAME
מחליפים את KMS_KEY_NAME בשם שהקציתם למפתח. משתמשים בשם המלא של המשאב כמפתח בפורמט הבא:
projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID
שיבוט מסד נתונים שמוגן באמצעות CMEK להצפנה שמוגדרת כברירת מחדל
כדי לשכפל לההצפנה שמוגדרת כברירת מחדל ב-Google (לא CMEK), מגדירים את הדגל encryption-type באופן הבא:
gcloud firestore databases clone \
--encryption-type=google-default-encryption
שיבוט מסד נתונים שמוגן באמצעות CMEK לאותו סוג הצפנה כמו מסד הנתונים המקורי
כדי לשכפל לאותו סוג הצפנה כמו במסד הנתונים המקורי, מגדירים את האפשרות encryption-type באופן הבא:
gcloud firestore databases clone \
--encryption-type=use-source-encryption
זו גם התנהגות ברירת המחדל אם לא צוין --encryption-type.
Firebase CLI
שיבוט מסד נתונים שמוגן באמצעות CMEK להצפנת CMEK
כדי לשכפל להצפנת CMEK, מריצים את הפקודה firebase firestore:databases:clone עם האפשרויות encryption-type ו-kms-key-name כדי להגדיר את סוג ההצפנה למסד הנתונים המשוכפל. אם לא מציינים את סוג ההצפנה, מסד הנתונים המשוכפל ישתמש באותה הגדרת הצפנה כמו מסד הנתונים המקורי.
firebase firestore:databases:clone \
SOURCE_DATABASE \
DESTINATION_DATABASE \
--encryption-type=CUSTOMER_MANAGED_ENCRYPTION \
--kms-key-name=KMS_KEY_NAME
מחליפים את KMS_KEY_NAME בשם שהקציתם למפתח. משתמשים בשם המלא של המשאב כמפתח בפורמט הבא:
projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID
שיבוט מסד נתונים שמוגן באמצעות CMEK להצפנה שמוגדרת כברירת מחדל
כדי לשכפל לההצפנה שמוגדרת כברירת מחדל ב-Google (לא CMEK), מגדירים את הדגל encryption-type באופן הבא:
firebase firestore:databases:clone \
SOURCE_DATABASE \
DESTINATION_DATABASE \
--encryption-type=GOOGLE_DEFAULT_ENCRYPTION
שיבוט מסד נתונים שמוגן באמצעות CMEK לאותו סוג הצפנה כמו מסד הנתונים המקורי
כדי לשכפל לאותו סוג הצפנה כמו במסד הנתונים המקורי, מגדירים את האפשרות encryption-type באופן הבא:
firebase firestore:databases:clone \
SOURCE_DATABASE \
DESTINATION_DATABASE \
--encryption-type=USE_SOURCE_ENCRYPTION
זו גם התנהגות ברירת המחדל אם לא צוין --encryption-type.
הצגת המפתח שבשימוש
gcloud
כדי לוודא שהגדרתם את ה-CMEK במסד הנתונים, אתם יכולים להשתמש בפקודה databases describe ב-CLI של gcloud:
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.
API בארכיטקטורת REST
בקשת 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
לפני שמפעילים את יומני הביקורת Data Access ב-Cloud KMS, כדאי להכיר את Cloud Audit Logs.
יומני ביקורת של גישה לנתונים ב-Cloud KMS מראים מתי Firestore או מוצרים אחרים שהוגדרו לשימוש במפתח CMEK שלכם מבצעים קריאות להצפנה או לפענוח ב-Cloud KMS. 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מחליפים בשם של מפתח ה-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
כדי לציין דרישות תאימות להצפנה במסדי נתונים של Firestore בארגון, משתמשים באילוץ של מדיניות הארגון ל-CMEK.
דרישה להגנה באמצעות CMEK
מגדירים את constraints/gcp.restrictNonCmekServices כך שיידרש CMEK ליצירת מסד נתונים של Firestore. מגדירים את האילוץ ל-deny ומוסיפים את firestore.googleapis.com לרשימת הדחייה, לדוגמה:
gcloud resource-manager org-policies deny gcp.restrictNonCmekServices is:firestore.googleapis.com --project=FIRESTORE_PROJECT
מחליפים את FIRESTORE_PROJECT בפרויקט שרוצים להגביל.
מידע נוסף על הגדרת מדיניות הארגון זמין במאמר יצירה ועריכה של כללי מדיניות.
אחרי שהמדיניות תיכנס לתוקף, אם תנסו ליצור מסד נתונים ללא CMEK בפרויקט המושפע, תקבלו חריגה FAILED_PRECONDITION והודעת שגיאה. לדוגמה, חריגה נראית כך:
{ "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). כדי להשתמש באילוץ הזה, צריך להגדיר רשימה של מחווני היררכיית משאבים ולהגדיר את האילוץ ל-Allow.
ההגדרה הזו מגבילה את השירותים הנתמכים כך שאפשר לבחור מפתחות CMEK רק מתוך הפרויקטים, התיקיות והארגונים שמופיעים ברשימה. בקשות ליצירת משאבים שמוגנים באמצעות CMEK בשירותים מוגדרים לא יצליחו ללא מפתח 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." } ] } ] } }