גישה ל-vTPM ולפרטי אימות בצמתים של Confidential GKE

עומסי העבודה שאתם מריצים ב-Confidential Google Kubernetes Engine Nodes יכולים לגשת לתכונות שלמות ואבטחה של הפלטפורמה ולהשתמש בהן, כמו מודולים וירטואליים של Trusted Platform (vTPM) ודוחות אימות (attestation) של Confidential Computing. במסמך הזה נסביר למהנדסי אבטחה איך להפוך מכשירי vTPM ומכשירים מבוססי-חומרה לגלויים לעומסי עבודה של GKE, כדי לבצע משימות כמו אימות (attestation) מרחוק, איטום סודות ויצירת מספרים אקראיים.

כדאי לעיין במקורות המידע הבאים:

טכנולוגיית ה-Confidential Computing הספציפית שבה אתם משתמשים תלויה במודל האיומים ובדרישות האבטחה של הארגון שלכם. מידע נוסף זמין במאמר בנושא טכנולוגיות של Confidential Computing.

משימות שקשורות ל-Confidential Computing

אפשר לגשת ל-vTPM ולמודולים של חומרה מ-Pods שפועלים בצמתים של Confidential GKE. אפשר להשתמש במודולים האלה כדי לבצע פעולות קריפטוגרפיות כמו איטום סודות או אימות מרחוק. המודולים הספציפיים שמשמשים למשימות האלה תלויים בטכנולוגיית Confidential Computing שבה נעשה שימוש בצמתים, באופן הבא:

  • איטום סודות: בכל הטכנולוגיות של Confidential Computing, עומסי עבודה יכולים להשתמש ב-vTPM של מכונה וירטואלית מוגנת כבסיס מהימן לאיטום סודות.
  • אימות מרחוק: עומסי עבודה יכולים להשתמש באחד מהמודולים הבאים לאימות מרחוק:

    • AMD SEV: ‏ vTPM של מכונה וירטואלית מוגנת.
    • AMD SEV-SNP: מעבד AMD מאובטח שמבוסס על חומרה.
    • Intel TDX: מודול Intel TDX מבוסס-חומרה.

    למידע נוסף על אופן הפעולה של אימות מרחוק בכל אחת מהטכנולוגיות האלה של Confidential Computing, אפשר לעיין במאמר ארכיטקטורת האימות והראיות.

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

לפני שמתחילים, חשוב לוודא שביצעתם את הפעולות הבאות:

  • מפעילים את ממשק Google Kubernetes Engine API.
  • הפעלת Google Kubernetes Engine API
  • כדי להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז לאתחל את ה-CLI של gcloud. אם התקנתם בעבר את ה-CLI של gcloud, מריצים את הפקודה gcloud components update כדי לקבל את הגרסה העדכנית. יכול להיות שגרסאות קודמות של ה-CLI של gcloud לא יתמכו בהרצת הפקודות שמופיעות במסמך הזה.

דרישות

אפשר להשתמש ב-Confidential GKE Nodes בתנאים הבאים:

  • האשכולות ומאגרי הצמתים צריכים להריץ אחת מהגרסאות הבאות, בהתאם למודול Confidential Computing שרוצים לגשת אליו:

    • vTPMs: כל גרסה של GKE.
    • מכשירים מבוססי חומרה של AMD SEV-SNP: GKE גרסה ‎1.33.5-gke.1350000 ואילך או גרסה ‎1.34.1-gke.2037000 ואילך.
    • מכשירים מבוססי-חומרה של Intel TDX: GKE גרסה ‎1.33.5-gke.1697000 ואילך או גרסה ‎1.34.1-gke.2909000 ואילך.
  • מאגרי הצמתים צריכים להיות במיקום של Compute Engine שבו יש את סוגי המכונות המתאימים. מידע נוסף על זמינות אזורית זמין במאמר סוגי מכונות, מעבדים ותחומים.

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

התקנת פלאגין למכשיר

כדי שמידע על תקינות ואבטחה יהיה גלוי ל-Pods של GKE, צריך להתקין תוסף למכשיר. כדי להשתמש ב-DaemonSet להתקנת הפלאגין, מבצעים את השלבים הבאים:

  1. מתחברים לאשכול:

    gcloud container clusters get-credentials CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION
    

    מחליפים את מה שכתוב בשדות הבאים:

    • CLUSTER_NAME: השם של האשכול.
    • CONTROL_PLANE_LOCATION: האזור או האזור של מישור הבקרה של האשכול, למשל us-central1 או us-central1-a.
  2. יוצרים את cc-device-plugin DaemonSet:

    kubectl create -f https://raw.githubusercontent.com/google/cc-device-plugin/main/manifests/cc-device-plugin.yaml
    

אחרי שיוצרים את DaemonSet, כל מכשירי Confidential Computing בצמתים של Confidential GKE Nodes הופכים לגלויים ל-Pods שפועלים בצמתים האלה.

