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

अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है किसी समस्या की शिकायत करें सोर्स देखें रात · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

इस लेख में, Basel में सैंडबॉक्सिंग, sandboxfs को इंस्टॉल करने, और डीबग करने के बारे में बताया गया है आपके सैंडबॉक्सिंग एनवायरमेंट की ज़रूरत नहीं है.

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

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

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

खास तौर पर, Basel हर कार्रवाई के लिए एक 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 को सेट करने पर यह काम हो सकता है सेटअप और टियरडाउन के खर्च को कम करेगा.

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

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

सैंडबॉक्सएफ़

sandboxfs एक FUSE फ़ाइल सिस्टम है, जो में दिया गया हो. Baज़र, इन कामों के लिए sandboxfs का इस्तेमाल करता है हर कार्रवाई के लिए तुरंत execroot/ जनरेट करें. इसमें हज़ारों सिस्टम कॉल जारी कर रहे हैं. ध्यान दें कि execroot/ में आगे I/O हो सकता है FUSE ओवरहेड के कारण धीमी होगी.

सैंडबॉक्सएफ़ इंस्टॉल करना

sandboxfs को इंस्टॉल करने और Baze बिल्ड की मदद से काम करने के लिए, यह तरीका अपनाएं यह:

डाउनलोड करें

डाउनलोड और इंस्टॉल करना sandboxfs ताकि sandboxfs बाइनरी आपके PATH में खत्म हो जाए.

sandboxfs चलाएं

  1. (सिर्फ़ macOS के लिए) OSXFUSE इंस्टॉल करें.
  2. (सिर्फ़ macOS के लिए) चलाएं:

    sudo sysctl -w vfs.generic.osxfuse.tunables.allow_other=1
    

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

  3. --experimental_use_sandboxfs के साथ बेज़ल बिल्ड चलाएं.

    bazel build target --experimental_use_sandboxfs
    

समस्या हल करने से जुड़ी जानकारी

अगर आपको darwin-sandbox के बजाय local या linux-sandbox की जाने वाली कार्रवाइयों की व्याख्या है, तो इसका मतलब यह हो सकता है कि सैंडबॉक्सिंग बंद किया गया. --genrule_strategy=sandboxed --spawn_strategy=sandboxed को यहां पास करें इसे चालू करें.

डीबग करना

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

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

कुछ प्लैटफ़ॉर्म पर, जैसे कि 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 का इस्तेमाल करके सैंडबॉक्स को genनियम और --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 क्योंकि यह समय के साथ आपकी डिस्क को भरता है.