במדריך הזה נסביר איך להצפין סודות של Kubernetes בשכבת האפליקציה באמצעות מפתח שמנוהל ב-Cloud Key Management Service (Cloud KMS). תהליך ההצפנה של סודות מספק שכבת אבטחה נוספת לעומסי עבודה רגישים.
הדף הזה מיועד למומחי אבטחה שרוצים להצפין סודות. כדי לקבל מידע נוסף על תפקידים נפוצים ומשימות לדוגמה שאנחנו מתייחסים אליהם ב Google Cloud תוכן, אפשר לעיין במאמר תפקידים נפוצים של משתמשי GKE ומשימות.
לפני שקוראים את הדף הזה, חשוב להכיר את המושגים הבאים:
לחצו על תראו לי איך כדי לקרוא הסבר מפורט על המשימה ישירות במסוף Google Cloud :
סקירה כללית
כברירת מחדל, Google Kubernetes Engine (GKE) מצפין את תוכן הלקוחות שמאוחסן במצב מנוחה, כולל סודות. GKE מטפל בהצפנה הזו של ברירת המחדל ומנהל אותה בשבילכם, בלי שתצטרכו לבצע פעולות נוספות. הצפנת סודות בשכבת האפליקציה מספקת שכבת אבטחה נוספת לנתונים רגישים שמאוחסנים במסד הנתונים של מצב האשכול. כשמפעילים את ההצפנה, משתמשים במפתח שמנוהל באמצעות Cloud KMS כדי להצפין את הנתונים בשכבת האפליקציה.
בגרסה 1.35 ואילך של GKE, המשאבים הספציפיים של 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 ומשתמש ב-DEK כדי לפענח את הנתונים.
שרת ה-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.
בפרויקט המפתח, המשתמש שיוצר את אוסף המפתחות והמפתח צריך את ההרשאות הבאות ב-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.
בשדה שם המפתח, מזינים את השם של המפתח.
מקבלים את ערכי ברירת המחדל של תקופת רוטציית המפתחות ושעת התחלה, או מגדירים תקופת רוטציית מפתחות ושעת התחלה אם רוצים להשתמש בערכים שונים.
[אופציונלי] בשדה Labels, לוחצים על Add label אם רוצים להוסיף תוויות למפתח.
לוחצים על יצירה.
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:
- נכנסים לדף Key management במסוף Google Cloud .
לוחצים על השם של אוסף המפתחות המכיל את המפתח הרצוי.
מסמנים את התיבה של המפתח הרצוי.
הכרטיסייה Permissions מופיעה בחלונית הימנית.
בתיבת הדו-שיח Add members, מציינים את כתובת האימייל של Kubernetes Engine Service Agent שרוצים להעניק לו גישה.
בתפריט הנפתח Select a role, בוחרים Cloud KMS CryptoKey Encrypter/Decrypter.
לוחצים על Save.
gcloud
מקצים לסוכן השירות של Kubernetes Engine את התפקיד "הצפנה/פענוח של CryptoKey" ב-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. -
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 עם הצפנה של סודות בשכבת האפליקציה, מבצעים את השלבים הבאים:
נכנסים לדף Create an Autopilot cluster במסוף Google Cloud .
מגדירים את האשכול לפי הצורך.
בחלונית הניווט, לוחצים על הגדרות מתקדמות ומרחיבים את הקטע אבטחה.
בקטע Encrypt secrets at the application layer, בוחרים באפשרות Cloud KMS key ובוחרים את המפתח שיצרתם בשלב Create a Cloud KMS key.
לוחצים על יצירה.
מסוף – 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 .
לוחצים על השם של האשכול שרוצים לשנות.
בקטע Security, בשדה Application-layer secrets encryption לוחצים על edit Edit Application-layer secrets encryption.
מסמנים את תיבת הסימון הפעלת הצפנה של סודות בשכבת האפליקציה ובוחרים את המפתח שיצרתם בשלב יצירת מפתח 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 .
לוחצים על השם של האשכול שרוצים לשנות.
בקטע Security, בשדה Application-layer secrets encryption לוחצים על edit Edit Application-layer secrets encryption.
בוחרים את מפתח ההצפנה החדש שבו רוצים להשתמש.
לוחצים על שמירת השינויים.
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 עריכת הצפנת סודות בשכבת האפליקציה.
מבטלים את הסימון בתיבה הפעלת הצפנה של סודות בשכבת האפליקציה.
לוחצים על שמירת השינויים.
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 .
לוחצים על שם האשכול שרוצים לבדוק.
בקטע אבטחה, מחפשים את השדה הצפנת סודות בשכבת האפליקציה. הערך בשדה הזה מציין אילו אובייקטים מוצפנים, באופן הבא:
- מופעל (כל האובייקטים): כל האובייקטים של 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) של גרסת המפתח.