אתם יכולים לאמת את התקינות של תמונת המכונה הווירטואלית (VM) ב-Compute Engine שמשמשת את Google Kubernetes Engine (GKE) למכונות וירטואליות של מישור הבקרה. בדף הזה מופיעות הוראות לצוות אבטחה שעוקב אחרי יומני רמת הבקרה כדי לאמת את הדברים הבאים:
- המכונה הווירטואלית של מישור הבקרה הופעלה עם קושחה מקורית ותוכנות הפעלה אחרות שאומתו באופן קריפטוגרפי על ידי אתחול מאובטח וניטור של התקינות.
- המכונה הווירטואלית של מישור הבקרה הופעלה מקובץ אימג' אותנטי של מערכת ההפעלה של GKE.
אפשר גם לבצע את האימות הזה לקובצי אימג' של מערכת ההפעלה ולתקינות של ההפעלה בצמתים.
בדף הזה מתוארת אחת מהתכונות האופציונליות של מישור הבקרה ב-GKE, שמאפשרת לבצע משימות כמו אימות של מצב האבטחה של מישור הבקרה או הגדרה של הצפנה וחתימה על פרטי כניסה במישור הבקרה באמצעות מפתחות שאתם מנהלים. מידע נוסף זמין במאמר מידע על שליטה במישור הבקרה של GKE.
כברירת מחדל, Google Cloud מחיל אמצעי אבטחה שונים על מישור הבקרה המנוהל. בדף הזה מתוארות יכולות אופציונליות שמאפשרות לכם יותר שליטה במישור הבקרה של GKE או יותר ניראות שלו.
מידע על אימות התקינות של מכונות וירטואליות
כברירת מחדל, כל המופעים של רמת הבקרה של GKE הם מכונות וירטואליות מוגנות, שהן מכונות וירטואליות מוקשחות שמשתמשות ביכולות אבטחה כמו אתחול מאובטח ומדוד, מודול פלטפורמה וירטואלית מהימנה (vTPM) וקושחת UEFI. בנוסף, בכל הצמתים של GKE מופעל ניטור של התקינות, שמאמת את רצף האתחול של כל מכונה וירטואלית מוגנת בהשוואה לרצף אתחול בסיסי 'טוב'. האימות הזה מחזיר תוצאות של הצלחה או כישלון לכל שלב ברצף האתחול, ומוסיף את התוצאות האלה ל-Cloud Logging. התכונה 'מעקב אחר תקינות' מופעלת כברירת מחדל בכל אשכולות GKE ומאמתת את השלבים הבאים:
- רצף אתחול מוקדם: מהרגע שקושחת ה-UEFI מתחילה לפעול עד שמנהל האתחול משתלט. נוסף ליומני ה-VM בשם
earlyBootReportEvent. - רצף אתחול מאוחר: מהרגע שתוכנת האתחול מקבלת שליטה ועד שהקרנל של מערכת ההפעלה מקבל שליטה. נוסף ליומני ה-VM בתור
lateBootReportEvent.
בנוסף, GKE מוסיף ל-Logging יומנים של יצירת מכונות וירטואליות במישור הבקרה. היומנים האלה מכילים מטא-נתונים שמזהים את המכונה וכוללים פרטים על תמונת מכונת ה-VM ועל רצף האתחול. Google Cloud מפרסמת אימות סיכום (VSA) לכל תמונת מכונת VM של מישור הבקרה של GKE במאגר gke-vsa ב-GitHub. ב-VSA נעשה שימוש ב-framework של in-toto לאישורים. אתם יכולים לאמת את יומני ה-VM של מישור הבקרה של האשכולות שלכם מול ה-VSA המתאימים, כדי לוודא שצומתי מישור הבקרה הופעלו כמצופה.
ביצוע האימותים האלה יכול לעזור לכם להשיג את המטרות הבאות:
- צריך לוודא שהתוכנה במישור הבקרה מוגנת על ידי אתחול מאובטח ומעקב אחר שלמות, שהיא תואמת לקוד המקור המיועד ושמדובר באותה תמונה שבה משתמשים לקוחות אחרים של Google Cloud .
- להגביר את האמון שלכם באבטחת מישור הבקרה של GKE.
תמחור
התכונה הזו מוצעת ב-GKE בלי עלות נוספת.
לפני שמתחילים
לפני שמתחילים, חשוב לוודא שביצעתם את המשימות הבאות:
- מפעילים את ממשק ה-API של Google Kubernetes Engine. הפעלת Google Kubernetes Engine API
- כדי להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז לאתחל את ה-CLI של gcloud. אם התקנתם בעבר את ה-CLI של gcloud, מריצים את הפקודה
gcloud components updateכדי לקבל את הגרסה העדכנית. יכול להיות שבגרסאות קודמות של ה-CLI של gcloud אי אפשר להריץ את הפקודות שבמסמך הזה.
-
מפעילים את Cloud Logging API, אם הוא עדיין לא מופעל.
התפקידים שנדרשים כדי להפעיל ממשקי API
כדי להפעיל ממשקי API, צריך את ההרשאה
serviceusage.services.enable. אם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד 'בעלים' (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד 'אדמין בממשק 'שימוש בשירות'' (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידים - מוודאים שכבר יש לכם אשכול במצב אוטומטי או במצב רגיל ב-GKE, בגרסה 1.29 ואילך.
התפקידים הנדרשים
כדי לקבל את ההרשאות שדרושות לאימות שלמות המכונה הווירטואלית של מישור הבקרה, צריך לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים בפרויקט:
-
יצירה של אשכולות ואינטראקציה איתם:
אדמין אשכולים של Kubernetes Engine (
roles/container.clusterAdmin) -
גישה ליומנים ועיבוד שלהם:
מציג היומנים (
roles/logging.viewer)
להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.
יכול להיות שאפשר לקבל את ההרשאות הנדרשות גם באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש.
בדיקה אם יש שלבים שנכשלו ברצף ההפעלה
ניטור התקינות מוסיף יומן ל-Logging אם מכונה וירטואלית של מישור הבקרה נכשלת או משלימה בהצלחה שלב ברצף האתחול. כדי לראות אירועי הפעלה שנכשלו, מריצים את הפקודות הבאות:
נכנסים לדף Logs Explorer במסוף Google Cloud :
בשדה Query, מציינים את השאילתה הבאה:
jsonPayload.@type="type.googleapis.com/cloud_integrity.IntegrityEvent" jsonPayload.earlyBootReportEvent.policyEvaluationPassed="false" OR jsonPayload.lateBootReportEvent.policyEvaluationPassed="false" jsonPayload.metadata.isKubernetesControlPlaneVM="true"אפשר גם לבדוק אם יש אירועי הפעלה מוצלחים על ידי החלפת
falseב-trueבשאילתה הזו.לוחצים על Run query. אם לא מוצגות תוצאות, סימן שהמכונות הווירטואליות של מישור הבקרה עברו את כל בדיקות המעקב אחר השלמות. אם מופיע פלט, ממשיכים לשלב הבא כדי לזהות את האשכול המתאים.
במאגר היומנים של בדיקת תקינות האתחול שנכשלה, מעתיקים את הערך בשדה
resource.labels.instance_id.בשדה Query, מציינים את השאילתה הבאה:
protoPayload.@type="type.googleapis.com/google.cloud.audit.AuditLog" protoPayload.metadata.isKubernetesControlPlaneVM="true" resource.labels.instance_id="INSTANCE_ID" protoPayload.methodName="v1.compute.instances.insert"מחליפים את
INSTANCE_IDבערך של השדהinstance_idמהשלב הקודם.לוחצים על Run query. הערך בשדה
protoPayload.metadata.parentResource.parentResourceIdהוא מזהה אשכול GKE.מאתרים את השם של אשכול GKE:
gcloud asset query \ --organization=ORGANIZATION_ID \ --statement="SELECT name FROM container_googleapis_com_Cluster WHERE resource.data.id='CLUSTER_ID';"מחליפים את מה שכתוב בשדות הבאים:
-
ORGANIZATION_ID: המזהה המספרי שלGoogle Cloud הארגון. -
CLUSTER_ID: הערך של השדהprotoPayload.metadata.parentResource.parentResourceIdמהשלב הקודם.
הפלט אמור להיראות כך:
# lines omitted for clarity //container.googleapis.com/projects/PROJECT_ID/locations/LOCATION/clusters/CLUSTER_NAMEהפלט הזה כולל את השדות הבאים:
-
PROJECT_ID: מזהה הפרויקט ב- Google Cloud . -
LOCATION: המיקום של האשכול. -
CLUSTER_NAME: שם האשכול.
-
איתור ובדיקה של יומני ה-VM של מישור הבקרה
יומני יצירת המכונות הווירטואליות ב-Compute Engine שתואמים לאשכולות GKE מאוחסנים במאגר היומנים _Default.
כדי למצוא את יומני היצירה של המכונות הווירטואליות במישור הבקרה של האשכול ולאחזר את המטא-נתונים האלה:
נכנסים לדף Logs Explorer במסוף Google Cloud :
בשדה Query, מציינים את השאילתה הבאה:
resource.type="gce_instance" protoPayload.methodName="v1.compute.instances.insert" protoPayload.metadata.isKubernetesControlPlaneVM="true"לוחצים על Run query. אם לא מוצגות תוצאות, צריך לוודא שאתם עומדים בכל הדרישות שמפורטות בקטע לפני שמתחילים.
בודקים את השדה
metadataבתוצאות השאילתה. הפלט אמור להיראות כך:# fields omitted for clarity "metadata": { "usedResources": { "attachedDisks": [ { "sourceImageId": "9046093115864736653", "sourceImage": "https://www.googleapis.com/compute/v1/projects/1234567890/global/images/gke-1302-gke1627000-cos-113-18244-85-49-c-pre", "isBootDisk": true } # fields omitted for clarityהשדה
metadataכולל את הפרטים הבאים:-
usedResources: רשימת המשאבים ששימשו ליצירת המכונה הווירטואלית. -
attachedDisks: דיסק האתחול של ה-VM. -
sourceImageId: המזהה הייחודי של קובץ האימג' של ה-VM. -
sourceImage: כתובת ה-URL של תמונת ה-VM של המקור. התחביר של הערך בשדה הזה הואhttps://www.googleapis.com/compute/v1/projects/PROJECT_NUMBER/global/images/IMAGE_NAME, כאשרPROJECT_NUMBERהוא מספר הפרויקט בבעלותGoogle Cloudשמארח את המכונות הווירטואליות של מישור הבקרה, ו-IMAGE_NAMEהוא שם התמונה ששימשה לאתחול המכונה הווירטואלית. -
isBootDisk: מזהה בוליאני שמציין אם הדיסק הזה שימש כדיסק האתחול של המכונה הווירטואלית.
-
איתור ואימות של VSA לתמונות של מכונות וירטואליות במישור הבקרה
בקטע הזה, אתם מאתרים את ה-VSA שתואם לתמונת ה-VM של מישור הבקרה במאגר gke-vsa ב-GitHub. אחר כך משתמשים בכלי שנקרא slsa-verifier שמופיע במסגרת Supply chain Levels for Software Artifacts (SLSA) כדי לאמת את ה-VSA. צריך את הנתונים הבאים מיומן יצירת המכונה הווירטואלית של מישור הבקרה:
- מזהה תמונת ה-VM
- מספר הפרויקט בבעלות Google Cloudשמארח את המכונות הווירטואליות
- שם קובץ אימג' של מערכת ההפעלה ששימש לאתחול ה-VM
הפורמט של שם הקובץ שמתאים ל-VM של מישור הבקרה הוא:
IMAGE_NAME:IMAGE_ID.intoto.jsonl
מחליפים את מה שכתוב בשדות הבאים:
-
IMAGE_NAME: שם קובץ האימג' של ה-VM, שהוא המחרוזת אחרי/images/בשדהattachedDisks.sourceImageביומן הביקורת של ה-VM מהקטע הקודם. לדוגמה,gke-1302-gke1627000-cos-113-18244-85-49-c-pre. -
IMAGE_ID: מזהה תמונת ה-VM, שהוא הערך של השדהattachedDisks.sourceImageIdביומן הביקורת של ה-VM מהקטע הקודם. לדוגמה:9046093115864736653.
כדי למצוא ולאמת את ה-VSA כשאתם יודעים את שם הקובץ של ה-VSA, בצעו את הפעולות הבאות:
- פותחים את מאגר הנתונים של GitHub
gke-vsa. - בספרייה gke-master-images, מאתרים את הקובץ שמתאים לתמונת מכונת ה-VM. לדוגמה,
https://github.com/GoogleCloudPlatform/gke-vsa/blob/main/gke-master-images:78064567238/IMAGE_NAME:IMAGE_ID.intoto.jsonl - מורידים את קובץ ה-VSA.
- מתקינים את הכלי
slsa-verifier. שומרים את המפתח הציבורי לאימות ה-VSA בקובץ בשם
vsa_signing_public_key:אימות ה-VSA:
slsa-verifier verify-vsa \ --attestation-path=PATH_TO_VSA_FILE \ --resource-uri=gce_image://gke-master-images:IMAGE_NAME \ --subject-digest=gce_image_id:IMAGE_ID\ --verifier-id=https://bcid.corp.google.com/verifier/bcid_package_enforcer/v0.1 \ --verified-level=BCID_L1 \ --verified-level=SLSA_BUILD_LEVEL_2 \ --public-key-path=PATH_TO_PUBLIC_KEY_FILE \ --public-key-id=keystore://76574:prod:vsa_signing_public_keyמחליפים את מה שכתוב בשדות הבאים:
-
PATH_TO_VSA_FILE: הנתיב לקובץ ה-VSA שהורדתם. -
IMAGE_NAME: השם של תמונת ה-VM, כמוgke-1302-gke1627000-cos-113-18244-85-49-c-pre. -
IMAGE_ID: מזהה קובץ האימג' של המכונה הווירטואלית, כמו9046093115864736653.
אם ה-VSA עובר את בדיקות האימות, הפלט הוא:
Verifying VSA: PASSED PASSED: SLSA verification passed-