שימוש במפתחות הצפנה בניהול הלקוח (CMEK)

בדף הזה מוסבר איך לבצע משימות שקשורות למפתחות הצפנה בניהול הלקוח (CMEK) ב-Cloud Firestore. מידע נוסף על CMEK באופן כללי, כולל מתי ולמה להפעיל אותו, זמין במסמכי התיעוד של Cloud KMS.

הכנת מפתחות CMEK

כדי ליצור מסד נתונים ב-Cloud Firestore שמוגן באמצעות CMEK, צריך לבצע את השלבים הבאים:

  1. מבקשים גישה לתכונה Cloud Firestore CMEK.
  2. יוצרים (או מאחזרים) סוכן שירות של Cloud Firestore.
  3. יוצרים מפתח CMEK.
  4. קובעים את הגדרות ה-IAM של המפתח.

צריך לבצע את השלבים הבאים בכל פרויקט שיכיל מסדי נתונים של Cloud Firestore שמוגנים באמצעות CMEK. אם תיצרו מפתח CMEK חדש, תצטרכו להגדיר את הגדרות ה-IAM למפתח הזה.

אני רוצה לקבל גישה

לפני שיוצרים סוכן שירות של Cloud Firestore, צריך למלא את הטופס הזה כדי לבקש גישה לתכונה CMEK.

יצירת סוכן שירות של Cloud Firestore

לפני שיוצרים מפתח CMEK, צריך שיהיה לכם סוכן שירות של Cloud Firestore. סוכן השירות הוא סוג של חשבון שירות שמנוהל על ידי Google, שבאמצעותו Cloud Firestore ניגש למפתח.

מריצים את הפקודה services identity create כדי ליצור את סוכן השירות שמשמש את Cloud Firestore כדי לגשת למפתח ה-CMEK בשמכם. הפקודה הזו יוצרת את חשבון השירות אם הוא עדיין לא קיים, ואז מציגה אותו.

gcloud beta services identity create \
    --service=firestore.googleapis.com \
    --project FIRESTORE_PROJECT

מחליפים את FIRESTORE_PROJECT בפרויקט שבו רוצים להשתמש למסדי הנתונים של Cloud Firestore.

הפקודה מציגה את מזהה סוכן השירות, שמעוצב כמו כתובת אימייל. שומרים את מחרוזת האימייל שמופיעה בפלט, כי תצטרכו להשתמש בה בשלב מאוחר יותר.

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 שבו רוצים לנהל את המפתחות:

  1. מפעילים את Cloud KMS API.

  2. יוצרים אוסף מפתחות ומפתח באחת מהדרכים הבאות:

קביעת הגדרות IAM למפתח

המסוף

כדי להקצות תפקיד ב-Cloud KMS לסוכן השירות: אם אתם רוצים רמת פירוט נמוכה יותר, אתם יכולים גם להעניק הרשאה ברמת המפתח או אוסף המפתחות.

  1. נכנסים לדף IAM במסוף Google Cloud.

    כניסה לדף IAM

  2. לוחצים על הוספה.

  3. מזינים את המזהה בפורמט של כתובת אימייל של סוכן השירות של Cloud Firestore.

  4. בוחרים את התפקיד Cloud KMS CryptoKey Encrypter/Decrypter.

  5. לוחצים על שמירה.

gcloud

מקצים לסוכן השירות את התפקיד cloudkms.cryptoKeyEncrypterDecrypter:

gcloud kms keys add-iam-policy-binding KMS_KEY \
--keyring KMS_KEYRING\
--location KMS_LOCATION \
--member serviceAccount:SERVICE_AGENT_EMAIL \
--role roles/cloudkms.cryptoKeyEncrypterDecrypter \
--project KMS_PROJECT

מחליפים את מה שכתוב בשדות הבאים:

  • ‫KMS_KEY בשם שהקציתם למפתח
  • ‫KMS_KEYRING עם אוסף מפתחות ה-KMS שמכיל את המפתח
  • ‫KMS_LOCATION עם האזור שבו נמצא אוסף המפתחות
  • ‫SERVICE_AGENT_EMAIL עם המזהה בפורמט אימייל של סוכן השירות שאתם נותנים לו גישה
  • ‫KMS_PROJECT בפרויקט שמכיל את המפתח

