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

במדריך הזה נסביר איך להצפין Secrets ב-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 ולהעניק לחשבון השירות של GKE גישה למפתח. אתם יכולים להשתמש במפתח עם כל אחת מרמות ההגנה שנתמכות על ידי Cloud KMS.

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

הצפנת מעטפות

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

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

  • ביצועים משופרים בהשוואה להצפנה באמצעות מפתח ציבורי: ‫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 להצפנה. בפעולה הזו נעשה שימוש בחשבון השירות של GKE בפרויקט כדי לבצע אימות ל-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 ומשתמש בו כדי לפענח את הנתונים.

  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. בשדה שם אוסף המפתחות, מזינים את השם של אוסף המפתחות.

  4. ברשימה מיקום, בוחרים את המיקום של אשכול 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: מזהה הפרויקט של המפתח.

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

שם חשבון השירות של GKE בפרויקט האשכול:

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

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

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

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

המסוף

מקצים לחשבון השירות של GKE את התפקיד CryptoKey Encrypter/Decrypter ב-Cloud KMS:

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

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

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

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

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

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

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

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

gcloud

מקצים לחשבון השירות של GKE את התפקיד 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: השם של חשבון השירות של GKE.
  • 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.

מסוף – טייס אוטומטי

כדי ליצור אשכול 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: מזהה הפרויקט של האשכול.

אפשר להפעיל הצפנה של סודות בשכבת האפליקציה באשכול חדש מסוג Standard באמצעות הפקודה 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. בקטע Security (אבטחה), מחפשים את השדה Application-layer secrets encryption (הצפנת סודות בשכבת האפליקציה). הערך בשדה הזה מציין אילו אובייקטים מוצפנים, באופן הבא:

    • מופעל (כל האובייקטים): כל האובייקטים של 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: כל אובייקטי ה-API של Kubernetes במסד הנתונים של מצב האשכול מוצפנים.
  • 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 מושבת

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

במאמר הפעלה של גרסת מפתח מושבתת מוסבר איך להפעיל מחדש מפתח מושבת.

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

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

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

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