הצפנת סודות בשכבת האפליקציה

במדריך הזה נסביר איך להצפין סודות של Kubernetes בשכבת האפליקציה באמצעות מפתח שמנוהל ב-Cloud Key Management Service ‏(Cloud KMS). תהליך ההצפנה של סודות מספק שכבת אבטחה נוספת לעומסי עבודה רגישים.

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

לפני שקוראים את הדף הזה, חשוב לוודא שמכירים את המושגים הבאים:


לחצו על תראו לי איך כדי לקרוא הסבר מפורט על המשימה ישירות במסוף Google Cloud :

תראו לי איך


סקירה כללית

כברירת מחדל, ‏ Google Kubernetes Engine ‏ (GKE) מצפין תוכן של לקוחות שמאוחסן במצב מנוחה, כולל סודות. ‫GKE מטפל בהצפנה הזו של ברירת המחדל ומנהל אותה בשבילכם, בלי שתצטרכו לבצע פעולות נוספות. הצפנה של סודות בשכבת האפליקציה מספקת שכבת אבטחה נוספת למידע אישי רגיש שמאוחסן במסד הנתונים של מצב האשכול. כשמפעילים את ההצפנה, משתמשים במפתח שמנוהל באמצעות Cloud KMS כדי להצפין את הנתונים בשכבת האפליקציה.

ב-GKE בגרסה 1.35 ואילך, משאבי Kubernetes הספציפיים שמוצפנים תלויים בחנות המפתחות והערכים שמארחת את מצב האשכול, באופן הבא:

  • ‫Spanner: הצפנת סודות בשכבת האפליקציה מצפינה את כל האובייקטים של Kubernetes API.
  • ‫etcd: הצפנת סודות בשכבת האפליקציה מצפינה בעיקר סודות.

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

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

הצפנת מעטפות

ב-Kubernetes יש הצפנת מעטפת של Secrets באמצעות ספק KMS. כלומר, נעשה שימוש במפתח מקומי, שבדרך כלל נקרא מפתח להצפנת נתונים (DEK), כדי להצפין את ה-Secrets. מפתח ה-DEK עצמו מוצפן באמצעות מפתח אחר שנקרא מפתח להצפנת מפתחות הצפנה (KEK). מפתח ה-KEK לא מאוחסן ב-Kubernetes.

להצפנת מעטפות יש את היתרונות הבאים:

  • ביצועים משופרים בהשוואה להצפנה באמצעות מפתח ציבורי:‏ GKE משתמש רק ב-Cloud KMS API כדי להצפין מפתחות DEK חדשים באמצעות KEK או כדי לפענח DEK כשהמטמון המקומי ריק.
  • ניהול טוב יותר של מפתחות בהיקף גדול: מפתח KEK יחיד יכול להצפין כמה מפתחות DEK. מספר המפתחות שצריך לאחסן בשירות Cloud KMS קטן בהרבה ממספר המפתחות שמצפינים את הנתונים שלכם.
  • אפשרות להשתמש בשורש מרכזי של אמון: סודות שמאוחסנים ב-Kubernetes יכולים להסתמך על שורש חיצוני של אמון. כלומר, אתם יכולים להשתמש ב-Root of Trust מרכזי, למשל מודול אבטחה לחומרה, לכל הסודות שלכם. לגורם עוין שיש לו גישה למאגרי התגים שלכם במצב אופליין אין אפשרות להשיג את הסודות שלכם.

בעזרת הצפנת סודות בשכבת האפליקציה ב-GKE, ‏ GKE מצפין את הסודות באמצעות מפתחות הצפנה מקומיים וספק AES-CBC. ‫GKE מצפין את מפתחות ה-DEK באמצעות מפתח KEK שמנוהל ב-Cloud KMS.

מידע נוסף על הצפנת מעטפות

מה קורה כשהנתונים מוצפנים

כשיוצרים משאב חדש ב-Kubernetes שעומד בדרישות להצפנה, קורה הדבר הבא:

  1. ‫GKE יוצר מפתח DEK באמצעות מחולל מספרים אקראי.

  2. ‫GKE מצפין את הנתונים באופן מקומי במישור הבקרה באמצעות מפתח ה-DEK הזה.

  3. ‫GKE שולח את ה-DEK ל-Cloud KMS להצפנה. בפעולה הזו נעשה שימוש ב-Kubernetes Engine Service Agent של הפרויקט כדי לבצע אימות ל-Cloud KMS.

  4. ‫Cloud KMS מצפין את ה-DEK באמצעות ה-KEK ושולח אותו בחזרה למישור הבקרה של GKE.

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