בטרמינל אמורה להופיע תגובה שדומה לזו:

Updated IAM policy for key KMS_KEY.
bindings:
- members:
- serviceAccount:
service-{project-number}@gcp-sa-firestore.iam.gserviceaccount.com
role: roles/cloudkms.cryptoKeyEncrypterDecrypter

יצירת מסד נתונים עם CMEK

אחרי שיוצרים ומגדירים את מפתחות ה-CMEK, אפשר ליצור מסד נתונים שמוגן באמצעות CMEK. אי אפשר להמיר מסדי נתונים קיימים של Cloud Firestore שמוגנים באמצעות הצפנת ברירת המחדל של Google, כך שישתמשו ב-CMEK.

אפשר לבחור סוג הצפנה ומפתח רק כשיוצרים מסד נתונים שתומך ב-CMEK.

המסוף

  1. נכנסים לדף Databases במסוף Google Cloud.

    כניסה לדף Databases

  2. לוחצים על Create Database.

  3. בוחרים את מצב מסד הנתונים. לוחצים על המשך.

  4. בדף Configure your database, מזינים מזהה של מסד נתונים.

  5. בחר במיקום.

  6. לוחצים על Show Encryption Options ובוחרים באפשרות Cloud KMS key.

  7. בוחרים או מזינים את שם המשאב של מפתח ה-CMEK שבו רוצים להשתמש במסד הנתונים.

  8. רשימת המפתחות מוגבלת לפרויקט Google Cloud הנוכחי ולמיקום מסד הנתונים שבחרתם. כדי להשתמש במפתח מפרויקט אחר ב-Google Cloud, לוחצים על החלפת פרויקט או על הזנת מפתח באופן ידני.

  9. אם מוצגת בקשה לתת הרשאת מפתח לחשבון השירות Cloud Firestore, לוחצים על Grant. כדי ליצור מסד נתונים של CMEK, צריך להקצות לחשבון השירות של Cloud Firestore את התפקיד cloudkms.cryptoKeyEncrypterDecrypter.

  10. בחירת כללי אבטחה ללקוחות בנייד ובאינטרנט.

  11. לוחצים על 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 Firestore
  • BACKUP_ID במזהה הגיבוי
  • ‫KMS_PROJECT בפרויקט שמכיל את מפתח ה-CMEK
  • ‫KMS_LOCATION במיקום שמכיל את מפתח ה-CMEK ואת אוסף המפתחות.
  • ‫KMS_KEYRING_ID במזהה של אוסף מפתחות ה-CMEK

מוודאים שמסד הנתונים המשוחזר של Cloud Firestore מוצפן באמצעות CMEK:

firebase firestore:databases:get DATABASE_ID --project FIRESTORE_PROJECT

שחזור מסד נתונים שמוגן באמצעות CMEK להצפנה שמוגדרת כברירת מחדל

כדי לשחזר להצפנת ברירת המחדל של Google (ללא CMEK), מגדירים את הדגל encryption-type באופן הבא:

firebase firestore:databases:restore \
--database DATABASE_ID \
--backup 'projects/FIRESTORE_PROJECT/locations/FIRESTORE_LOCATION/backups/BACKUP_ID' \
--encryption-type GOOGLE_DEFAULT_ENCRYPTION \
--project FIRESTORE_PROJECT

מחליפים את מה שכתוב בשדות הבאים:

  • DATABASE_ID במזהה של מסד הנתונים
  • ‫FIRESTORE_PROJECT עם הפרויקט שבו רוצים להשתמש במסד הנתונים של Cloud Firestore.
  • FIRESTORE_LOCATION במיקום של מסד הנתונים של Cloud Firestore
  • BACKUP_ID במזהה הגיבוי

שחזור מסד נתונים שמוגן באמצעות CMEK לאותו סוג הצפנה כמו הגיבוי

כדי לשחזר לאותו סוג הצפנה כמו של הגיבוי, מגדירים את הדגל encryption-type באופן הבא:

