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

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

הכנת מפתחות CMEK

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

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

צריך להשלים את השלבים האלה לכל פרויקט שיכיל מסדי נתונים מוגנים באמצעות CMEK.Cloud Firestore אם יוצרים בהמשך מפתח 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:
[email protected]

יצירת מפתח

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

בפרויקט 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.

    מעבר לדף 'מסדי נתונים'

  2. לוחצים על יצירת מסד נתונים.

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

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

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

  6. לוחצים על הצגת אפשרויות ההצפנה ואז בוחרים באפשרות מפתח Cloud KMS.

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

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

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

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

  11. לוחצים על יצירת מסד נתונים.

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

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

gcloud

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

gcloud firestore databases create --location=FIRESTORE_DATABASE_LOCATION \
      --database=DATABASE_ID \
      --kms-key-name=KMS_KEY_NAME \
      --project=FIRESTORE_PROJECT

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

  • FIRESTORE_DATABASE_LOCATION עם המיקום Cloud Firestore של מסד הנתונים
  • DATABASE_ID עם מזהה למסד הנתונים
  • KMS_KEY_NAME בשם שנתתם למפתח. צריך להשתמש בשם המלא של המשאב כמפתח בפורמט הבא:

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

  • FIRESTORE_PROJECT עם הפרויקט שבו רוצים להשתמש במסד הנתונים של Cloud 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, ‏ 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 (שם מפתח KMS) מופיע שם המשאב המלא של המפתח שמשמש להצפנת מסד הנתונים של 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 במזהה הגיבוי

הצגת המפתח שבשימוש

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: שם המשאב המלא של המפתח שמשמש להצפנת מסד הנתונים שמוגן באמצעות 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

לפני שמפעילים את יומני הביקורת Data Access ב-Cloud KMS, כדאי להכיר את Cloud Audit Logs.

יומני ביקורת של גישה לנתונים ב-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: "[email protected]"
    
    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: "[email protected]"
    

למידע נוסף על פירוש יומני ביקורת, אפשר לעיין במאמר הסבר על יומני ביקורת.

הגדרת מדיניות הארגון ל-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."
          }
        ]
      }
    ]
  }
}

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