सैंडबॉक्सिंग

किसी समस्या की शिकायत करें सोर्स देखें रात · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

इस लेख में, Basel में सैंडबॉक्स करने और सैंडबॉक्सिंग को डीबग करने के बारे में बताया गया है पर्यावरण को ध्यान में रखकर काम करना.

सैंडबॉक्सिंग, अनुमतियों पर पाबंदी लगाने की ऐसी रणनीति है जो प्रोसेस को एक-दूसरे से या सिस्टम में मौजूद संसाधनों से. Basel के लिए, इसका मतलब फ़ाइल को प्रतिबंधित करना है सिस्टम ऐक्सेस.

बेज़ेल का फ़ाइल सिस्टम सैंडबॉक्स एक ऐसी चालू डायरेक्ट्री में प्रोसेस करता है जो सिर्फ़ इसमें ऐसे इनपुट शामिल होते हैं जिनके बारे में पहले से जानकारी मौजूद होती है. इससे कंपाइलर और अन्य टूल, सोर्स ऐसी फ़ाइलें जिन्हें वे ऐक्सेस नहीं कर सकते, जब तक कि उन्हें उनका ऐब्सलूट पाथ न पता हो.

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

खास तौर पर, Baze हर कार्रवाई के लिए एक execroot/ डायरेक्ट्री बनाता है, जो एक्ज़ीक्यूशन के समय, ऐक्शन की वर्क डायरेक्ट्री के तौर पर काम करती है. execroot/ अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है कार्रवाई की सभी इनपुट फ़ाइलें शामिल होती हैं और किसी भी जनरेट किए गए आउटपुट. इसके बाद, Basel ऑपरेटिंग सिस्टम से दी गई तकनीक का इस्तेमाल करके, कंटेनर, Linux पर और macOS पर sandbox-exec. execroot/.

सैंडबॉक्स करने की वजहें

  • ऐक्शन सैंडबॉक्सिंग के बिना, Basel को पता नहीं चलता कि कोई टूल ऐसे टूल का इस्तेमाल करता है जिसका एलान नहीं किया गया है इनपुट फ़ाइलें (ऐसी फ़ाइलें जो स्पष्ट रूप से किसी ऐक्शन). जब ऐसी किसी इनपुट फ़ाइल में बदलाव होता है जिसका एलान नहीं किया गया है, तो का मानना है कि बिल्ड अप-टू-डेट है और इससे कार्रवाई दोबारा नहीं बनेगी. यह काम कर सकता है इसकी वजह से गलत इंक्रीमेंटल बिल्ड हो सकता है.

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

  • सैंडबॉक्सिंग, रिमोट तरीके से एक्ज़ीक्यूशन करने जैसा है. — अगर बिल्ड ठीक से काम करता है सैंडबॉक्स की सुविधा के साथ, यह रिमोट तरीके से एक्ज़ीक्यूट करने पर भी काम करेगा. कॉन्टेंट बनाने की वजह से रिमोट तौर पर एक्ज़ीक्यूट करने से सभी ज़रूरी फ़ाइलों (लोकल टूल के साथ) को अपलोड किया जा सकता है, क्लस्टर की तुलना में, कंपाइल किए जाने वाले क्लस्टर के रखरखाव की लागत में क्लस्टर की हर मशीन पर टूल इंस्टॉल करने के बाद, आपको किसी नए कंपाइलर को आज़माना या किसी मौजूदा टूल में बदलाव करना हो.

सैंडबॉक्स की कौनसी रणनीति इस्तेमाल करें

अगर किसी सैंडबॉक्स का इस्तेमाल किया जाए, तो रणनीति के फ़्लैग. sandboxed का इस्तेमाल करना रणनीति लागू करने के बाद, Basel को यहां दिए गए सैंडबॉक्स में से किसी एक इंप्लिमेंटेशन को चुनने में मदद मिलती है. जो ओएस के हिसाब से बनाए गए सैंडबॉक्स के लिए, कम हर्मेटिक जेनरिक सैंडबॉक्स को पसंद करता है. पास हो जाने पर, परसिस्टेंट वर्कर, जेनरिक सैंडबॉक्स में रन करते हैं --worker_sandboxing फ़्लैग.

