הפעלה מאובטחת של מכונה וירטואלית

במאמר הזה מוסבר איך להפעיל אתחול מאובטח או מודול פלטפורמה מהימנה וירטואלית (vTPM) במכונה וירטואלית (VM) ב-Google Distributed Cloud (GDC) עם air gap.

המסמך הזה מיועד למפתחים בקבוצות של מנהלי פלטפורמות או מפעילי אפליקציות, שמגדירים אתחול מאובטח ו-vTPM במכונות וירטואליות בסביבת GDC. מידע נוסף זמין במאמר קהלי היעד של GDC עם air gap.

מידע על אתחול מאובטח

התכונה "אתחול מאובטח" מוודאת שהמערכת מריצה רק תוכנות אותנטיות, על ידי אימות החתימה הדיגיטלית של כל רכיבי האתחול. אם האימות נכשל, התהליך נעצר. הוא משתמש בקושחה Unified Extensible Firmware Interface‏ (UEFI) כדי לנהל את האישורים והמפתחות שבהם היצרנים משתמשים כדי לחתום על קושחת המערכת, תוכנות האתחול וקובצי ה-binary שנטענו.

בכל הפעלה, קושחת ה-UEFI מאמתת את החתימה הדיגיטלית של כל רכיב מול מפתחות מאושרים ששמורים, וחוסמת רכיבים לא חתומים או רכיבים שנחתמו באופן לא תקין. כדי להפעיל את האתחול המאובטח במכונה הווירטואלית, צריך להגדיר את השדה shieldConfig.bootType של המכונה הווירטואלית לערך uefi, ואת השדה shieldConfig.enableSecureBoot לערך true.

לעיון במסמכי התיעוד הרשמיים של UEFI, ראו https://uefi.org/sites/default/files/resources/UEFI_Secure_Boot_in_Modern_Computer_Security_Solutions_2013.pdf.

מידע על מודולים וירטואליים של פלטפורמה מהימנה (vTPM)

‫vTPM הוא שבב מחשב וירטואלי מיוחד שמגן על המפתחות והאישורים שמשמשים לאימות הגישה למערכת. מידע נוסף על vTPM זמין בכתובת https://trustedcomputinggroup.org/trusted-platform-module-tpm-summary/.

אפשר גם להשתמש ב-vTPM כדי להגן על סודות באמצעות הגנה או חתימה. מידע נוסף על אחסון חתום זמין בכתובת https://en.wikipedia.org/wiki/Trusted_Computing#SEALED-STORAGE. בפרויקט Go-TPM ב-GitHub‏ (https://github.com/google/go-tpm) יש דוגמאות בשפת Go שממחישות איך להשתמש ב-vTPM למטרה הזו.

לפני שמתחילים

כדי להשתמש בפקודות של ממשק שורת הפקודה (CLI) של gdcloud, צריך לוודא שהורדתם, התקנתם והגדרתם את ה-CLI של gdcloud. כל הפקודות של Distributed Cloud משתמשות ב-CLI של gdcloud או kubectl, ודורשות סביבה של מערכת הפעלה (OS).

קבלת נתיב הקובץ של kubeconfig

כדי להריץ פקודות בשרת Management API, ודאו שיש לכם את המשאבים הבאים:

  1. אם אין לכם קובץ kubeconfig לשרת Management API, נכנסים לחשבון ויוצרים אותו.

  2. בהוראות הבאות, מחליפים את MANAGEMENT_API_SERVER בנתיב לקובץ kubeconfig של שרת Management API.

בקשת תפקידים ב-IAM

כדי לקבל את ההרשאות שנדרשות להפעלת אתחול מאובטח או vTPM במכונה הווירטואלית, צריך לבקש מהאדמין של הפרויקט ב-IAM להקצות לכם את התפקיד "אדמין של פרויקט מכונה וירטואלית" (project-vm-admin).

כל התפקידים של המכונה הווירטואלית חייבים להיות מקושרים למרחב השמות של הפרויקט שבו נמצאת המכונה הווירטואלית. פועלים לפי השלבים כדי לאמת את הגישה.

הפעלת אתחול מאובטח

הפעלת אתחול מאובטח למכונה וירטואלית. כדי להשתמש במכונה וירטואלית שנקראת VM_NAME במרחב השמות של הפרויקט (PROJECT_NAMESPACE), צריך לפעול לפי ההוראות הבאות:

  1. אם המכונה הווירטואלית פועלת, צריך לעצור אותה לפני שמחילים את התיקון. אם תנסו לתקן את shieldConfig בזמן שהמכונה הווירטואלית פועלת, ה-API יחזיר שגיאת Forbidden: Changes to shieldConfig are not allowed while the VM is running. הוראות מפורטות זמינות במאמר עצירת מכונה וירטואלית.

  2. מעדכנים את המשאב המותאם אישית של ה-VM כדי להפעיל את האתחול המאובטח:

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n PROJECT_NAMESPACE \
      patch virtualmachines.virtualmachine.gdc.goog VM_NAME \
      --type merge --patch $'
    spec:
      shieldConfig:
        bootType: uefi
        enableSecureBoot: true
    '
    

    מחליפים את המשתנים הבאים:

    • ‫MANAGEMENT_API_SERVER: קובץ ה-kubeconfig של שרת ה-API לניהול.
    • ‫PROJECT_NAMESPACE: מרחב השמות של הפרויקט שבו נמצאת המכונה הווירטואלית.
    • ‫VM_NAME: שם המכונה הווירטואלית.
  3. אחרי שמחילים את התיקון, מפעילים את המכונה הווירטואלית לפי ההוראות להפעלת מכונה וירטואלית.

  4. מוודאים שהפעלתם את האתחול המאובטח. יוצרים חיבור SSH למכונה הווירטואלית ומריצים את הפקודה הבאה:

    mokutil --sb-state
    

    אם הפעלתם את האתחול המאובטח, הפקודה תחזיר את הערך SecureBoot enabled.

    אם הכלי mokutil מדווח שלא הפעלתם את האתחול המאובטח, בצעו את השלבים שמפורטים בקטע פתרון בעיות בהגדרת האתחול המאובטח.

