شرح واجهة برمجة تطبيقات وضع الحماية

تستند واجهة برمجة التطبيقات Sandboxed API (SAPI) إلى مشروع Sandbox2 المعروف. توضّح هذه الصفحة بنية تصميم SAPI والمفاهيم الأساسية.

نظرة عامة

تم تصميم SAPI لتزويد المطوّرين بأدوات لإعداد مكتبات C/C++ للتشغيل في بيئة معزولة، بالإضافة إلى واجهات برمجة التطبيقات اللازمة للتواصل مع الإصدار المعزول من مكتبات C/C++.

يوضّح هذا الرسم التخطيطي بنية مكتبة C/C++ في بيئة معزولة من SAPI:

مخطّط بياني لـ SAPI

توفّر SAPI أيضًا عناصر أساسية لمزامنة الذاكرة يدويًا وتلقائيًا (استنادًا إلى سمات المؤشر المخصّصة) (المصفوفات والبُنى) بين مكتبات SAPI والرمز المضيف.

أخيرًا، تتيح واجهة برمجة التطبيقات Transactions API العالية المستوى مراقبة مكتبات SAPI وإعادة تشغيلها في حال تعذّر تشغيلها (مثلاً، بسبب انتهاكات الأمان أو الأعطال أو استنفاد الموارد).

Sandbox2

تم تطوير مشروع Sandbox2 المفتوح المصدر وصيانته من قِبل مهندسي الأمان في Google، وهو تكنولوجيا وضع الحماية الأساسية التي تستخدمها SAPI. يحتوي Sandbox2 على ثلاثة مكوّنات رئيسية، وهي سياسة Sandbox والمشغّل وSandboxee.

سياسة وضع الحماية

تحدّد سياسة وضع الحماية بيئة التنفيذ المقيَّدة للمكتبة المحمية. ويتم تحقيق ذلك من خلال توضيح أي من استدعاءات النظام يمكن تنفيذها. تستخدم SAPI الآلية نفسها التي تستخدمها Sandbox2، لذا يُرجى الاطّلاع على قسم سياسة وضع الحماية وصفحة البدء في Sandbox2 لمزيد من المعلومات حول كيفية تصميم سياسة وضع الحماية وتحديدها.

يتم تلقائيًا إعداد فئات وضع الحماية SAPI التي تم إنشاؤها باستخدام DefaultConfig (sapi::SandboxConfig::DefaultConfig()). يضبط DefaultConfig() وضع الحماية باستخدام:

  • سياسة Sandbox2 تلقائية تم إنشاؤها باستخدام sapi::Sandbox2Config::DefaultPolicyBuilder()
  • الحدود القصوى التلقائية للموارد والوقت من sapi::Sandbox2Config::DefaultLimits()
  • تم تفعيل الاتصال بالذاكرة المشتركة (مقترنًا بأذونات الذاكرة المشتركة في DefaultPolicyBuilder())
  • علامات سطر الأوامر التلقائية (sapi::SandboxConfig::DefaultFlags()) ومتغيّرات البيئة (sapi::SandboxConfig::DefaultEnvironmentVariables()) التي تضبط التسجيل الأساسي وسلوك وقت التشغيل في وضع الحماية

لتخصيص سياسة وضع الحماية أو إعداداته، ابدأ من sapi::SandboxConfig::DefaultConfig()، وعدِّل sapi::SandboxConfig الذي تم عرضه، ثم مرِّره إلى أداة إنشاء وضع الحماية التي تم إنشاؤها (أو حدِّد فئة فرعية مخصّصة لوضع الحماية في ملف عنوان sandbox.h يتم تمريره إلى قاعدة إنشاء sapi_library). على سبيل المثال، يمكنك إنشاء سياسة تبدأ من sapi::Sandbox2Config::DefaultPolicyBuilder() وربط قواعد إضافية (أو إنشاء PolicyBuilder مباشرةً عندما تكون هناك حاجة إلى إعدادات أكثر تقييدًا)، وعند إضافة علامات أو متغيّرات بيئة، ابدأ من sapi::SandboxConfig::DefaultFlags() أو sapi::SandboxConfig::DefaultEnvironmentVariables() حتى يتم الحفاظ على الإعدادات الأساسية.

مكتبة معزولة