local (यानी standalone) रणनीति किसी भी तरह की सैंडबॉक्सिंग नहीं करती. यह बस कार्रवाई की कमांड लाइन को उस काम करने वाली डायरेक्ट्री पर लागू करता है, जो आपके फ़ाइल फ़ोल्डर का एक्सक्लूट.

processwrapper-sandbox, सैंडबॉक्स की गई ऐसी रणनीति है जिसके लिए किसी "ऐडवांस सेटिंग" सुविधाएं - यह किसी भी POSIX सिस्टम पर काम कर सकती है. यह यह एक सैंडबॉक्स डायरेक्ट्री बनाता है, जिसमें ओरिजनल सिमलिंक शामिल होते हैं सोर्स फ़ाइलें, काम करने वाली डायरेक्ट्री सेट के साथ कार्रवाई की कमांड लाइन चलाती हैं इसके बाद, इस डायरेक्ट्री में एक्सपोर्ट करने के बाद, जाने-पहचाने आउटपुट आर्टफ़ैक्ट को मूव करता है सैंडबॉक्स के बाहर एक्सक्रूट में जाते हैं और सैंडबॉक्स मिटा देते हैं. इससे अनजाने में किसी ऐसी इनपुट फ़ाइल का इस्तेमाल करने से कार्रवाई होनी चाहिए जिसका एलान नहीं किया गया है या अज्ञात आउटपुट फ़ाइलों से एक्सक्लूट को हटाना.

linux-sandbox एक कदम आगे बढ़ जाता है और processwrapper-sandbox. Docker जिस तरह से हुड के साथ काम करता है उसी तरह यह Linux नेमस्पेस (उपयोगकर्ता, माउंट, पीआईडी, नेटवर्क, और आईपीसी नेमस्पेस) कार्रवाई होती है. इसका मतलब है कि पूरे फ़ाइल सिस्टम को सिर्फ़ रीड-ओनली कर देता है को अनुमति नहीं देते, तो कार्रवाई गलती से होस्ट फ़ाइल सिस्टम. यह गड़बड़ी की जांच करने जैसी स्थितियों को रोकता है, जो गलती से आरएम हो जाती हैं -अपनी $HOME डायरेक्ट्री को रीफ़िंग करें. इसके अलावा, इस कार्रवाई को रोका भी जा सकता है नेटवर्क को ऐक्सेस करने में मदद मिलती है. इस कार्रवाई को रोकने के लिए, linux-sandbox पीआईडी नेमस्पेस का इस्तेमाल करता है ऐसी प्रोसेस को देखने और भरोसेमंद तरीके से सभी प्रोसेस को खत्म करने से रोकने के लिए, जो किसी गतिविधि के ज़रिए पैदा होती है.

darwin-sandbox समान है, लेकिन macOS के लिए. यह Apple के sandbox-exec टूल का इस्तेमाल करता है करीब-करीब Linux सैंडबॉक्स के समान पाने के लिए.

"नेस्ट किए गए" में linux-sandbox और darwin-sandbox, दोनों काम नहीं करते संचालन की ओर से उपलब्ध कराए गए तरीकों में पाबंदियों की वजह से सिस्टम. क्योंकि Docker अपने कंटेनर मैजिक के लिए Linux नेमस्पेस का भी इस्तेमाल करता है, इसलिए आप जब तक आप इस्तेमाल न करें, Docker कंटेनर के अंदर linux-sandbox को आसानी से नहीं चला सकते docker run --privileged. macOS पर, sandbox-exec को जिसे पहले से ही सैंडबॉक्स किया जा रहा है. इस तरह, इन मामलों में, बेज़ल अपने-आप processwrapper-sandbox का इस्तेमाल करना शुरू कर देता है.

अगर आपको इसके बजाय बिल्ड से जुड़ी गड़बड़ी मिलती है — जैसे कि गलती से, कम सख्त एक्ज़ीक्यूशन रणनीति — एक्ज़ीक्यूशन की सूची में साफ़ तौर पर बदलाव करें बेज़ल जिन रणनीतियों का इस्तेमाल करते हैं (उदाहरण के लिए, bazel build --spawn_strategy=worker,linux-sandbox).

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

