Sandboxed API (SAPI) מבוסס על הפרויקט המבוסס Sandbox2. בדף הזה מוסבר על ארכיטקטורת העיצוב של SAPI ועל מושגים מרכזיים.
סקירה כללית
SAPI נועד לספק למפתחים כלים להכנת ספריות C/C++ לארגז חול, וגם את ממשקי ה-API שנדרשים לתקשורת עם גרסת ארגז החול של ספריות C/C++.
בתרשים הזה מוצגת הארכיטקטורה של ספריית C/C++ בארגז חול של SAPI:

SAPI גם מספק פרימיטיבים לסנכרון זיכרון ידני ואוטומטי (מבוסס על מאפייני מצביע מותאמים אישית) (מערכים, מבנים) בין ספריות SAPI לבין קוד המארח.
לבסוף, Transactions API ברמה גבוהה מאפשר מעקב אחרי ספריות SAPI, ומפעיל אותן מחדש אם הן נכשלות (למשל, בגלל הפרות אבטחה, קריסות או ניצול יתר של משאבים).
Sandbox2
פרויקט הקוד הפתוח Sandbox2 פותח ומנוהל על ידי מהנדסי האבטחה של Google, והוא טכנולוגיית הליבה של ארגז החול שמשמשת את SAPI. Sandbox2 מכיל שלושה רכיבים עיקריים: Sandbox Policy, Executor ו-Sandboxee.
מדיניות ארגז החול
מדיניות ארגז החול מגדירה את סביבת ההפעלה המוגבלת של הספרייה בארגז החול. כדי לעשות את זה, צריך להבהיר אילו קריאות מערכת אפשר להפעיל. ממשק ה-SAPI משתמש באותו מנגנון כמו Sandbox2. מידע נוסף על תכנון והגדרה של מדיניות ארגז חול מופיע בקטע בנושא מדיניות ארגז חול ובדף תחילת העבודה של Sandbox2.
כברירת מחדל, מחלקות של ארגז חול (sandbox) של SAPI שנוצרו מאתחלות באמצעות DefaultConfig (sapi::SandboxConfig::DefaultConfig()). DefaultConfig() מגדיר את ארגז החול (sandbox) עם:
- מדיניות ברירת מחדל של Sandbox2 שנבנתה באמצעות
sapi::Sandbox2Config::DefaultPolicyBuilder() - מגבלות ברירת המחדל על משאבים וזמן מתוך
sapi::Sandbox2Config::DefaultLimits() - התקשורת של הזיכרון המשותף מופעלת (הזיכרון המשותף משויך להרשאות ב-
DefaultPolicyBuilder()) - דגלים של שורת הפקודה שמוגדרים כברירת מחדל (
sapi::SandboxConfig::DefaultFlags()) ומשתני סביבה (sapi::SandboxConfig::DefaultEnvironmentVariables()), שמגדירים את רישום ברירת המחדל ביומן ואת אופן הפעולה בזמן הריצה ב-sandboxee
כדי להתאים אישית את המדיניות או את ההגדרות של ארגז החול, מתחילים מ-sapi::SandboxConfig::DefaultConfig(), משנים את הערך המוחזר של sapi::SandboxConfig ומעבירים אותו ל-constructor שנוצר של ארגז החול (או מגדירים מחלקת משנה מותאמת אישית של ארגז החול בקובץ כותרת sandbox.h שמועבר לכלל ה-build של sapi_library). לדוגמה, אפשר ליצור מדיניות החל מ-sapi::Sandbox2Config::DefaultPolicyBuilder() ולשרשר כללים נוספים (או ליצור PolicyBuilder ישירות כשנדרשת הגדרה מגבילה יותר), וכשמוסיפים פלאגים או משתני סביבה, מתחילים מ-sapi::SandboxConfig::DefaultFlags() או מ-sapi::SandboxConfig::DefaultEnvironmentVariables() כדי לשמור על הגדרות הבסיס.
ספרייה מוגבלת לארגז חול
זוהי ספריית C/C++ בארגז החול שתופעל בסביבת ארגז החול המוגבלת שסופקה על ידי Sandbox2. בסופו של דבר, Sandboxed Library חושפת את הפונקציונליות הנדרשת שאפשר להשתמש בה ב-Host Code.
הספרייה המוגנת באמצעות ארגז חול מבוססת על כלל הבנייה sapi_library, שבו אפשר לציין מדיניות מותאמת אישית של ארגז חול שמגדירה את סביבת ההרצה המוגבלת. יכול להיות שתצטרכו לכתוב קוד wrapper או קוד stub (ראו libcurl), אבל לא מצופה מכם לשנות את קוד המקור של ספריית C/C++ בזמן ההכנה של גרסת ה-SAPI.
אובייקט SAPI ו-RPC Stub
אובייקט SAPI הוא אובייקט C++ שחושף את ה-API של הספרייה בארגז החול. היא מעבירה קריאות מקוד המארח אל RPC Stub, שמוטמע בספריית SAPI יחד עם ספריית Sandboxed.
שני הרכיבים האלה נוצרים באופן אוטומטי על ידי מערכת ה-build באמצעות כלל ה-build sapi_library(). SAPI תומך בשתי מערכות בנייה: Bazel של Google ו-CMake.
קוד המארח
קוד המארח הוא מה שמטמיע את הלוגיקה שסופקה על ידי ספריית SAPI. זהו הרכיב שהיה צורך בגרסה ללא ארגז חול של ספריית C/C++ כדי להפעיל אותו. לכן, קוד המארח קורא לפונקציות שיוצאו על ידי ספריית SAPI, מעביר נתונים לארגז החול ומקבל ממנו נתונים.
צריך להתאים את קוד המארח כדי להשתמש בספריית SAPI. ההבדל העיקרי הוא שאי אפשר לקרוא לפונקציות של הספרייה, כי הספרייה נמצאת בתהליך נפרד בארגז חול. לכן, SAPI מספק כלים שיוצרים אובייקט SAPI שמבצע proxy לקריאות לספריית SAPI.
מושגים
כללי ה-build של Bazel
פרויקט SAPI מספק שני כללי build של Bazel להרצת ארגז חול בספריית C/C++:
-
sapi_library()– יוצר את כל הפלטים שנדרשים כדי להפעיל את ספריית C/C++ בארגז חול בתור Sandboxee של Sandbox2. אפשר להשתמש בפלט של ה-build כתלות בכללcc_binary()שמשמש ליצירת קובץ הבינארי של קוד המארח. -
sapi_interface()– יוצר באופן אוטומטי את הכותרת שאפשר לכלול בקובץ הבינארי של קוד המארח.
הסבר מפורט יותר על כללי ה-build זמין במאמר כללי build.
משתנים
SAPI מספק מספר סוגים מיוחדים, שנקראים SAPI Types, שמומלץ להשתמש בהם ב-Host Code. הסיבה העיקרית לצורך ב-SAPI Types היא התהליך, ולכן הזיכרון, הבידוד בין קוד המארח לבין הספרייה בתוך ארגז החול.
הסבר מפורט יותר על הנושא הזה וסקירה כללית של כמה סוגי SAPI נפוצים זמינים במאמר משתנים.
עסקאות
כמו שהוסבר למעלה, כל קריאה ל-API לספרייה בארגז חול מועברת דרך שכבת RPC. כדי לטפל בכשל בשכבה הזו, צריך להטמיע טיפול מתאים בשגיאות. מודול SAPI Transaction מספק את המנגנון הדרוש כדי לוודא שכל הקריאות לספרייה בסביבת ארגז חול הושלמו ללא בעיות ברמת ה-RPC, או שמוחזרות עם שגיאה רלוונטית.
הסבר מפורט יותר על הנושא הזה זמין במאמר עסקאות.
תחילת העבודה
כדי להגדיר את פרויקט ה-API הראשון בארגז חול, כדאי לקרוא את המאמר תחילת העבודה.