כשלקוח מבקש נתונים משרת ה-API של Kubernetes, התהליך הבא מתרחש:

  1. מישור הבקרה של GKE מאחזר את הנתונים המוצפנים ממסד הנתונים של מצב האשכול.

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

  3. אם מפתח ה-DEK לא נמצא במטמון, ‏ GKE שולח את מפתח ה-DEK המוצפן אל Cloud KMS כדי לפענח אותו באמצעות מפתח ה-KEK.

  4. ‫GKE מקבל את ה-DEK המפוענח מ-Cloud KMS ומשתמש ב-DEK כדי לפענח את הנתונים.

  5. שרת ה-API של Kubernetes מחזיר את הנתונים המפוענחים ללקוח.

מה קורה כשמשמידים מפתח

אם אתם מתכננים להשמיד גרסה ישנה של KEK אחרי רוטציית מפתחות, ודאו שהנתונים באשכול מוגנים על ידי הגרסה החדשה של KEK. התהליך תלוי בהיקף ההצפנה של האשכול (אימות היקף ההצפנה).

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

אלא אם אתם משתמשים בהקרנת נפח של אסימונים של חשבון שירות, חשבונות שירות שמשמשים את עומסי העבודה שלכם ב-GKE משתמשים גם ב-Secrets, ואם מפתח מושמד, הם לא זמינים יותר. אם לא תהיה גישה למשאבים האלה, עומסי העבודה ייכשלו.

יש יוצאים מן הכלל:

  • ל-Pods עם גישה קיימת ל-Secrets כנפחים מוצמדים או כמשתני סביבה תהיה גישה.

  • אחרי שמשמידים את ה-KEK, מישור הבקרה של GKE עדיין יכול להשתמש בערכי מיפוי של DEK שנשמרו במטמון כדי לפענח נתונים. כך פודים שהופעלו מחדש או שנקבע להם מועד חדש יוכלו לגשת לנתונים, אלא אם יקרה אחד מהמקרים הבאים:

    • מישור הבקרה של האשכול מופעל מחדש.
    • ה-Pod של מישור הבקרה של GKE מופעל מחדש.
    • מפתח ה-DEK לא נמצא במטמון של מישור הבקרה של GKE.

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

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

לפני שמתחילים

  • כדי לבצע את התרגילים בנושא הזה, אתם צריכים שני Google Cloud פרויקטים:

    • פרויקט המפתח: כאן יוצרים מפתח להצפנת מפתחות הצפנה (KEK).

    • פרויקט אשכול: כאן יוצרים אשכול שמאפשר הצפנה של סודות בשכבת האפליקציה.

    אתם יכולים להשתמש באותו פרויקט גם לפרויקט המרכזי וגם לפרויקט האשכול. אבל השיטה המומלצת היא להשתמש בפרויקטים נפרדים.

  • בפרויקט המפתח, מוודאים שהפעלתם את Cloud KMS API.

    הפעלת Cloud KMS API

  • בפרויקט המפתח, המשתמש שיוצר את אוסף המפתחות והמפתח צריך את ההרשאות הבאות ב-IAM:

    • cloudkms.keyRings.getIamPolicy
    • cloudkms.keyRings.setIamPolicy

    ההרשאות האלה (ועוד רבות אחרות) מוענקות לroles/cloudkms.admin תפקיד המוגדר מראש בניהול זהויות והרשאות גישה. מידע נוסף על הענקת הרשאות לניהול מפתחות זמין במסמכי התיעוד של Cloud KMS.

  • בפרויקט של האשכול, מוודאים שהפעלתם את Google Kubernetes Engine API.

    הפעלת Google Kubernetes Engine API

  • מוודאים שהתקנתם את Google Cloud CLI.

  • עדכון gcloud לגרסה האחרונה:

    gcloud components update

יצירת מפתח Cloud KMS

