טעינה מאובטחת של מודולי ליבה ב-Google Kubernetes Engine (GKE) מאפשרת להריץ עומסי עבודה שדורשים מודולי ליבה חתומים מחוץ לעץ (OOT) בתמונות מאובטחות של מערכת הפעלה שמותאמת לקונטיינרים. טעינה מאובטחת של מודול ליבת המערכת עוזרת לשפר את מצב האבטחה של האשכולות ושל מאגרי הצמתים, כי היא מאפשרת לכם לשלוט יותר בטעינת מודולים בצמתים של CPU או TPU באמצעות אימות חתימה.
איך פועל טעינת מודול מאובטח של ליבת המערכת
כברירת מחדל, צמתים של GKE משתמשים בתמונות שונות של מערכת הפעלה שמותאמת לקונטיינרים (Container-Optimized OS) עם הגדרות אבטחה שונות, בהתאם לסוג הצומת:
- צמתי CPU ו-TPU: משתמשים בתמונה של מערכת הפעלה שמותאמת לקונטיינרים עם Linux Security Module (LSM) Loadpin מופעל. Loadpin מגביל את הטעינה של כל מודול ליבת OOT. ההגדרה הזו מאובטחת, אבל היא מונעת טעינה של מודולים של OOT.
- צמתים של GPU: משתמשים בקובץ אימג' של מערכת הפעלה שמותאמת לקונטיינרים עם Loadpin מושבת. ההגדרה הזו מאפשרת טעינה של מודולים מחוץ לעץ המקור, כמו התקנה של מנהלי התקנים של NVIDIA, אבל היא פחות מאובטחת כברירת מחדל.
כדי להפעיל טעינה מאובטחת של מודול ליבת המערכת, משתמשים בהגדרה NodeKernelModuleLoading.Policy ב-LinuxNodeConfig עבור מאגר צמתים, או מעבירים את הדגל --enable-kernel-module-signature-enforcement כשיוצרים או מעדכנים אשכול או מאגר צמתים. כשמגדירים את המדיניות לערך ENFORCE_SIGNED_MODULES, המדיניות Loadpin מופעלת במאגרי הצמתים של CPU או TPU, אבל היא מוגדרת כך שתאפשר טעינה של מודול ליבה מחוץ למערכת קבצים בסיסית. המודולים חייבים להיות חתומים, והמערכת מאפשרת רק מודולים שחתומים על ידי Google.
מתי כדאי להשתמש בטעינה מאובטחת של מודול ליבת המערכת
כדי לטעון מודולים של ליבת OOT שחתומים על ידי Google, כמו מנהלי התקנים בהתאמה אישית או מערכות קבצים כמו Lustre, בכל סוג של צומת GKE, צריך להשתמש בטעינה מאובטחת של מודולים של ליבת המערכת. התכונה הזו מאפשרת להשתמש במודולים האלה בלי לפגוע ברמת האבטחה של הצומת. לדוגמה, אפשר לטעון מנהל התקן נדרש בצומת CPU בלי להשתמש בסוג התמונה של ה-GPU, שהוא פחות מגביל.
דרישות ומגבלות
כשמפעילים טעינה מאובטחת של מודול ליבת המערכת במאגרי הצמתים, חלים הדרישות והמגבלות הבאות:
- מודולים נתמכים: מותרים רק מודולים של OOT שחתומים על ידי Google.
- cgroup v2: מאגר הצמתים חייב להשתמש ב-cgroup v2. Google Kubernetes Engine API דוחה בקשות להפעלת המדיניות הזו במאגרי צמתים שמשתמשים ב-cgroup v1. למידע נוסף, אפשר לעיין במסמכי התיעוד בנושא cgroup ב-Kubernetes.
- גרסת GKE: התכונה הזו זמינה בגרסאות של אשכול GKE 1.34.1-gke.2364000 ואילך.
- סוגי תמונות GPU: רק תמונות CPU ו-TPU תומכות בטעינה מאובטחת של מודול ליבת המערכת. אין תמיכה ב-GPU.
לפני שמתחילים
לפני שמתחילים, חשוב לוודא שביצעתם את הפעולות הבאות:
- מפעילים את ממשק ה-API של Google Kubernetes Engine. הפעלת Google Kubernetes Engine API
- אם רוצים להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז להפעיל את ה-CLI של gcloud. אם התקנתם בעבר את ה-CLI של gcloud, מריצים את הפקודה
gcloud components updateכדי לקבל את הגרסה העדכנית. יכול להיות שגרסאות קודמות של ה-CLI של gcloud לא יתמכו בהרצת הפקודות שמופיעות במסמך הזה.
הגדרת מדיניות טעינה של מודול ליבת אבטחה
אפשר להגדיר את מדיניות הטעינה של מודול ליבת האבטחה באשכולות בודדים או כהגדרה של מאגר צמתים. אלה כללי המדיניות שזמינים:
-
ENFORCE_SIGNED_MODULES: אוכף שכל מודולי ליבת out-of-tree חתומים על ידי Google. כדי שהמדיניות הזו תיכנס לתוקף, מאגר הצמתים צריך להשתמש ב-cgroup v2. -
DO_NOT_ENFORCE_SIGNED_MODULES: מאפשרת טעינה של כל מודול ליבה, חתום או לא חתום. זו התנהגות ברירת המחדל.
אם לא מציינים מדיניות, GKE משתמש בהתנהגות ברירת המחדל, שלא מחייבת מודולים חתומים.
הפעלת טעינה מאובטחת של מודול ליבת מערכת באשכול
כדי להפעיל טעינה מאובטחת של מודול ליבת מערכת באשכול, מבצעים אחד מהשלבים הבאים:
כדי להפעיל את התכונה באשכול חדש, מריצים את הפקודה הבאה:
רגילה
gcloud container clusters create CLUSTER_NAME \ --location=LOCATION \ --project=PROJECT_ID \ --enable-kernel-module-signature-enforcementטייס אוטומטי
gcloud container clusters create-auto CLUSTER_NAME \ --location=LOCATION \ --project=PROJECT_ID \ --enable-kernel-module-signature-enforcementמחליפים את מה שכתוב בשדות הבאים:
-
CLUSTER_NAME: השם של האשכול החדש. -
LOCATION: האזור או התחום של האשכול. PROJECT_ID: מזהה הפרויקט.
-
כדי להפעיל את התכונה באשכול קיים, מריצים את הפקודה הבאה:
gcloud container clusters update CLUSTER_NAME \ --location=LOCATION \ --project=PROJECT_ID \ --enable-kernel-module-signature-enforcementמחליפים את מה שכתוב בשדות הבאים:
-
CLUSTER_NAME: השם של האשכול. -
LOCATION: האזור או התחום של האשכול. PROJECT_ID: מזהה הפרויקט.
כשמעדכנים קלאסטר קיים, הצמתים נוצרים מחדש בהזדמנות הזמינה הבאה, אלא אם חלון זמן לתחזוקה מונע זאת.
-
הפעלת טעינה מאובטחת של מודול ליבת מערכת במאגר צמתים
כדי להפעיל טעינה מאובטחת של מודול ליבת מערכת במאגר צמתים, מבצעים את אחד מהשלבים הבאים:
כדי להפעיל את התכונה במאגר צמתים חדש, מריצים את הפקודה הבאה:
gcloud container node-pools create NODEPOOL_NAME \ --cluster=CLUSTER_NAME \ --location=LOCATION \ --project=PROJECT_ID \ --enable-kernel-module-signature-enforcementמחליפים את מה שכתוב בשדות הבאים:
-
NODEPOOL_NAME: השם של מאגר הצמתים החדש. -
CLUSTER_NAME: השם של האשכול. -
LOCATION: האזור או התחום של האשכול. PROJECT_ID: מזהה הפרויקט.
-
כדי להפעיל את התכונה במאגר צמתים קיים, מריצים את הפקודה הבאה:
gcloud container node-pools update NODEPOOL_NAME \ --cluster=CLUSTER_NAME \ --location=LOCATION \ --project=PROJECT_ID \ --enable-kernel-module-signature-enforcementמחליפים את מה שכתוב בשדות הבאים:
-
NODEPOOL_NAME: השם של מאגר הצמתים שרוצים לעדכן. -
CLUSTER_NAME: השם של האשכול. -
LOCATION: האזור או התחום של האשכול. PROJECT_ID: מזהה הפרויקט.
-
אישור ההגדרה של מדיניות מודול ליבת האבטחה
כדי לוודא שמדיניות מוגדרת לאשכול, מריצים את הפקודה הבאה:
gcloud container node-pools describe NODEPOOL_NAME \
--cluster=CLUSTER_NAME \
--location=LOCATION \
--project=PROJECT_ID
בודקים את הקטע linuxNodeConfig בפלט. בשדה kernelModuleLoading מוצגת המדיניות הנוכחית:
...
config:
linuxNodeConfig:
kernelModuleLoading:
policy: ENFORCE_SIGNED_MODULES
cgroupMode: CGROUP_MODE_V2
השבתת טעינה של מודול ליבת מאובטח
כדי להשבית טעינה מאובטחת של מודול ליבת מערכת, מבצעים את אחד מהשלבים הבאים:
כדי להשבית את התכונה באשכול, מריצים את הפקודה הבאה:
gcloud container clusters update CLUSTER_NAME \ --location=LOCATION \ --project=PROJECT_ID \ --no-enable-kernel-module-signature-enforcementכדי להשבית את התכונה במאגר צמתים קיים, מריצים את הפקודה הבאה:
gcloud container node-pools update NODEPOOL_NAME \ --cluster=CLUSTER_NAME \ --location=LOCATION \ --project=PROJECT_ID \ --no-enable-kernel-module-signature-enforcement