firebase firestore:databases:restore \
--database DATABASE_IDD \
--backup 'projects/FIRESTORE_PROJECT/locations/FIRESTORE_LOCATION/backups/BACKUP_ID' \
--encryption-type USE_SOURCE_ENCRYPTION

מחליפים את מה שכתוב בשדות הבאים:

  • DATABASE_ID במזהה של מסד הנתונים
  • ‫FIRESTORE_PROJECT עם הפרויקט שבו רוצים להשתמש במסד הנתונים של Cloud Firestore.
  • FIRESTORE_LOCATION במיקום של מסד הנתונים של Cloud Firestore
  • BACKUP_ID במזהה הגיבוי

שכפול מסד נתונים שמוגן באמצעות CMEK

לפני שמשכפלים מסד נתונים שמוגן באמצעות CMEK:

  • מחליטים אם רוצים לשכפל את מסד הנתונים להצפנת CMEK, להצפנת ברירת המחדל של Google (לא CMEK) או לאותה הצפנה כמו של מסד הנתונים המקורי.
  • מכינים את המפתח (גרסה ראשית) ואת גרסת המפתח שבה השתמשתם כדי להצפין את מסד הנתונים של המקור. מפעילים גם את המפתח וגם את גרסת המפתח.

gcloud

שכפול מסד נתונים שמוגן באמצעות CMEK להצפנת CMEK

כדי לשכפל להצפנת CMEK, מריצים את הפקודה gcloud firestore databases clone עם הדגלים האופציונליים encryption-type ו-kms-key-name כדי להגדיר את סוג ההצפנה של מסד הנתונים המשוכפל. אם לא תציינו את סוג ההצפנה, מסד הנתונים המשוכפל ישתמש באותה הגדרת הצפנה כמו מסד הנתונים המקורי.

gcloud firestore databases clone \
--encryption-type=customer-managed-encryption \
--kms-key-name=KMS_KEY_NAME

מחליפים את KMS_KEY_NAME בשם שהקציתם למפתח. צריך להשתמש בשם המלא של המשאב של המפתח, בפורמט הבא:

projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID

שכפול מסד נתונים שמוגן באמצעות CMEK להצפנה שמוגדרת כברירת מחדל

כדי לשכפל להצפנת ברירת המחדל של Google (לא CMEK), מגדירים את הדגל 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"
    ]
  },
  ……
}

השבתת מפתח

כדי להשבית מפתח שמשויך למסד נתונים:

  1. הצגת גרסאות המפתחות שבשימוש במסד נתונים
  2. משביתים את גרסאות המפתחות שבשימוש.
  3. מחכים שהשינוי ייכנס לתוקף ובודקים אם הנתונים כבר לא נגישים. בדרך כלל השינויים נכנסים לתוקף תוך כמה דקות, אבל לפעמים התהליך נמשך עד 3 שעות.

כשמפתח שמשמש את מסד הנתונים מושבת, צפויה להתקבל חריגה מסוג FAILED_PRECONDITION עם פרטים נוספים בהודעת השגיאה, לדוגמה:

{
  "error": {
    "code": 400,
    "message": "The customer-managed encryption key required by the requested resource is not accessible. Error reason:  generic::permission_denied: Permission 'cloudkms.cryptoKeyVersions.useToEncrypt' denied on resource 'projects/FIRESTORE_PROJECT/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}' (or it may not exist).",
    "status": "FAILED_PRECONDITION",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.DebugInfo",
        "detail": "The customer-managed encryption key required by the requested resource is not accessible. Error reason:  generic::permission_denied: Permission 'cloudkms.cryptoKeyVersions.useToEncrypt' denied on resource 'projects/FIRESTORE_PROJECT/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}' (or it may not exist)"
      }
    ]
  }
}

הפעלת מפתח

כדי להפעיל מחדש מפתח שמשויך למסד נתונים:

  1. הצגת גרסאות המפתחות שנמצאות בשימוש במסד נתונים
  2. הפעלת גרסאות המפתחות שבשימוש
  3. מחכים שהשינוי ייכנס לתוקף ובודקים אם הנתונים כבר לא נגישים. בדרך כלל השינויים נכנסים לתוקף תוך כמה דקות, אבל לפעמים התהליך נמשך עד 3 שעות.