כדי ליצור מפתח Cloud KMS, קודם צריך ליצור אוסף מפתחות. מפתחות ואוספי מפתחות הם משאבים אזוריים. כשיוצרים אוסף מפתחות, מציינים מיקום שתואם למיקום של אשכול GKE:

  • אשכול אזורי צריך להשתמש במחזיק מפתחות מאזור על. לדוגמה, קלאסטר באזור us-central1-a יכול להשתמש רק במפתח באזור us-central1.

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

אי אפשר להשתמש באזור global של Cloud KMS עם GKE.

אפשר להשתמש ב-CLI של gcloud או במסוף Google Cloud .

המסוף

בפרויקט המפתח, יוצרים אוסף מפתחות:

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

    כניסה אל Key Management

  2. לוחצים על Create key ring (יצירת מחזיק מפתחות).

  3. בשדה Key ring name (שם אוסף המפתחות), מזינים את השם של אוסף המפתחות.

  4. ברשימה Location, בוחרים את המיקום של אשכול Kubernetes.

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

לאחר מכן, יוצרים מפתח:

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

    כניסה אל Key Management

  2. לוחצים על השם של אוסף המפתחות שעבורו רוצים ליצור מפתח.

  3. לוחצים על Create key.

  4. בשדה שם המפתח, מזינים את השם של המפתח.

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

  6. [אופציונלי] בשדה תוויות, לוחצים על הוספת תווית אם רוצים להוסיף תוויות למפתח.

  7. לוחצים על יצירה.

gcloud

בפרויקט המפתח, יוצרים אוסף מפתחות:

gcloud kms keyrings create RING_NAME \
    --location=LOCATION \
    --project=KEY_PROJECT_ID

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

  • ‫RING_NAME: השם של אוסף המפתחות החדש.
  • ‫LOCATION: המיקום שבו רוצים ליצור את מחזיק המפתחות.
  • ‫KEY_PROJECT_ID: מזהה הפרויקט של המפתח.

יוצרים מפתח:

gcloud kms keys create KEY_NAME \
    --location=LOCATION \
    --keyring=RING_NAME \
    --purpose=encryption \
    --project=KEY_PROJECT_ID

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

  • ‫KEY_NAME: השם של המפתח החדש.
  • ‫LOCATION: המיקום ב-Cloud KMS שבו יצרתם את אוסף המפתחות.
  • ‫RING_NAME: השם של אוסף המפתחות.
  • ‫KEY_PROJECT_ID: מזהה הפרויקט של המפתח.

מתן הרשאה לשימוש במפתח

לסוכן השירות של Kubernetes Engine בפרויקט האשכול יש את השם הבא:

service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com

מחליפים את CLUSTER_PROJECT_NUMBER במספר הפרויקט של האשכול. כדי למצוא את מספר הפרויקט באמצעות ה-CLI של gcloud, מריצים את הפקודה הבאה:

gcloud projects describe CLUSTER_PROJECT_ID \
    --format="value(projectNumber)"

כדי להעניק גישה לסוכן השירות של Kubernetes Engine, אפשר להשתמש במסוף Google Cloud או ב-CLI של gcloud.

המסוף

נותנים לסוכן השירות של Kubernetes Engine את התפקיד CryptoKey Encrypter/Decrypter ב-Cloud KMS:

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

    מעבר אל 'ניהול מפתחות'

  2. לוחצים על השם של אוסף המפתחות המכיל את המפתח הרצוי.

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

    הכרטיסייה Permissions מופיעה בחלונית הימנית.

  4. בתיבת הדו-שיח Add members, מציינים את כתובת האימייל של Kubernetes Engine Service Agent שרוצים להעניק לו גישה.

  5. בתפריט הנפתח Select a role, בוחרים Cloud KMS CryptoKey Encrypter/Decrypter.

  6. לוחצים על Save.

gcloud

נותנים לסוכן השירות של Kubernetes Engine את התפקיד CryptoKey Encrypter/Decrypter ב-Cloud KMS:

gcloud kms keys add-iam-policy-binding KEY_NAME \
    --location=LOCATION \
    --keyring=RING_NAME \
    --member=serviceAccount:SERVICE_ACCOUNT_NAME \
    --role=roles/cloudkms.cryptoKeyEncrypterDecrypter \
    --project=KEY_PROJECT_ID

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

  • ‫KEY_NAME: שם המפתח.
  • ‫LOCATION: המיקום ב-Cloud KMS שבו יצרתם את אוסף המפתחות.
  • ‫RING_NAME: השם של אוסף המפתחות.
  • ‫SERVICE_ACCOUNT_NAME: השם של Kubernetes Engine Service Agent.
  • ‫KEY_PROJECT_ID: מזהה הפרויקט של המפתח.

