טעינה מאובטחת של מודולי ליבה ב-Google Kubernetes Engine (GKE) מאפשרת להריץ עומסי עבודה שדורשים מודולי ליבה חתומים מחוץ לעץ (OOT) בקובצי אימג' מאובטחים של מערכת הפעלה שמותאמת לקונטיינרים. טעינה מאובטחת של מודול ליבת המערכת עוזרת לשפר את מצב האבטחה של האשכולות ושל מאגרי הצמתים, כי היא מאפשרת לכם לשלוט יותר בטעינת מודולים בצמתים של CPU, TPU או GPU באמצעות אימות חתימה.
איך פועל טעינה מאובטחת של מודול ליבת מערכת
כברירת מחדל, צמתים של 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 מופעל אבל מוגדר לאפשר טעינה של מודול ליבה מחוץ למערכת קבצי הבסיס. המודולים צריכים להיות חתומים, והמערכת מאפשרת רק מודולים שחתומים על ידי Google.
מתי כדאי להשתמש בטעינה מאובטחת של מודול ליבת המערכת
כדי לטעון מודולים של ליבת OOT שחתומים על ידי Google, כמו מנהלי התקנים בהתאמה אישית או מערכות קבצים כמו Lustre, בכל סוג של צומת GKE, צריך להשתמש בטעינה מאובטחת של מודולים של ליבת המערכת. התכונה הזו מאפשרת להשתמש במודולים האלה בלי לפגוע ברמת האבטחה של הצומת. לדוגמה, אפשר לטעון מנהל התקן נדרש בצומת CPU בלי להשתמש בסוג התמונה של ה-GPU שהוא פחות מגביל.
דרישות ומגבלות
כשמפעילים טעינה מאובטחת של מודולי ליבה במאגרי הצמתים, חלות הדרישות והמגבלות הבאות:
- מודולים נתמכים: מותרים רק מודולים של OOT שחתומים על ידי Google.
- cgroup v2: מאגר הצמתים חייב להשתמש ב-cgroup v2. ממשק ה-API של Kubernetes Engine דוחה בקשות להפעלת המדיניות הזו במאגרי צמתים שמשתמשים ב-cgroup v1. למידע נוסף, אפשר לעיין במסמכי התיעוד בנושא cgroup ב-Kubernetes.
- גרסת GKE: התכונה הזו זמינה לצמתי CPU ו-TPU בגרסאות GKE cluster 1.34.1-gke.2364000 ואילך. בצמתים של GPU, התכונה הזו זמינה בגרסאות 1.36.0-gke.1585000 ואילך.
לפני שמתחילים
לפני שמתחילים, חשוב לוודא שביצעתם את הפעולות הבאות:
- מפעילים את ממשק Google Kubernetes Engine API. הפעלת 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