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

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

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

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

עדכון שנכשל

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

פעולת העדכון הזו עלולה להיכשל בגלל אחד מהתנאים הבאים:

  • מישור הבקרה של Kubernetes לא זמין באופן זמני בזמן שהעדכון מתבצע.
  • AdmissionWebhook שהוגדר על ידי המשתמש מונע מ-GKE לעדכן אובייקטים מסוג Secret.
  • מפתח ה-Cloud KMS המעודכן או הקודם מושבת לפני שפעולת העדכון מסתיימת.

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

שדות לניפוי באגים

אשכולות GKE חדשים שמריצים גרסה 1.29 ואילך מכילים שדות נוספים שעוזרים לעקוב אחרי עדכונים ל-Cluster.DatabaseEncryption ולשחזר נתונים במקרה של כשלים.

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

המגבלות הבאות חלות על השדות האלה:

  • הן פלט בלבד, כלומר אי אפשר להגדיר אותן במהלך יצירת אשכול או עדכון בקשות.

CurrentState שדה

כדי לבדוק את הסטטוס הנוכחי של פעולת עדכון DatabaseEncryption, בודקים את השדה CurrentState ב-Cluster.DatabaseEncryption.

הערך של CurrentState תיאור

CURRENT_STATE_ENCRYPTED

CURRENT_STATE_ALL_OBJECTS_ENCRYPTION_ENABLED

CURRENT_STATE_DECRYPTED

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

CURRENT_STATE_ENCRYPTION_PENDING

CURRENT_STATE_ALL_OBJECTS_ENCRYPTION_PENDING

CURRENT_STATE_DECRYPTION_PENDING

העדכון מתבצע.

CURRENT_STATE_ENCRYPTION_ERROR

CURRENT_STATE_ALL_OBJECTS_ENCRYPTION_ERROR

CURRENT_STATE_DECRYPTION_ERROR

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

מידע נוסף מופיע בשדה LastOperationErrors.

LastOperationErrors שדה

אם פעולת עדכון נכשלת, השגיאה הבסיסית ממישור הבקרה של GKE מוצגת בפלט של gcloud container clusters update.

הודעות השגיאה משתי פעולות העדכון האחרונות שנכשלו זמינות גם ב-Cluster.DatabaseEncryption.LastOperationErrors.

DecryptionKeys שדה

מפתח Cloud KMS שמשמש לפעולות הצפנה חדשות מוצג ב-DatabaseEncryption.KeyName. בדרך כלל זה המפתח היחיד שבו משתמשים באשכול.

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

שחזור אחרי עדכון שנכשל

כדי לשחזר עדכון שנכשל:

  1. בודקים את הודעת השגיאה ופותרים את הבעיות שמצוינות בה.
  2. מריצים שוב את בקשת העדכון באמצעות הפקודה שנכשלה, לדוגמה: gcloud container clusters update ... --database-encryption-key מומלץ לנסות שוב עם אותה בקשת עדכון שהוצאה במקור, או לעדכן את האשכול בחזרה למצב הקודם. יכול להיות ש-GKE לא יוכל לעבור למצב הצפנה או למפתח אחר אם הוא לא יוכל לקרוא סוד אחד או יותר.

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

שגיאה במפתח Cloud KMS

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

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

שגיאה: אי אפשר להשתמש במפתח CloudKMS שהוגדר להצפנה ברמת האפליקציה

הודעת השגיאה הבאה מופיעה אם לחשבון השירות שמוגדר כברירת מחדל ב-GKE אין גישה למפתח Cloud KMS:

Cluster problem detected (Kubernetes Engine Service Agent account unable to use CloudKMS key configured for Application Level encryption).

כדי לפתור את הבעיה, צריך להפעיל מחדש את המפתח שהושבת.

לא ניתן לעדכן את הסוד

יכול להיות שתקבלו את השגיאה הבאה אם Kubernetes API דחה את בקשת העדכון בגלל webhook של הרשאה:

error admission webhook WEBHOOK_NAME denied the request

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

שגיאה: מרחב השמות מנוהל

השגיאה הבאה מתרחשת כשמנסים להצפין מחדש סודות שנמצאים במרחב שמות שמנוהל על ידי GKE, כמו kube-system, באשכול Autopilot. הודעת השגיאה דומה לזו:

Error from server (Forbidden): secrets "alertmanager" is
forbidden: User cannot patch resource "secrets" in API group "" in the namespace "gke-gmp-system":
GKE Warden authz [denied by managed-namespaces-limitation]: the namespace "gke-gmp-system"
is managed and the request's verb "patch" is denied'

באשכולות GKE Autopilot אי אפשר לשנות משאבי Kubernetes, כולל סודות, במרחבי שמות מנוהלים.

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

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

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