גישה למכשירים עם Confidential Computing מ-Pods

אחרי שיוצרים את DaemonSet כדי להתקין את תוסף המכשיר, אפשר לגשת ל-vTPM ולמכשירים מבוססי-חומרה מ-Pods באופן דומה לאופן שבו מבקשים משאבים מורחבים אחרים ב-Kubernetes. בקטעים הבאים מוסבר איך לגשת ל-vTPM מכל Pod ואיך לגשת למודולים מבוססי-חומרה בצמתים של AMD SEV-SNP ו-Intel TDX.

גישה ל-vTPM מ-Pods

כדי לגשת ל-vTPM של מכונה וירטואלית מוגנת מכל Pod שפועל בצמתים של Confidential GKE, מוסיפים את המכשיר google.com/cc למגבלות המשאבים של הקונטיינר. בשלבים הבאים מוסבר איך לבקש גישה ל-vTPM בתרמיל לדוגמה:

  1. שומרים את מניפסט ה-Pod הבא בשם example-vtpm-pod.yaml:

    apiVersion: v1
    kind: Pod
    metadata:
    name: my-vtpm-pod
    spec:
    containers:
    - name: test-vtpm
      image: ubuntu
      command: ["/bin/sh", "-c", "ls -l /dev/tpmrm0; sleep 3600"]
      ports:
      - containerPort: 8080
        name: http
      resources:
        limits:
          google.com/cc: 1
    
  2. יוצרים את הפוד:

    kubectl apply -f example-vtpm-pod.yaml
    

    ל-Pod יש גישה למכשיר /dev/tpmrm0.

  3. כדי לוודא של-Pod יש גישה ל-vTPM, בודקים את יומני ה-Pod:

    kubectl logs my-vtpm-pod
    

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

אפשר לבצע פעולות במכשיר מתוך קוד האפליקציה. לדוגמה, אפשר להשתמש בספריית Go-TPM כדי לתקשר עם ה-vTPM ולבצע משימות כמו איטום. אם משתמשים ב-AMD SEV, אפשר גם להשתמש ב-vTPM כדי לבצע אימות מרחוק של מופע המכונה הווירטואלית הסודית.

גישה למודולים מבוססי-חומרה מ-Pods

אם אתם משתמשים ב-AMD SEV-SNP או ב-Intel TDX, אתם יכולים גם לגשת למודולים המתאימים שמבוססים על חומרה ב-Pods על ידי ציון הסלקטור המתאים במגבלות משאבי הקונטיינר. חובה להשתמש במודולים האלה כדי לבצע אימות מרחוק של צמתים שמשתמשים ב-AMD SEV-SNP וב-Intel TDX, כי vTPM הוא לא שורש המהימנות למדידות בטכנולוגיות האלה.

השלבים הבאים מסבירים איך לבקש גישה למעבד המאובטח של AMD או למודול Intel TDX:

  1. שומרים אחת מהדוגמאות הבאות של Pod:

    • בקשת מכשירי AMD SEV-SNP:

      apiVersion: v1
      kind: Pod
      metadata:
        name: snp-test-pod
      spec:
        containers:
        - name: test-container
          image: alpine
          command: ["/bin/sh", "-c"]
          args:
            - |
              echo "Checking for SEV-SNP device..."
              ls -l /dev/sev-guest
              echo "SNP container started successfully"
              sleep 3600
          resources:
            limits:
              amd.com/sev-snp: "1"
            requests:
              amd.com/sev-snp: "1"
        nodeSelector:
          cloud.google.com/gke-confidential-nodes-instance-type: SEV_SNP

    • בקשת מכשירי Intel TDX:

      apiVersion: v1
      kind: Pod
      metadata:
        name: tdx-test-pod
      spec:
        containers:
        - name: test-container
          image: alpine
          command: ["/bin/sh", "-c"]
          args:
            - |
              echo "Checking for TDX device..."
              ls -l /dev/tdx*
              echo "TDX container started successfully"
              sleep 3600
          resources:
            limits:
              intel.com/tdx: "1"
            requests:
              intel.com/tdx: "1"
        nodeSelector:
          cloud.google.com/gke-confidential-nodes-instance-type: TDX

  2. יוצרים את הפוד:

    kubectl create -f PATH_TO_POD_MANIFEST
    

    מחליפים את PATH_TO_POD_MANIFEST בנתיב לקובץ המניפסט של ה-Pod ששמרתם.

    ל-Pods יש גישה לאחד מהמכשירים הבאים:

    • /dev/sev-guest ל-AMD SEV-SNP.
    • /dev/tdx_guest ל-Intel TDX.
  3. כדי לוודא של-Pod יש גישה למכשיר, בודקים את יומני ה-Pod:

    kubectl logs POD_NAME
    

    מחליפים את POD_NAME בשם של ה-Pod לדוגמה שפרסתם בשלב הקודם.

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

המאמרים הבאים