בדף הזה מוסבר איך לבצע משימות שקשורות למפתחות הצפנה בניהול הלקוח (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.
הפקודה מציגה את מזהה סוכן השירות, שמעוצב כמו כתובת אימייל. שומרים את מחרוזת האימייל שמופיעה בפלט, כי תצטרכו להשתמש בה בשלב מאוחר יותר.
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.
לוחצים על הוספה.
מזינים את המזהה בפורמט של כתובת אימייל של סוכן השירות של 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.
המסוף
נכנסים לדף Databases במסוף Google Cloud.
לוחצים על Create Database.
בוחרים את מצב מסד הנתונים. לוחצים על המשך.
בדף Configure your database, מזינים מזהה של מסד נתונים.
בחר במיקום.
לוחצים על Show Encryption Options ובוחרים באפשרות Cloud KMS key.
בוחרים או מזינים את שם המשאב של מפתח ה-CMEK שבו רוצים להשתמש במסד הנתונים.
רשימת המפתחות מוגבלת לפרויקט Google Cloud הנוכחי ולמיקום מסד הנתונים שבחרתם. כדי להשתמש במפתח מפרויקט אחר ב-Google Cloud, לוחצים על החלפת פרויקט או על הזנת מפתח באופן ידני.
אם מוצגת בקשה לתת הרשאת מפתח לחשבון השירות Cloud Firestore, לוחצים על Grant. כדי ליצור מסד נתונים של CMEK, צריך להקצות לחשבון השירות של Cloud Firestore את התפקיד
cloudkms.cryptoKeyEncrypterDecrypter.בחירת כללי אבטחה ללקוחות בנייד ובאינטרנט.
לוחצים על Create Database.
אחרי שיוצרים את מסד הנתונים, אפשר לוודא שהוא מוגן באמצעות CMEK בקטע Database details:
- אם מסד הנתונים מוגן באמצעות CMEK, בשדה Encryption type מופיע הערך Customer-managed ובשדה Encryption key מופיעים מפתח Cloud KMS המתאים וגרסת המפתח שמשמשת להגנה על מסד הנתונים.
- אם מסד הנתונים לא מוגן באמצעות CMEK, בשדה Encryption type מופיע הערך Google-managed.
gcloud
לפני שיוצרים מסד נתונים עם CMEK באמצעות Google Cloud CLI, צריך להתקין את הגרסה העדכנית ביותר ולתת הרשאה ל-gcloud CLI. למידע נוסף, קראו את המאמר התקנת ה-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עם המיקום Cloud Firestore של מסד הנתונים -
DATABASE_IDעם מזהה של מסד הנתונים
KMS_KEY_NAMEבשם שהקציתם למפתח. צריך להשתמש בשם המלא של המשאב של המפתח, בפורמט הבא:projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID
FIRESTORE_PROJECTעם הפרויקט שבו רוצים להשתמש במסד הנתונים של Cloud Firestore.
API בארכיטקטורת REST
בקשת HTTP:
thought 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 Key Name. אם לא מציינים את הפרמטר --kms-key-name, כברירת מחדל Cloud Firestore יוצר מסד נתונים ללא CMEK.
firebase firestore:databases:create DATABASE_ID
--location LOCATION
--kms-key-name projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID
--project FIRESTORE_PROJECT
מחליפים את מה שכתוב בשדות הבאים:
DATABASE_IDבמזהה של מסד הנתוניםLOCATIONבמיקום של מסד הנתונים-
KMS_PROJECTבפרויקט שמכיל את מפתח ה-CMEK -
KMS_LOCATIONבמיקום שמכיל את מפתח ה-CMEK ואת אוסף המפתחות. -
KMS_KEYRING_IDבמזהה של אוסף מפתחות ה-CMEK -
FIRESTORE_PROJECTעם הפרויקט שבו רוצים להשתמש במסד הנתונים של Cloud Firestore.
כדי לוודא שמסד הנתונים של Cloud Firestore מוגן באמצעות Firebase CLI:
firebase firestore:databases:get DATABASE_ID --project FIRESTORE_PROJECT
המידע הבא על CMEK מופיע בהודעת התשובה:
- בשדה KMS Key Name מופיע השם המלא של משאב המפתח שמשמש להצפנת מסד הנתונים של Cloud 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עם הפרויקט שבו רוצים להשתמש במסד הנתונים של Cloud Firestore. -
DATABASE_IDעם מזהה של מסד הנתונים -
FIRESTORE_DATABASE_LOCATIONעם המיקום Cloud 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עם הפרויקט שבו רוצים להשתמש במסד הנתונים של Cloud Firestore. FIRESTORE_LOCATIONבמיקום של מסד הנתונים של Cloud FirestoreBACKUP_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), מגדירים את הדגל 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
כדי לוודא את הגדרת ה-CMEK של מסד הנתונים, אפשר להשתמש בפקודה databases describe gcloud CLI:
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
לפני שמפעילים את יומני הביקורת של Cloud KMS בנושא גישה לנתונים, חשוב להכיר את יומני הביקורת של Cloud.
ביומני הביקורת של 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בשם של מפתח ה-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 בפרויקט שרוצים להגביל.
מידע נוסף על הגדרת מדיניות הארגון זמין במאמר יצירה ועריכה של כללי מדיניות.
אחרי שהמדיניות נכנסת לתוקף, אם תנסו ליצור מסד נתונים ללא 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 בשירותים שהוגדרו לא יצליחו בלי מפתח 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." } ] } ] } }