במדריך הזה נסביר איך להצפין סודות של 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 קטן בהרבה ממספר המפתחות שמצפינים את הנתונים.
- אפשרות להשתמש ב-Root of Trust מרכזי: סודות שמאוחסנים ב-Kubernetes יכולים להסתמך על Root of Trust חיצוני. כלומר, אתם יכולים להשתמש ב-Root of Trust מרכזי, כמו מודול אבטחה לחומרה, לכל הסודות שלכם. גורם עוין שמקבל גישה למאגרים שלכם אופליין לא יכול להשיג את הסודות שלכם.
כשמצפינים סודות בשכבת האפליקציה ב-GKE, המערכת מצפינה את הסודות באמצעות מפתחות DEK מקומיים וספק AES-CBC. GKE מצפין את מפתחות ה-DEK באמצעות מפתח KEK שמנוהל ב-Cloud KMS.
למידע נוסף על הצפנת מעטפה, ראו הצפנת מעטפה.
מה קורה כשהנתונים מוצפנים
כשיוצרים משאב חדש ב-Kubernetes שאפשר להצפין, זה מה שקורה:
GKE יוצר מפתח DEK באמצעות מחולל מספרים אקראי.
GKE מצפין את הנתונים באופן מקומי במישור הבקרה באמצעות מפתח ה-DEK הזה.
GKE שולח את ה-DEK ל-Cloud KMS לצורך הצפנה. בפעולה הזו נעשה שימוש ב-Kubernetes Engine Service Agent של הפרויקט כדי לבצע אימות ל-Cloud KMS.
Cloud KMS מצפין את ה-DEK באמצעות ה-KEK, ושולח אותו בחזרה למישור הבקרה של GKE.
מישור הבקרה של GKE מאחסן את הנתונים המוצפנים לצד ה-DEK המוצפן במסד הנתונים של האשכול. מפתח ה-DEK בטקסט רגיל לא נכתב לדיסק, אבל הוא נשמר במטמון בזיכרון לצורך שיפור הביצועים.
כשלקוח מבקש את הנתונים משרת ה-API של Kubernetes, התהליך הבא מתרחש:
מישור הבקרה של GKE מאחזר את הנתונים המוצפנים ממסד הנתונים של מצב האשכול.
מישור הבקרה של GKE בודק את מטמון הזיכרון כדי למצוא את מפתח ה-DEK בטקסט גלוי. אם המטמון מכיל את ה-DEK בטקסט פשוט, GKE משתמש בו כדי לפענח את הנתונים.
אם מפתח ה-DEK לא נמצא במטמון, GKE שולח את מפתח ה-DEK המוצפן אל Cloud KMS כדי לפענח אותו באמצעות מפתח ה-KEK.
GKE מקבל את ה-DEK המפוענח מ-Cloud KMS ומשתמש בו כדי לפענח את הנתונים.
שרת ה-API של Kubernetes מחזיר את הנתונים המפוענחים ללקוח.
מה קורה כשמשמידים מפתח
אם אתם מתכננים להשמיד גרסה ישנה של KEK אחרי רוטציית מפתחות, ודאו שהנתונים באשכול מוגנים באמצעות הגרסה החדשה של KEK. התהליך תלוי בהיקף ההצפנה של האשכול (אימות היקף ההצפנה).
אתם יכולים לשמור את גרסת ה-KEK הקודמת כדי להימנע מהצפנה מחדש של הסודות, אבל תמשיכו להיות מחויבים על כל ה-KEK הפעילים ב-Cloud KMS. לפרטים על המחירים, קראו את המאמר תמחור של Cloud KMS.
אם אתם לא משתמשים בהקרנת נפח של אסימונים בחשבון שירות, חשבונות השירות שמשמשים את עומסי העבודה שלכם ב-GKE משתמשים גם בסודות, ואם מפתח נהרס הם לא יהיו זמינים. אם לא תהיה גישה למשאבים האלה, עומסי העבודה ייכשלו.
יש יוצאים מן הכלל:
פודים עם גישה קיימת לסודות ככרכים נטענים או כמשתני סביבה שומרים על הגישה.
מישור הבקרה של GKE עדיין יכול להשתמש ברשומות מיפוי של DEK שנשמרו במטמון כדי לפענח נתונים אחרי שהשמדתם את ה-KEK. כך פודים שהופעלו מחדש או תוזמנו מחדש יכולים לגשת לנתונים, אלא אם מתרחש אחד מהמצבים הבאים:
- מישור הבקרה של האשכול מופעל מחדש.
- ה-Pod של מישור הבקרה של GKE מופעל מחדש.
- מפתח ה-DEK לא נמצא במטמון של מישור הבקרה של GKE.
לפני שמשמידים KEK, צריך לבדוק אם הוא בשימוש באשכול. אפשר גם ליצור מדיניות התראות להשמדת מפתחות ב-Cloud KMS. צריך להשמיד גרסאות קודמות של KEK רק כשבטוחים ששום נתון באשכול לא מוצפן באמצעות הגרסה הקודמת. לפני שמשמידים KEK, צריך לבדוק אם המפתח נמצא בשימוש. פרטים נוספים זמינים במאמר השמדה ושחזור של גרסאות מפתחות.
אתם יכולים לתזמן השמדה של גרסת מפתח אחרי תקופה שניתן להגדיר. במהלך התקופה הזו, אם תשנו את דעתכם תוכלו לשחזר את גרסת המפתח כדי למנוע את המחיקה. אבל אחרי שמועד ההשמדה המתוזמן מגיע וגרסת המפתח מושמדת, אי אפשר לבטל את הפעולה. לא תהיה אפשרות לפענח נתונים שהוצפנו באמצעות גרסת המפתח הזו.
לפני שמתחילים
כדי לבצע את התרגילים בנושא הזה, אתם צריכים שני פרויקטים ב- Google Cloud :
פרויקט מפתח: בפרויקט הזה יוצרים KEK.
פרויקט אשכול: כאן יוצרים אשכול שמאפשר הצפנת סודות בשכבת האפליקציה.
אפשר להשתמש באותו פרויקט גם לפרויקט המפתחות וגם לפרויקט האשכולות. אבל השיטה המומלצת היא להשתמש בפרויקטים נפרדים.
בפרויקט המפתח, מוודאים שהפעלתם את Cloud KMS API.
בפרויקט המפתח, המשתמש שיוצר את אוסף המפתחות והמפתח צריך את ההרשאות הבאות ב-IAM:
cloudkms.keyRings.getIamPolicycloudkms.keyRings.setIamPolicy
ההרשאות האלה (ועוד רבות אחרות) מוענקות ל
roles/cloudkms.adminתפקיד המוגדר מראש בניהול זהויות והרשאות גישה. מידע נוסף על הענקת הרשאות לניהול מפתחות זמין במסמכי התיעוד של Cloud KMS.בפרויקט של האשכול, מוודאים שהפעלתם את 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 .
המסוף
בפרויקט המפתחות, יוצרים אוסף מפתחות:
נכנסים לדף Key Management במסוף Google Cloud .
לוחצים על Create key ring.
בשדה שם אוסף המפתחות, מזינים את השם של אוסף המפתחות.
ברשימה Location, בוחרים את המיקום של אשכול Kubernetes.
לוחצים על יצירה.
לאחר מכן, יוצרים מפתח:
נכנסים לדף Key Management במסוף Google Cloud .
לוחצים על השם של אוסף המפתחות שעבורו רוצים ליצור מפתח.
לוחצים על Create key.
בשדה Key name, מזינים את שם המפתח.
מאשרים את ערכי ברירת המחדל של Rotation period ו-Starting on, או מגדירים תקופת רוטציית מפתחות ושעת התחלה אם רוצים להשתמש בערכים אחרים.
[אופציונלי] בשדה תוויות, לוחצים על הוספת תווית אם רוצים להוסיף תוויות למפתח.
לוחצים על יצירה.
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" ב-Cloud KMS:
- נכנסים לדף Key management במסוף Google Cloud .
לוחצים על השם של אוסף המפתחות המכיל את המפתח הרצוי.
מסמנים את התיבה של המפתח הרצוי.
הכרטיסייה Permissions מופיעה בחלונית הימנית.
בתיבת הדו-שיח Add members, מציינים את כתובת האימייל של Kubernetes Engine Service Agent שרוצים להעניק לו גישה.
בתפריט הנפתח Select a role, בוחרים Cloud KMS CryptoKey Encrypter/Decrypter.
לוחצים על 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.
מסוף – Autopilot
כדי ליצור אשכול Autopilot עם הצפנת סודות בשכבת האפליקציה:
נכנסים לדף Create an Autopilot cluster במסוף Google Cloud .
מגדירים את האשכול לפי הצורך.
בחלונית הניווט, לוחצים על הגדרות מתקדמות ומרחיבים את הקטע אבטחה.
בקטע Encrypt secrets at the application layer, בוחרים באפשרות Cloud KMS key ובוחרים את המפתח שיצרתם בשלב Create a Cloud KMS key.
לוחצים על יצירה.
Console - Standard
כדי ליצור אשכול Standard עם הצפנת סודות בשכבת האפליקציה, מבצעים את הפעולות הבאות:
נכנסים לדף Create a Kubernetes cluster במסוף Google Cloud .
מגדירים את האשכול לפי הצורך.
בחלונית הניווט, לוחצים על הגדרות מתקדמות.
בשורה Secret encryption at the application layer (הצפנת סודות בשכבת האפליקציה), לוחצים על edit Edit configuration (עריכת ההגדרה).
בקטע Encrypt secrets at the application layer, בוחרים באפשרות Cloud KMS key ובוחרים את המפתח שיצרתם בשלב Create a Cloud KMS key.
לוחצים על Save.
לוחצים על יצירה.
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 מצפין מחדש את כל הסודות הקיימים באמצעות המפתח החדש, ולכן צפויה פעולה ממושכת. באשכולות אזוריים, מישור הבקרה לא יהיה זמין.
המסוף
כדי לעדכן אשכול כך שיתמוך בהצפנת סודות בשכבת האפליקציה:
נכנסים לדף Google Kubernetes Engine במסוף Google Cloud .
לוחצים על השם של האשכול שרוצים לשנות.
בקטע אבטחה, בשדה הצפנת סודות בשכבת האפליקציה, לוחצים על edit עריכת הצפנת סודות בשכבת האפליקציה.
מסמנים את תיבת הסימון הפעלת הצפנה של סודות בשכבת האפליקציה ובוחרים את המפתח שיצרתם בשלב יצירת מפתח Cloud KMS.
לוחצים על שמירת השינויים.
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:
נכנסים לדף Google Kubernetes Engine במסוף Google Cloud .
לוחצים על השם של האשכול שרוצים לשנות.
בקטע אבטחה, בשדה הצפנת סודות בשכבת האפליקציה, לוחצים על edit עריכת הצפנת סודות בשכבת האפליקציה.
בוחרים את מפתח ההצפנה החדש שבו רוצים להשתמש.
לוחצים על שמירת השינויים.
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 .
המסוף
נכנסים לדף Google Kubernetes Engine במסוף Google Cloud .
לוחצים על השם של האשכול שרוצים לשנות.
בקטע אבטחה, בשדה הצפנת סודות בשכבת האפליקציה, לוחצים על edit עריכת הצפנת סודות בשכבת האפליקציה.
מבטלים את הסימון בתיבה Enable Application-layer secrets encryption.
לוחצים על שמירת השינויים.
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.
המסוף
נכנסים לדף Google Kubernetes Engine במסוף Google Cloud .
לוחצים על שם האשכול שרוצים לבדוק.
בקטע 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: כל האובייקטים של 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: מרחב השמות שבו רוצים לעדכן את הסודות. באשכולות Standard, אפשר להשתמש בדגל--all-namespacesכדי לעדכן כל Secret באשכול באמצעות אותה פקודה. ב-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 של גרסת המפתח.