सैंडबॉक्स एपीआई के बारे में जानकारी

Sandboxed API (एसएपीआई), well-established Sandbox2 प्रोजेक्ट पर आधारित है. इस पेज पर, एसएपीआई के डिज़ाइन आर्किटेक्चर और मुख्य कॉन्सेप्ट के बारे में बताया गया है.

खास जानकारी

एसएपीआई को इस तरह से डिज़ाइन किया गया है कि यह डेवलपर को C/C++ लाइब्रेरी को सैंडबॉक्सिंग के लिए तैयार करने के टूल उपलब्ध कराता है. साथ ही, यह C/C++ लाइब्रेरी के सैंडबॉक्स वाले वर्शन के साथ कम्यूनिकेट करने के लिए ज़रूरी एपीआई भी उपलब्ध कराता है.

इस डायग्राम में, एसएपीआई की सैंडबॉक्स वाली C/C++ लाइब्रेरी का आर्किटेक्चर दिखाया गया है:

SAPI डायग्राम

एसएपीआई, एसएपीआई लाइब्रेरी और होस्ट कोड के बीच, मैन्युअल और अपने-आप (पॉइंटर के कस्टम एट्रिब्यूट के आधार पर) मेमोरी सिंक (ऐरे, स्ट्रक्चर) के लिए प्रिमिटिव भी उपलब्ध कराता है.

आखिर में, एक हाई-लेवल ट्रांज़ैक्शन एपीआई एसएपीआई लाइब्रेरी की निगरानी करने की सुविधा देता है.साथ ही, अगर इनमें कोई गड़बड़ी होती है, तो यह उन्हें रीस्टार्ट भी करता है. जैसे, सुरक्षा से जुड़े उल्लंघन, क्रैश या संसाधन खत्म होने की वजह से.

Sandbox2

ओपन-सोर्स प्रोजेक्ट Sandbox2 को Google के सुरक्षा इंजीनियरों ने बनाया है और वे ही इसे मैनेज करते हैं. यह सैंडबॉक्सिंग की मुख्य टेक्नोलॉजी है, जिसका इस्तेमाल एसएपीआई करता है. Sandbox2 में तीन मुख्य कॉम्पोनेंट शामिल हैं: सैंडबॉक्स की नीति, एक्ज़ीक्यूटर, और सैंडबॉक्सी.

सैंडबॉक्स की नीति

सैंडबॉक्स की नीति, सैंडबॉक्स वाली लाइब्रेरी के लिए, प्रतिबंधित एक्ज़ीक्यूशन एनवायरमेंट तय करती है. यह तय करके किया जाता है कि कौनसे सिसकॉल एक्ज़ीक्यूट किए जा सकते हैं. एसएपीआई, Sandbox2 के जैसे ही मेकैनिज़्म का इस्तेमाल करता है. सैंडबॉक्स की नीति को डिज़ाइन और तय करने के तरीके के बारे में ज़्यादा जानने के लिए, सैंडबॉक्स की नीति सेक्शन और Sandbox2 के लिए शुरू करना पेज देखें.

डिफ़ॉल्ट रूप से, जनरेट की गई एसएपीआई सैंडबॉक्स क्लास, DefaultConfig (sapi::SandboxConfig::DefaultConfig()) का इस्तेमाल करके शुरू होती हैं. DefaultConfig() सैंडबॉक्स को इन चीज़ों के साथ कॉन्फ़िगर करता है:

  • sapi::Sandbox2Config::DefaultPolicyBuilder() की मदद से बनाई गई, Sandbox2 की डिफ़ॉल्ट नीति
  • 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++ लाइब्रेरी के सोर्स कोड में बदलाव करने की उम्मीद नहीं की जाती.

एसएपीआई ऑब्जेक्ट और आरपीसी स्टब

एसएपीआई ऑब्जेक्ट, C++ ऑब्जेक्ट है. यह सैंडबॉक्स वाली लाइब्रेरी का एपीआई ज़ाहिर करता है. यह होस्ट कोड से मिले कॉल को आरपीसी स्टब पर फ़ॉरवर्ड करता है. आरपीसी स्टब, सैंडबॉक्स वाली लाइब्रेरी के साथ-साथ, एसएपीआई लाइब्रेरी में एम्बेड होता है.