הצגת יומני ביקורת של מפתח Cloud KMS

לפני שמפעילים את יומני הביקורת של Cloud KMS בנושא גישה לנתונים, חשוב להכיר את יומני הביקורת של Cloud.

ביומני הביקורת של Cloud KMS על גישה לנתונים אפשר לראות מתי Cloud Firestore או מוצרים אחרים שמוגדרים לשימוש במפתח CMEK מבצעים קריאות הצפנה או פענוח ל-Cloud KMS. ‫Cloud Firestore לא מנפיק קריאת הצפנה/פענוח בכל בקשת נתונים, אלא מפעיל פולר שבודק את המפתח מדי פעם. תוצאות הסקר מופיעות ביומני הביקורת.

אפשר להגדיר את יומני הביקורת ולבצע בהם פעולות במסוף Google Cloud:

  1. מוודאים שהרישום ביומן מופעל ל-Cloud KMS API בפרויקט.

  2. נכנסים לדף Cloud Logging במסוף Google Cloud.

    מעבר אל Cloud Logging

  3. כדי להגביל את רשומות היומן למפתח Cloud KMS, מוסיפים את השורות הבאות לכלי ליצירת שאילתות:

    resource.type="cloudkms_cryptokey"
    resource.labels.key_ring_id = KMS_KEYRING
    resource.labels.crypto_key_id = KMS_KEY
    resource.labels.location=KMS_LOCATION
    

    מחליפים את מה שכתוב בשדות הבאים:

    • ‫KMS_KEY בשם של מפתח ה-CMEK
    • ‫KMS_KEYRING עם אוסף מפתחות ה-KMS שמכיל את המפתח
    • ‫KMS_LOCATION במיקום של המפתח ואוסף המפתחות

    ביומן מוצגות כמה רשומות בערך כל חמש דקות לכל מסד נתונים. הרשומות ביומן נראות כמו בדוגמאות הבאות:

    Info 2021-03-20 08:02:24.869 EDT Cloudkms.googleapis.com Decrypt projects/cloud-kms-project/locations/us-central1/keyRings/firestore-keys/cryptoKeys/my-cmek-key service-123456789123@gcp-sa-firestore.iam.gserviceaccount.com
    audit_log, method: "Decrypt", principal_email: "service-1234567891011@gcp-sa-firestore.iam.gserviceaccount.com"
    
    Info 2021-03-20 08:02:24.913 EDT Cloudkms.googleapis.com Encrypt projects/cloud-kms-project/locations/us-central1/keyRings/firestore-keys/cryptoKeys/my-cmek-key service-123456789123@gcp-sa-firestore.iam.gserviceaccount.com
    audit_log, method: "Encrypt", principal_email: "service-123456789123@gcp-sa-firestore.iam.gserviceaccount.com"
    

במאמר הסבר על יומני ביקורת מוסבר איך לפרש את יומני הביקורת.

הגדרת מדיניות הארגון ל-CMEK

כדי לציין את דרישות התאימות להצפנה של מסדי נתונים ב-Cloud Firestore בארגון, משתמשים באילוץ של מדיניות הארגון לגבי CMEK.

דרישה להגנה באמצעות CMEK

מגדירים את constraints/gcp.restrictNonCmekServices כך שיידרש CMEK ליצירת מסד נתונים ב-Cloud Firestore. מגדירים את האילוץ לערך deny ומוסיפים את firestore.googleapis.com לרשימת החסימה, לדוגמה:

 gcloud resource-manager org-policies deny gcp.restrictNonCmekServices  is:firestore.googleapis.com --project=FIRESTORE_PROJECT

מחליפים את FIRESTORE_PROJECT בפרויקט שרוצים להגביל.

מידע נוסף על הגדרת מדיניות הארגון זמין במאמר יצירה ועריכה של כללי מדיניות.

אחרי שהמדיניות נכנסת לתוקף, אם תנסו ליצור מסד נתונים ללא 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."
          }
        ]
      }
    ]
  }
}

המאמרים הבאים