במדריך הזה נסביר איך להצפין סודות של Kubernetes בשכבת האפליקציה, באמצעות מפתח שמנוהל ב-Cloud Key Management Service (Cloud KMS). תהליך ההצפנה של סודות מספק שכבת אבטחה נוספת לעומסי עבודה רגישים.
הדף הזה מיועד למומחי אבטחה שרוצים להצפין סודות. למידע נוסף על תפקידים נפוצים ומשימות לדוגמה שאנחנו מתייחסים אליהם בתוכן של Google Cloud , קראו את המאמר תפקידים ומשימות נפוצים של משתמשי GKE.
לפני שקוראים את הדף הזה, חשוב להכיר את המושגים הבאים:
סקירה כללית
כברירת מחדל, Google Kubernetes Engine (GKE) מצפין את תוכן הלקוחות שמאוחסן במצב מנוחה, כולל סודות. GKE מטפל בהצפנה הזו כברירת מחדל ומנהל אותה בשבילכם, בלי שתצטרכו לבצע פעולות נוספות. הצפנת סודות בשכבת האפליקציה מספקת שכבת אבטחה נוספת לנתונים רגישים שמאוחסנים במסד הנתונים של מצב האשכול. כשהאפשרות הזו מופעלת, אתם משתמשים במפתח שמנוהל באמצעות Cloud KMS כדי להצפין את הנתונים האלה בשכבת האפליקציה.
בגרסה 1.35 של GKE ואילך, המשאבים הספציפיים של Kubernetes שמוצפנים תלויים במאגר של צמדי מפתח/ערך שמארח את מצב האשכול, באופן הבא:
- Spanner: הצפנת סודות בשכבת האפליקציה מצפינה את כל האובייקטים של Kubernetes API.
- etcd: הצפנת סודות בשכבת האפליקציה מצפינה בעיקר סודות.
כדי להשתמש בהצפנת סודות בשכבת האפליקציה, קודם צריך ליצור מפתח Cloud KMS ולתת ל-Kubernetes Engine Service Agent גישה למפתח. אתם יכולים להשתמש במפתח עם כל אחת מרמות ההגנה שנתמכות ב-Cloud KMS.
כדי לצמצם את זמן האחזור ולמנוע מקרים שבהם המשאבים תלויים בשירותים שפרוסים על פני כמה דומיינים של כשל, חשוב לוודא שהמפתח נמצא באותו מיקום כמו האשכול. אחרי שיוצרים מפתח, אפשר להפעיל את התכונה באשכול חדש או קיים על ידי ציון המפתח שבו רוצים להשתמש. כשמפעילים את התכונה, GKE מצפין אובייקטים במסד הנתונים של מצב האשכול באמצעות מפתח ההצפנה שלכם. סוגי ה-API הספציפיים שמוצפנים תלויים במאגר של צמדי המפתח/ערך שבו משתמש האשכול, כפי שמתואר ברשימה הקודמת.
הצפנת מעטפה
ב-Kubernetes אפשר להצפין את הסודות באמצעות ספק KMS, כלומר מפתח מקומי, שנקרא בדרך כלל מפתח להצפנת נתונים (DEK), משמש להצפנת הסודות. ה-DEK עצמו מוצפן באמצעות מפתח אחר שנקרא מפתח להצפנת מפתחות הצפנה (KEK). Kubernetes לא מאחסן את ה-KEK.
אלה היתרונות של הצפנת מעטפה:
- ביצועים משופרים בהשוואה להצפנה באמצעות מפתח ציבורי: GKE משתמש ב-Cloud KMS API רק כדי להצפין מפתחות DEK חדשים באמצעות ה-KEK, או כדי לפענח מפתח DEK כשהמטמון המקומי ריק.
- ניהול טוב יותר של מפתחות בקנה מידה נרחב: מפתח KEK אחד יכול להצפין כמה מפתחות DEK. מספר המפתחות שצריך לאחסן בשירות Cloud KMS קטן בהרבה ממספר המפתחות שמצפינים את הנתונים.
- יכולת להשתמש ב-root of trust מרכזי: סודות שמאוחסנים ב-Kubernetes יכולים להסתמך על root of trust חיצוני. כלומר, אתם יכולים להשתמש ב-Root of Trust מרכזי, למשל מודול אבטחה לחומרה, לכל הסודות שלכם. גורם עוין שמקבל גישה למאגרים שלכם אופליין לא יכול להשיג את הסודות שלכם.
בהצפנת סודות בשכבת האפליקציה ב-GKE, 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בתפקיד המוגדר מראש של ניהול זהויות והרשאות גישה (IAM). במסמכי התיעוד של 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 .
לוחצים על יצירת אוסף מפתחות.
בשדה Key ring name, מזינים את השם של אוסף המפתחות.
ברשימה Location, בוחרים את המיקום של אשכול Kubernetes.
לוחצים על יצירה.
אחר כך יוצרים מפתח:
נכנסים לדף Key Management במסוף Google Cloud .
לוחצים על השם של אוסף המפתחות שבו רוצים ליצור מפתח.
לוחצים על Create key.
בשדה Key name, מזינים את שם המפתח.
מאשרים את ערכי ברירת המחדל של Rotation period ו-Starting on, או מגדירים תקופת רוטציית מפתחות ושעת התחלה אם רוצים להשתמש בערכים אחרים.
[אופציונלי] בשדה 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.
מחליפים את CLUSTER_PROJECT_NUMBER במספר הפרויקט של האשכול.
כדי למצוא את מספר הפרויקט באמצעות ה-CLI של gcloud, מריצים את הפקודה הבאה:
gcloud projects describe CLUSTER_PROJECT_ID \
--format="value(projectNumber)"
כדי להעניק גישה ל-Kubernetes Engine Service Agent, אתם יכולים להשתמש במסוף Google Cloud או ב-CLI של gcloud.
המסוף
מקצים לסוכן השירות של Kubernetes Engine את התפקיד Cloud KMS CryptoKey Encrypter/Decrypter:
- נכנסים לדף Key management במסוף Google Cloud .
לוחצים על השם של אוסף המפתחות המכיל את המפתח הרצוי.
מסמנים את התיבה של המפתח הרצוי.
הכרטיסייה Permissions מופיעה בחלונית הימנית.
בתיבת הדו-שיח Add members, מציינים את כתובת האימייל של Kubernetes Engine Service Agent שרוצים להעניק לו גישה.
בתפריט הנפתח Select a role, בוחרים Cloud KMS CryptoKey Encrypter/Decrypter.
לוחצים על Save.
gcloud
מקצים לסוכן השירות של Kubernetes Engine את התפקיד Cloud KMS CryptoKey Encrypter/Decrypter:
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.
מסוף – Autopilot
כדי ליצור אשכול Autopilot עם הצפנת סודות בשכבת האפליקציה, מבצעים את הפעולות הבאות:
נכנסים לדף Create an Autopilot cluster במסוף Google Cloud .
מגדירים את האשכול לפי הצורך.
בחלונית הניווט, לוחצים על Advanced settings ומרחיבים את הקטע Security.
בקטע Encrypt secrets at the application layer, בוחרים באפשרות Cloud KMS key ואז בוחרים את המפתח שיצרתם בקטע יצירת מפתח Cloud KMS.
לוחצים על יצירה.
מסוף – Standard
כדי ליצור אשכול Standard עם הצפנת סודות בשכבת האפליקציה, מבצעים את הפעולות הבאות:
נכנסים לדף Create a Kubernetes cluster במסוף Google Cloud .
מגדירים את האשכול לפי הצורך.
בחלונית הניווט, לוחצים על הגדרות מתקדמות.
בשורה Secret encryption at the application layer, לוחצים על edit Edit configuration.
בקטע הצפנת סודות בשכבת האפליקציות, בוחרים באפשרות Cloud KMS key ובוחרים את המפתח שיצרתם בקטע יצירת מפתח Cloud KMS.
לוחצים על 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.
מסמנים את התיבה Enable 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 .
לוחצים על השם של האשכול שרוצים לשנות.
בקטע Security, בשדה Application-layer secrets encryption לוחצים על edit Edit application-layer secrets encryption.
מבטלים את הסימון בתיבה 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כדי לעדכן כל סוד באשכול באמצעות אותה פקודה. באשכולות Autopilot, אתם יכולים לעדכן רק את מרחבי השמות שבבעלותכם. -
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 של גרסת המפתח.