פרויקט bpftime מפתח יישום של eBPF במרחב המשתמש

מוצג פרויקט bpftime, המפתח זמן ריצה ומכונה וירטואלית לביצוע מטפלי eBPF במרחב המשתמש. Bpftime מאפשר לתוכניות מעקב ותהליכי התערבות eBPF לפעול במלואן במרחב המשתמש, תוך שימוש בתכונות כגון uprobe וירוט שיחות מערכת פרוגרמטית. יצוין כי על ידי ביטול מתגי הקשר מיותרים, bpftime יכול להשיג הפחתה של פי עשרה בתקורה בהשוואה לשימוש בפונקציונליות uprobe ו-uretprobe המסופקת על ידי ליבת לינוקס. בנוסף, bpftime מפשט מאוד את איתור הבאגים, יכול להיות בשימוש במערכות ללא ליבת לינוקס, ואינו דורש את ההרשאות המוגברות הנדרשות לטעינת יישום eBPF לתוך הליבה. קוד הפרויקט כתוב ב-C/C++ ומופץ תחת רישיון MIT.

יירוט שיחות מערכת ואינטגרציה של בדיקות uprobe מיושם בטכניקה של שכתוב קוד הפעלה מחדש (שכתוב בינארי), שבו שיחות לשיחות מערכת, נקודות כניסה ופונקציות מקומיות מוחלפות במעבר למטפלי ניפוי באגים באמצעות שינוי קוד המכונה של היישום המבצע, שהוא הרבה יותר יעיל מארגון יירוט באמצעות uprobe ברמת ליבת לינוקס.

נתמכות פעולות של החלפה או שינוי של פונקציות, הצמדת מטפלים (hooks) ומסננים, הפנייה מחדש, חסימה או החלפת פרמטרים של קריאות מערכת, יירוט נקודות כניסה ויציאה של פונקציות, כמו גם החלפת מטפל בהיסט שרירותי בקוד. ניתן לצרף את Bpftime לכל תהליך פועל במערכת ללא צורך בהפעלה מחדש או בנייה מחדש. החלפה של bpftime לתהליכים יכולה להיעשות להפעלת תהליכים באמצעות ptrace, ולטעינת אלה באמצעות LD_PRELOAD.

מפותח זמן ריצה בתוך bpftime המאפשר לצרף תוכניות eBPF לנקודות מעקב אחר קריאות מערכת ולבצע uprobe; מכונה וירטואלית eBPF עם JIT לביצוע מבודד של תוכניות eBPF ברמת תהליך המשתמש (קומפילציית AOT נתמכת בנוסף); תהליך רקע לאינטראקציה עם הליבה ומתן תאימות לתת-מערכת uprobe של הליבה (bpftime תומך בטעינת eBPF למרחב המשתמש מהליבה כדי לספק שיתוף פעולה עם תוכניות eBPF בליבה, המשמש, למשל, לעיבוד kprobe או להגדרת מסנני רשת).

המכונה הוירטואלית eBPF מעוצבת כספריית פלאג-אין ומספקת API דומה ל-ubpf, המאפשרת להשתמש בה לשילוב פונקציונליות eBPF בפרויקטים אחרים. לצבירה מסכם של נתונים ממספר תהליכים, נתמכת יצירה של מפות eBPF משותפות הממוקמות בזיכרון משותף. יחד עם bpftime, ניתן להשתמש במטפלי eBPF סטנדרטיים שנכתבו לשימוש בליבה, ולהרכבה ניתן להשתמש בכלים סטנדרטיים מבוססי clang וכלים libpf.

עם bpftime, ניתן להפעיל מערכות מעקב כגון BCC, bpftrace ו-Deepflow במרחב המשתמש. לדוגמה, הדגמנו את השימוש בסקריפט sslsniff ממסגרת BCC כדי לנתח ולשמור תעבורה מוצפנת ב-nginx. בבדיקות שנערכו, ביצועי nginx יורדים ב-58% בעת ביצוע sslsniff בצד הקרנל, וב-12.3% בעת העברת המטפל למרחב המשתמש.

ארכיטקטורת מעקב אחר תהליכים באמצעות eBPF המקורי בקרנל:

פרויקט bpftime מפתח יישום של eBPF במרחב המשתמש

ארכיטקטורת מעקב אחר שטח משתמש באמצעות bpftime:

פרויקט bpftime מפתח יישום של eBPF במרחב המשתמש

מצב היברידי, שבו bpftime עובד יחד עם eBPF בליבה, למשל, כדי להתקין מסנני רשת או להעביר מטפלים בודדים למרחב המשתמש:

פרויקט bpftime מפתח יישום של eBPF במרחב המשתמש

תוכניות עתידיות כוללות: היכולת להחליף חריגים (הזרקת תקלות); תיקון חם (Hot Patching) כדי לשנות את היגיון הפעולה או לתקן שגיאות במכלולים בינאריים; יצירת מודול עבור Nginx המאפשר לך ליצור הרחבות באמצעות תוכניות eBPF (לדוגמה, לבחירת מסלול דינמי, שמירה במטמון, החלת מדיניות אבטחה ואיזון עומסים); הרחבת היכולות של תת-המערכת FUSE (לדוגמה, יצירת הרחבות ל-FS לצורך שמירה במטמון או בקרת גישה בצורה של תוכניות eBPF).

מקור: OpenNet.ru

הוספת תגובה