इन दोनों एलिमेंट को, sapi_library() बिल्ड नियम का इस्तेमाल करके, बिल्ड सिस्टम अपने-आप जनरेट करता है. एसएपीआई, दो बिल्ड सिस्टम के साथ काम करता है: Google का Bazel और CMake.

होस्ट कोड

होस्ट कोड, एसएपीआई लाइब्रेरी से मिले लॉजिक को लागू करता है. आम तौर पर, यह C/C++ लाइब्रेरी के बिना सैंडबॉक्स वाले वर्शन का इस्तेमाल करता है. ऐसे में, होस्ट कोड, एसएपीआई लाइब्रेरी से एक्सपोर्ट किए गए फ़ंक्शन को कॉल करता है. साथ ही, सैंडबॉक्स को डेटा पास करता है और उससे डेटा लेता है.

एसएपीआई लाइब्रेरी का इस्तेमाल करने के लिए, होस्ट कोड को अडैप्ट करना ज़रूरी है. खास तौर पर, लाइब्रेरी के फ़ंक्शन को कॉल नहीं किया जा सकता, क्योंकि लाइब्रेरी, सैंडबॉक्स वाली अलग प्रोसेस में मौजूद होती है. इसलिए, एसएपीआई ऐसे टूल उपलब्ध कराता है जो एसएपीआई ऑब्जेक्ट बनाते हैं. यह ऑब्जेक्ट, एसएपीआई लाइब्रेरी को प्रॉक्सी कॉल करता है.

कॉन्सेप्ट

Bazel के बिल्ड नियम

एसएपीआई प्रोजेक्ट, C/C++ लाइब्रेरी को सैंडबॉक्स करने के लिए, Bazel के दो बिल्ड नियम उपलब्ध कराता है:

  • sapi_library() – यह सभी आउटपुट बनाता है. इनकी मदद से, C/C++ लाइब्रेरी को Sandbox2 सैंडबॉक्सी के तौर पर सैंडबॉक्स किया जा सकता है. बिल्ड आउटपुट का इस्तेमाल, होस्ट कोड बाइनरी बनाने के लिए इस्तेमाल किए जाने वाले cc_binary() नियम के लिए, डिपेंडेंसी के तौर पर किया जा सकता है.
  • sapi_interface() – यह हेडर को अपने-आप जनरेट करता है. इसे होस्ट कोड बाइनरी में शामिल किया जा सकता है.

बिल्ड नियमों के बारे में ज़्यादा जानकारी के लिए, बिल्ड नियम देखें.

वैरिएबल

एसएपीआई, कई खास तरह के टाइप उपलब्ध कराता है. इन्हें एसएपीआई टाइप कहा जाता है. हमारा सुझाव है कि इनका इस्तेमाल होस्ट कोड में किया जाए. एसएपीआई टाइप की ज़रूरत पड़ने की मुख्य वजह यह है कि होस्ट कोड और सैंडबॉक्स वाली लाइब्रेरी के बीच प्रोसेस और इसलिए मेमोरी आइसोलेशन होता है.

इस विषय के बारे में ज़्यादा जानकारी और आम तौर पर इस्तेमाल किए जाने वाले कुछ एसएपीआई टाइप की खास जानकारी पाने के लिए, वैरिएबल देखें.

लेन-देन

जैसा कि ऊपर बताया गया है, सैंडबॉक्स वाली लाइब्रेरी को किया गया कोई भी एपीआई कॉल, आरपीसी लेयर पर पास किया जाता है. इस लेयर पर गड़बड़ी को ठीक करने के लिए, आपको गड़बड़ी को ठीक करने का सही तरीका लागू करना होगा. एसएपीआई ट्रांज़ैक्शन मॉड्यूल, ज़रूरी मेकैनिज़्म उपलब्ध कराता है. इससे यह पक्का किया जा सकता है कि सैंडबॉक्स वाली लाइब्रेरी को किए गए सभी कॉल, आरपीसी-लेवल की किसी भी समस्या के बिना पूरे हों या उनसे जुड़ी गड़बड़ी की जानकारी मिले.

इस विषय के बारे में ज़्यादा जानकारी के लिए, लेन-देन देखें.

शुरू करना

सैंडबॉक्स वाले एपीआई का पहला प्रोजेक्ट सेट अप करने के लिए, हमारा शुरू करना पेज पढ़ें.