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

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

הכנת מפתחות CMEK

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

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

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

בקשת גישה

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

יצירת סוכן שירות של Cloud Firestore עם תאימות ל-MongoDB

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

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

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

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

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

Service identity created:
service-xxx@gcp-sa-firestore.

יצירת מפתח

אתם יכולים להשתמש במפתח שנוצר ישירות ב-Cloud KMS או במפתח שמנוהל באופן חיצוני וזמין באמצעות Cloud External Key Manager.

מיקום המפתח ב-Cloud KMS צריך להיות זהה למיקום של מסד הנתונים של Cloud Firestore עם תאימות ל-MongoDB שבו ישתמשו במפתח.

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

    לדוגמה, אם רוצים ליצור מסד נתונים שמוגן באמצעות CMEK במיקום us-west1, צריך ליצור אוסף מפתחות ומפתח במיקום us-west1.

  • במיקומי מסדי נתונים עם מספר אזורים, צריך להשתמש בשם המיקום של מיקום KMS עם מספר אזורים:

    • משתמשים במיקום עם מספר אזורים ב-Cloud KMS‏ us בשביל מיקום עם מספר אזורים ב-Cloud Firestore עם תאימות ל-MongoDB‏ nam5.

    • משתמשים במיקום עם מספר אזורים ב-Cloud KMS‏ europe בשביל מיקום עם מספר אזורים ב-Cloud Firestore עם תאימות ל-MongoDB‏ eur3.

בפרויקט Google Cloud שבו רוצים לנהל את המפתחות, מבצעים את הפעולות הבאות:

  1. הפעלת Cloud KMS API.

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

הגדרת הגדרות IAM למפתח

המסוף

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

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

    כניסה לדף IAM

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

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

  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.
role: roles/cloudkms.cryptoKeyEncrypterDecrypter

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

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

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

המסוף

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

    לדף Databases

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

  3. מזינים מזהה מסד נתונים.

  4. בוחרים באפשרות Enterprise Edition.

  5. בוחרים מיקום למסד הנתונים.

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

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

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

  9. אם מתבקשים לתת הרשאת מפתח לחשבון השירות של Cloud Firestore עם תאימות ל-MongoDB, לוחצים על Grant (מתן הרשאה). כדי ליצור מסד נתונים עם CMEK, צריך להעניק לחשבון השירות של Cloud Firestore עם תאימות ל-MongoDB את התפקיד 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 \
    --edition=enterprise \
    --kms-key-name=KMS_KEY_NAME \
    --project=FIRESTORE_PROJECT

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

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

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

  • FIRESTORE_PROJECT עם הפרויקט שבו רוצים להשתמש במסד הנתונים של Cloud Firestore עם תאימות ל-MongoDB

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

מוודאים שמסד הנתונים של Cloud Firestore עם תאימות ל-MongoDB ששוחזר מוצפן באמצעות 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 עם תאימות ל-MongoDB
  • FIRESTORE_LOCATION עם המיקום של מסד הנתונים של Cloud Firestore עם תאימות ל-MongoDB
  • BACKUP_ID עם המזהה של הגיבוי

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

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

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

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

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

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

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

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

gcloud

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

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

gcloud alpha 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 alpha firestore databases clone \
--encryption-type=google-default-encryption

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

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

gcloud alpha firestore databases clone \
--encryption-type=use-source-encryption

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

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"

דוגמה לתגובה:

{
  "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 שעות.

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

{
  "error": {
    "code": 400,
    "message": "Failed: (InvalidArgument) The customer-managed encryption key required by the requested resource is not accessible. Error reason: projects/{FIRESTORE_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}/cryptoKeyVersions/1 is not enabled, current state is: DISABLED.",
    "status": "INVALID_ARGUMENT",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.DebugInfo",
        "detail": "Failed: (InvalidArgument) The customer-managed encryption key required by the requested resource is not accessible. Error reason: projects/{FIRESTORE_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}/cryptoKeyVersions/1 is not enabled, current state is: DISABLED."
      }
    ]
  }
}

הפעלת מקש

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

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

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

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

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

אפשר להגדיר את יומני הביקורת ולעבוד איתם במסוף 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.
    audit_log, method: "Decrypt", principal_email: "service-1234567891011@gcp-sa-firestore."
    
    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.
    audit_log, method: "Encrypt", principal_email: "service-123456789123@gcp-sa-firestore."
    

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

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

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

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

מגדירים את constraints/gcp.restrictNonCmekServices כך שיידרש CMEK ליצירת מסד נתונים של Cloud Firestore עם תאימות ל-MongoDB. מגדירים את האילוץ ל-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 עם תאימות ל-MongoDB מאחד המשאבים המותרים.

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

gcloud resource-manager org-policies allow gcp.restrictCmekCryptoKeyProjects \
under:projects/<var>ALLOWED_KEY_PROJECT_ID</var> \
--project=<var>FIRESTORE_PROJECT</var>

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

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