אם המפתח הוא מפתח Cloud HSM, מוודאים שיש לו מספיק מכסה.

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

הפעלת הצפנה של סודות בשכבת האפליקציה

אתם יכולים להפעיל הצפנה של סודות בשכבת האפליקציה באשכולות חדשים או קיימים של GKE Standard ו-GKE Autopilot באמצעות ה-CLI של gcloud או מסוף Google Cloud .

שיטה מומלצת:

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

הפעלה באשכול חדש

אפשר ליצור אשכול חדש עם הצפנה של סודות בשכבת האפליקציה באמצעותGoogle Cloud המסוף או ה-CLI של gcloud.

Console - Autopilot

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

  1. נכנסים לדף Create an Autopilot cluster במסוף Google Cloud .

    כניסה לדף Create an Autopilot cluster

  2. מגדירים את האשכול לפי הצורך.

  3. בחלונית הניווט, לוחצים על הגדרות מתקדמות ומרחיבים את הקטע אבטחה.

  4. מסמנים את התיבה Encrypt secrets at the application layer (הצפנת סודות בשכבת האפליקציה) ובוחרים את המפתח שיצרתם בשלב יצירת מפתח Cloud KMS.

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

Console - Standard

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

  1. נכנסים לדף Create a Kubernetes cluster במסוף Google Cloud .

    מעבר אל יצירת אשכול Kubernetes

  2. מגדירים את האשכול לפי הצורך.

  3. בחלונית הניווט, בקטע Cluster, לוחצים על Security.

  4. מסמנים את התיבה Encrypt secrets at the application layer (הצפנת סודות בשכבת האפליקציה) ובוחרים את המפתח שיצרתם בשלב יצירת מפתח Cloud KMS.

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

gcloud

כדי ליצור אשכול שתומך בהצפנת סודות בשכבת האפליקציה, צריך לציין ערך לפרמטר --database-encryption-key בפקודת היצירה.

gcloud container clusters create-auto CLUSTER_NAME \
    --cluster-version=latest \
    --location=CONTROL_PLANE_LOCATION \
    --database-encryption-key=projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME \
    --project=CLUSTER_PROJECT_ID

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

  • ‫CLUSTER_NAME: השם שבחרתם לאשכול החדש.
  • ‫CONTROL_PLANE_LOCATION: האזור של Compute Engine במישור הבקרה של האשכול.
  • ‫KEY_PROJECT_ID: מזהה הפרויקט של המפתח.
  • ‫LOCATION: המיקום ב-Cloud KMS שבו יצרתם את אוסף המפתחות.
  • ‫RING_NAME: השם של אוסף המפתחות.
  • ‫KEY_NAME: שם המפתח.
  • ‫CLUSTER_PROJECT_ID: מזהה הפרויקט של האשכול.

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

הפעלה באשכול קיים

אפשר להשתמש ב-CLI של gcloud או במסוף Google Cloud כדי לעדכן אשכול קיים כך שישתמש בהצפנת סודות בשכבת האפליקציה. ‫GKE מצפין את כל הסודות הקיימים והחדשים באמצעות מפתח ההצפנה שציינתם.

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

המסוף

כדי לעדכן אשכול לתמיכה בהצפנת סודות בשכבת האפליקציה:

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

    מעבר אל Google Kubernetes Engine

  2. לוחצים על השם של האשכול שרוצים לשנות.

  3. בקטע אבטחה, בשדה הצפנת סודות בשכבת האפליקציה, לוחצים על עריכת הצפנת סודות בשכבת האפליקציה.

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

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

gcloud

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

gcloud container clusters update CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --database-encryption-key=projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME \
    --project=CLUSTER_PROJECT_ID

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

  • ‫CLUSTER_NAME: השם של האשכול.
  • ‫CONTROL_PLANE_LOCATION: המיקום של מישור הבקרה של האשכול ב-Compute Engine. מציינים אזור לאשכולות אזוריים או אזור זמין לאשכולות אזוריים.
  • ‫KEY_PROJECT_ID: מזהה הפרויקט של המפתח.
  • ‫LOCATION: המיקום ב-Cloud KMS שבו יצרתם את אוסף המפתחות.
  • ‫RING_NAME: השם של אוסף המפתחות.
  • ‫KEY_NAME: שם המפתח.
  • ‫CLUSTER_PROJECT_ID: מזהה הפרויקט של האשכול.