सैंडबॉक्सिंग की समस्याएं

  • सैंडबॉक्सिंग के लिए अतिरिक्त सेटअप और टियरडाउन लागत आती है. यह लागत कितनी है यह कई बातों पर निर्भर करता है. जैसे, बिल्ड किस तरह का है और होस्ट OS की परफ़ॉर्मेंस. Linux के लिए, सैंडबॉक्स किए गए बिल्ड आम तौर पर कुछ प्रतिशत धीमा हो जाता है. --reuse_sandbox_directories को सेट करने पर ये काम किए जा सकते हैं सेटअप और टियरडाउन के खर्च को कम करेगा.

  • सैंडबॉक्स करने से, टूल में मौजूद कैश मेमोरी को पूरी तरह बंद कर दिया जाता है. आप इसे कम करने के लिए नियमित कर्मचारियों का इस्तेमाल करें. सैंडबॉक्स गारंटी की लागत कम हो जाती है.

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

डीबग करना

सैंडबॉक्स की समस्याओं को डीबग करने के लिए, नीचे दी गई रणनीतियों का पालन करें.

बंद किए गए नेमस्पेस

कुछ प्लैटफ़ॉर्म पर, जैसे कि Google Kubernetes इंजन क्लस्टर नोड या Debian के कारण, उपयोगकर्ता नेमस्पेस डिफ़ॉल्ट रूप से प्रयोग में नहीं हो जाते हैं, तो सुरक्षा से जुड़ी चिंताएं दूर करें. अगर /proc/sys/kernel/unprivileged_userns_clone फ़ाइल मौजूद है और इसमें 0 है, तो आप उपयोगकर्ता नेमस्पेस को यह चलाकर चालू कर सकते हैं:

   sudo sysctl kernel.unprivileged_userns_clone=1

नियम को लागू नहीं किया जा सका

सिस्टम के सेटअप की वजह से, हो सकता है कि सैंडबॉक्स नियमों को लागू न कर पाए. अगर आपको namespace-sandbox.c:633: execvp(argv[0], argv): No such file or directory जैसे मैसेज भेजने के लिए, --strategy=Genrule=local का इस्तेमाल करके सैंडबॉक्स को सामान्य नियम और अन्य नियमों के लिए --spawn_strategy=local.

बिल्ड विफलताओं के लिए विस्तृत डीबगिंग

अगर आपका बिल्ड फ़ेल हो गया है, तो --verbose_failures और --sandbox_debug का इस्तेमाल करके Baज़ल, बिल्ड फ़ेल होने पर चलाया गया निर्देश दिखाता है. इसमें, बिल्ड का पार्ट भी शामिल है जो सैंडबॉक्स सेट अप करता है.

गड़बड़ी के मैसेज का उदाहरण:

ERROR: path/to/your/project/BUILD:1:1: compilation of rule
'//path/to/your/project:all' failed:

Sandboxed execution failed, which may be legitimate (such as a compiler error),
or due to missing dependencies. To enter the sandbox environment for easier
debugging, run the following command in parentheses. On command failure, a bash
shell running inside the sandbox will then automatically be spawned

namespace-sandbox failed: error executing command
  (cd /some/path && \
  exec env - \
    LANG=en_US \
    PATH=/some/path/bin:/bin:/usr/bin \
    PYTHONPATH=/usr/local/some/path \
  /some/path/namespace-sandbox @/sandbox/root/path/this-sandbox-name.params --
  /some/path/to/your/some-compiler --some-params some-target)

अब जनरेट की गई सैंडबॉक्स डायरेक्ट्री की जांच की जा सकती है. साथ ही, यह देखा जा सकता है कि Basel की कौनसी फ़ाइलें बनाया गया और कमांड को फिर से चलाकर देखा जा सकता है कि वह कैसे काम करता है.

ध्यान दें कि जब आप उपयोग करते हैं, तो Basel सैंडबॉक्स डायरेक्ट्री को नहीं हटाता --sandbox_debug. अगर आप सक्रिय रूप से डीबग नहीं कर रहे हैं, तो आपको इसे बंद कर देना चाहिए --sandbox_debug क्योंकि यह समय के साथ आपकी डिस्क को भरता है.