פתרון בעיות בהגדרת האתחול המאובטח

  1. פותחים את המשאב המותאם אישית של ה-VM בכלי לעריכה:

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n PROJECT_NAMESPACE \
      edit virtualmachines.virtualmachine.gdc.goog VM_NAME
    

    מחליפים את המשתנים הבאים:

    • ‫MANAGEMENT_API_SERVER: קובץ ה-kubeconfig של שרת ה-API לניהול.
    • ‫PROJECT_NAMESPACE: מרחב השמות של הפרויקט שבו נמצאת המכונה הווירטואלית.
    • ‫VM_NAME: שם המכונה הווירטואלית.
  2. מחפשים שדות או ערכים חסרים, כמו שמוצג בשדה spec בקטע הפעלת אתחול מאובטח. אלה שדות חובה.

  3. אם חסרים שדות או שיש שדות שגויים, עורכים את spec כדי להוסיף את השדות החסרים ולתקן את הערכים השגויים.

  4. שומרים את הקובץ.

  5. פועלים לפי השלבים שמפורטים בקטע הפעלה מחדש של ה-VM.

אם השלבים הקודמים לא פתרו את הבעיה, בדקו את המסמכים של מערכת ההפעלה של ה-VM כדי לוודא שגרסת מערכת ההפעלה תומכת באתחול מאובטח.

הפעלת vTPM

הפעלת vTPM למכונה וירטואלית. כדי להשתמש במכונה וירטואלית שנקראת VM_NAME במרחב השמות של הפרויקט (PROJECT_NAMESPACE), צריך לפעול לפי ההוראות הבאות:

  1. אם המכונה הווירטואלית פועלת, צריך לעצור אותה לפני שמחילים את התיקון. אם תנסו לתקן את shieldConfig בזמן שהמכונה הווירטואלית פועלת, ה-API יחזיר שגיאת Forbidden: Changes to shieldConfig are not allowed while the VM is running. הוראות מפורטות זמינות במאמר עצירת מכונה וירטואלית.

  2. כדי להפעיל את vTPM, מעדכנים את המשאב המותאם אישית של ה-VM:

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n PROJECT_NAMESPACE \
      patch virtualmachines.virtualmachine.gdc.goog VM_NAME \
      --type merge --patch $'
    spec:
      shieldConfig:
        enableVtpm: true
    '
    

    מחליפים את המשתנים הבאים:

    • ‫MANAGEMENT_API_SERVER: קובץ ה-kubeconfig של שרת ה-API לניהול.
    • ‫PROJECT_NAMESPACE: מרחב השמות של הפרויקט שבו נמצאת המכונה הווירטואלית.
    • ‫VM_NAME: שם המכונה הווירטואלית.
  3. אחרי שמחילים את התיקון, מפעילים את המכונה הווירטואלית לפי ההוראות להפעלת מכונה וירטואלית.

  4. מוודאים שהפעלתם את vTPM. יוצרים חיבור SSH למכונה הווירטואלית ומריצים את הפקודה הבאה:

    dmesg | grep -i tpm
    

    אם הפעלתם בהצלחה את vTPM, הפקודה תחזיר את מודול ה-TPM כחלק מטבלאות ה-ACPI. הפלט אמור להיראות כך:

    [    7.620985] tpm_tis MSFT0101:00: 2.0 TPM (device-id 0x1, rev-id 1)
    

    אם מודול ה-TPM לא מוצג ב-ACPI tables, פועלים לפי השלבים שמפורטים בקטע פתרון בעיות בהגדרת vTPM.

פתרון בעיות בהגדרת vTPM

  1. פותחים את המשאב המותאם אישית של ה-VM בכלי לעריכה:

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n PROJECT_NAMESPACE \
      edit virtualmachines.virtualmachine.gdc.goog VM_NAME
    

    מחליפים את המשתנים הבאים:

    • ‫MANAGEMENT_API_SERVER: קובץ ה-kubeconfig של שרת ה-API לניהול.
    • ‫PROJECT_NAMESPACE: מרחב השמות של הפרויקט שבו נמצאת המכונה הווירטואלית.
    • ‫VM_NAME: שם המכונה הווירטואלית.
  2. מחפשים שדות או ערכים חסרים, כמו שמוצג בשדה spec בקטע הפעלת vTPM. אלה שדות חובה.

  3. אם חסרים שדות או שיש שדות שגויים, עורכים את spec כדי להוסיף את השדות החסרים ולתקן את הערכים השגויים.

  4. שומרים את הקובץ.

  5. פועלים לפי השלבים שמפורטים בקטע הפעלה מחדש של ה-VM.

אם הבעיה לא נפתרה, צריך לבדוק במסמכי התיעוד של מערכת ההפעלה של ה-VM אם גרסת מערכת ההפעלה תומכת ב-vTPM.