עדכון מפתח Cloud KMS

אפשר להשתמש ב-CLI של gcloud או במסוף Google Cloud כדי לעדכן אשכול קיים כך שישתמש במפתח חדש של Cloud KMS.

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

המסוף

כדי לעדכן אשכול לשימוש במפתח חדש של Cloud KMS:

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

    מעבר אל Google Kubernetes Engine

  2. לוחצים על השם של האשכול שרוצים לשנות.

  3. בקטע אבטחה, בשדה הצפנת סודות בשכבת האפליקציה, לוחצים על עריכת הצפנת סודות בשכבת האפליקציה.

  4. בוחרים את מפתח ההצפנה החדש שרוצים להשתמש בו.

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

gcloud

כדי לעדכן את האשכול הקיים כך שישתמש במפתח חדש של Cloud KMS:

gcloud container clusters update CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --database-encryption-key=projects/KEY_PROJECT_ID/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME \
    --project=CLUSTER_PROJECT_ID

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

  • ‫CLUSTER_NAME: השם של האשכול.
  • ‫CONTROL_PLANE_LOCATION: המיקום של מישור הבקרה של האשכול ב-Compute Engine. מציינים אזור לאשכולות אזוריים או אזור זמין לאשכולות אזוריים.
  • ‫KEY_PROJECT_ID: מזהה הפרויקט של המפתח.
  • ‫LOCATION: המיקום ב-Cloud KMS שבו יצרתם את אוסף המפתחות.
  • ‫RING_NAME: השם של אוסף המפתחות.
  • ‫KEY_NAME: שם המפתח.
  • ‫CLUSTER_PROJECT_ID: מזהה הפרויקט של האשכול.

השבתת הצפנת סודות בשכבת האפליקציה

כדי להשבית את ההצפנה של סודות בשכבת האפליקציה, אפשר להשתמש ב-CLI של gcloud או במסוףGoogle Cloud .

המסוף

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

    מעבר אל Google Kubernetes Engine

  2. לוחצים על השם של האשכול שרוצים לשנות.

  3. בקטע אבטחה, בשדה הצפנת סודות בשכבת האפליקציה, לוחצים על עריכת הצפנת סודות בשכבת האפליקציה.

  4. מבטלים את הסימון בתיבה Enable Application-layer secrets encryption (הפעלת הצפנת סודות בשכבת האפליקציה).

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

gcloud

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

gcloud container clusters update CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --disable-database-encryption \
    --project=CLUSTER_PROJECT_ID

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

  • ‫CLUSTER_NAME: השם של האשכול.
  • ‫CONTROL_PLANE_LOCATION: המיקום של מישור הבקרה של האשכול ב-Compute Engine. מציינים אזור לאשכולות אזוריים או אזור זמין לאשכולות אזוריים.
  • ‫CLUSTER_PROJECT_ID: מזהה הפרויקט של האשכול.

אימות שההצפנה של סודות בשכבת האפליקציה מופעלת

אפשר לבדוק אם נעשה שימוש בהצפנת סודות בשכבת האפליקציה באשכול באמצעות מסוףGoogle Cloud או ה-CLI של gcloud.

המסוף

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

    מעבר אל Google Kubernetes Engine

  2. לוחצים על שם האשכול שרוצים לבדוק.

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

    • מופעל (כל האובייקטים): כל האובייקטים של Kubernetes API במסד הנתונים של מצב האשכול מוצפנים.
    • מופעל: רק סודות מוצפנים.

gcloud

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

gcloud container clusters describe CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --format='value(databaseEncryption.state)' \
    --project=CLUSTER_PROJECT_ID

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

  • ‫CLUSTER_NAME: השם של האשכול.
  • ‫CONTROL_PLANE_LOCATION: המיקום של מישור הבקרה של האשכול ב-Compute Engine. מציינים אזור לאשכולות אזוריים או אזור זמין לאשכולות אזוריים.
  • ‫CLUSTER_PROJECT_ID: מזהה הפרויקט של האשכול.