هذه هي مكتبة C/C++‎ المعزولة التي سيتم تنفيذها في بيئة وضع الحماية المقيَّدة التي يوفّرها Sandbox2. في النهاية، تعرض "المكتبة المحصورة في بيئة آمنة" الوظائف المطلوبة التي يمكن أن يستهلكها رمز التطبيق المضيف.

تم إنشاء "المكتبة المحصورة" باستخدام قاعدة الإنشاء sapi_library، والتي يمكنك فيها تحديد سياسة مخصّصة لوضع الحماية تحدّد بيئة التنفيذ المحظورة. استنادًا إلى المكتبة، قد تحتاج إلى كتابة رمز التغليف أو الرمز البديل (راجِع libcurl)، ولكن ليس عليك تغيير الرمز المصدر لمكتبة C/C++ أثناء إعداد إصدار SAPI.

عنصر SAPI وRPC Stub

SAPI Object هو عنصر C++‎ يعرض واجهة برمجة التطبيقات الخاصة بالمكتبة المعزولة. تعيد هذه العملية توجيه الطلبات من رمز المضيف إلى رمز RPC، الذي يكون مضمّنًا في مكتبة SAPI مع المكتبة المحصورة في بيئة آمنة.

يتم إنشاء هذين العنصرين تلقائيًا بواسطة نظام الإنشاء باستخدام قاعدة الإنشاء sapi_library(). تتوافق SAPI مع نظامَي إنشاء، وهما Bazel وCMake من Google.

رمز المضيف

رمز المضيف هو ما ينفّذ المنطق الذي توفّره مكتبة SAPI. وهي تستهلك الإصدار غير المحمي من مكتبة C/C++. وبالتالي، يستدعي رمز المضيف الدوال التي تم تصديرها من مكتبة SAPI، مع تمرير البيانات إلى الحماية وعزلها واستلام البيانات منها.

يجب تكييف رمز المضيف لاستخدام مكتبة SAPI. والأهم من ذلك، لا يمكن استدعاء دوال المكتبة لأنّ المكتبة تعمل في عملية منفصلة في وضع الحماية. لذلك، توفّر SAPI أدوات تنشئ عنصر SAPI يعمل كخادم وكيل للطلبات إلى مكتبة SAPI.

المفاهيم

قواعد إنشاء Bazel

يوفّر مشروع SAPI قاعدتَي إنشاء في Bazel لتوفير بيئة معزولة لمكتبة C/C++:

  • ‫sapi_library(): ينشئ جميع المخرجات اللازمة لوضع مكتبة C/C++‎ في وضع الحماية كـ Sandbox2 Sandboxee. يمكن استخدام ناتج عملية الإنشاء كعنصر تابع لقاعدة cc_binary() المستخدَمة لإنشاء ملف ثنائي لرمز المضيف.
  • sapi_interface(): لإنشاء العنوان الذي يمكن تضمينه في البرنامج الثنائي لرمز المضيف تلقائيًا

للحصول على شرح أكثر تفصيلاً حول قواعد الإنشاء، يُرجى الاطّلاع على قواعد الإنشاء.

المتغيّرات

توفّر واجهة SAPI عددًا من الأنواع الخاصة، تُعرف باسم أنواع SAPI، وننصح باستخدامها في رمز المضيف. السبب الرئيسي وراء الحاجة إلى أنواع SAPI هو عملية العزل، وبالتالي عزل الذاكرة، بين رمز المضيف ومكتبة وضع الحماية.

للحصول على شرح أكثر شمولاً لهذا الموضوع ونظرة عامة على بعض أنواع SAPI الشائعة الاستخدام، يُرجى الاطّلاع على المتغيّرات.

المعاملات

كما هو موضّح أعلاه، يتم تمرير أي طلب بيانات من واجهة برمجة التطبيقات إلى مكتبة معزولة عبر طبقة RPC. لتتمكّن من معالجة أي عطل في هذه الطبقة، عليك تنفيذ إجراءات مناسبة لمعالجة الأخطاء. توفّر وحدة SAPI Transaction الآلية اللازمة للتأكّد من اكتمال جميع الطلبات إلى مكتبة معزولة بدون أي مشاكل على مستوى استدعاء الإجراء عن بُعد (RPC)، أو يتم عرضها مع ظهور خطأ ذي صلة.

للحصول على شرح أكثر شمولاً لهذا الموضوع، يُرجى الاطّلاع على المعاملات.

الخطوات الأولى

يمكنك قراءة صفحة البدء لإعداد أول مشروع لك في Sandboxed API.