הפלט מציין אילו אובייקטים מוצפנים, באופן הבא:

  • ‫ALL_OBJECTS_ENCRYPTION_ENABLED: כל האובייקטים של Kubernetes API במסד הנתונים של מצב האשכול מוצפנים.
  • ‫ENCRYPTED: רק סודות מוצפנים.

אם הפלט הוא DECRYPTED, ההצפנה של סודות בשכבת האפליקציה מושבתת.

רוטציה של המפתחות

שיטה מומלצת:

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

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

לדוגמה, יוצרים Secret ומאחסנים אותו, Secret1. הוא מוצפן באמצעות DEK1, שמוצפן בעצמו באמצעות KEKv1.

אחרי שמבצעים רוטציה למפתח ה-KEK, מצפינים מחדש את Secret1 כך שהוא יהיה ארוז על ידי DEK2, שבתורו ארוז על ידי KEKv2, מפתח ה-KEK שעבר רוטציה.

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

הצפנה מחדש של הסודות

אחרי שמבצעים רוטציה למפתח, צריך להצפין מחדש את הסודות כדי לעטוף אותם בגרסה החדשה של מפתח הצפנת המפתח (KEK). אפשר להצפין מחדש את הסודות באחת מהדרכים הבאות:

  • באופן ידני, על ידי הרצת הפקודה kubectl בטרמינל.
  • באופן אוטומטי, באמצעות עומס עבודה חוזר, כמו CronJob, כדי להריץ פקודה kubectl במרווחי זמן קבועים.

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

kubectl get secrets --namespace=NAMESPACE -o json \
    | kubectl annotate --overwrite -f - encryption-key-rotation-time="TIME"

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

  • ‫NAMESPACE: מרחב השמות שבו רוצים לעדכן את הסודות. באשכולות רגילים, אפשר להשתמש בדגל --all-namespaces במקום זאת כדי לעדכן כל סוד באשכול באמצעות אותה פקודה. ב-Autopilot clusters, אפשר לעדכן רק את מרחבי השמות שבבעלותכם.
  • ‫TIME: מחרוזת שמציינת מתי מתבצעת הרוטציה (לדוגמה, 20200909-090909).

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

מגבלות

  • ‫GKE תומך בהצפנה של סודות בשכבת האפליקציה, עם עד 30,000 סודות לכל אשכול. אם מאחסנים יותר מ-30,000 סודות, יכול להיות שהאשכול יהפוך ללא יציב בזמן השדרוג, ועלול לגרום להפסקת פעולה של עומסי העבודה.
  • מוודאים שהגודל הממוצע של המטא-נתונים של סוד בכל מרחב שמות קטן מ-5KiB. אם הגודל הממוצע של המטא-נתונים גדול מ-5KiB, יכול להיות שהאשכול ייכנס למצב לא תקין שבו חלק מהסודות מוצפנים וחלקם מפוענחים אחרי הפעלת התכונה או השבתת התכונה.
  • צריך לבחור מפתח באותו אזור שבו נמצא האשכול. לדוגמה, באשכול אזורי ב-us-central1-a אפשר להשתמש רק במפתח באזור us-central1. במקרה של אשכולות אזוריים, המפתחות צריכים להיות באותו מיקום כדי להקטין את זמן האחזור ולמנוע מצבים שבהם משאבים תלויים בשירותים שפרוסים על פני כמה דומיינים של כשל.

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

  • ‫GKE תומך רק במפתחות מ-Cloud KMS. אי אפשר להשתמש בספק KMS אחר של Kubernetes או בספק הצפנה אחר.

פתרון בעיות

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

מפתח Cloud KMS מושבת

סוכן השירות של Kubernetes Engine לא יכול להשתמש במפתח Cloud KMS מושבת להצפנת סודות בשכבת האפליקציה.

כדי להפעיל מחדש מפתח מושבת, אפשר לעיין במאמר בנושא הפעלה של גרסת מפתח מושבתת.

גרסת מפתח של Cloud KMS נמחקת

אם סטטוס האשכול מכיל את ההודעה: KEY_VERSION_URI is not enabled, current state is: DESTROYED, המשמעות היא שגרסת המפתח ששימשה להצפנת סודות בשכבת האפליקציה הושמדה.

מחליפים את KEY_VERSION_URI במזהה המשאבים האחיד (URI) של גרסת המפתח.

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