सबसे सरल संभव सुरक्षित सैंडबॉक्सिंग (सीमित संसाधनों की आवश्यकता)


15

मैं एक ऐसे प्रोजेक्ट पर काम कर रहा हूं जिसमें अनुकरण वितरित सिमुलेशन: मनमाने कोड को कई नोड्स पर निष्पादित किया जाता है और परिणाम बाद में एकत्र और एकत्र किए जाते हैं।

प्रत्येक नोड एक उबंटू लिनक्स वर्चुअल मशीन का एक उदाहरण है और एक मास्टर प्रक्रिया चलाता है जो कोड को अग्रेषित करने के लिए कई कार्यकर्ता प्रक्रियाओं (प्रत्येक कोर के लिए 1) को निष्पादित करने का ख्याल रखता है।

यह प्रश्न यह सुनिश्चित करने के बारे में है कि प्रत्येक कार्यकर्ता सैंडबॉक्स वाले वातावरण में संचालित होता है, उनमें से प्रत्येक के लिए एक वर्चुअल मशीन उदाहरण का उपयोग किए बिना। श्रमिकों के लिए सटीक आवश्यकताएं हैं:

  • एफएस : कोई लिखने की अनुमति नहीं, केवल एक निर्देशिका (और उप-फ़ोल्डर्स) तक सीमित पढ़ने की अनुमति
  • नेट : केवल स्थानीय संचार की अनुमति है (IPC, TCP, जो भी ...)
  • मेम : मेमोरी उपयोग पर टोपी (कोई स्वैप मेमोरी नहीं) यदि मेम सीमा से अधिक है
  • सीपीयू : केवल 1 कोर की अनुमति दी, अगर समय सीमा से अधिक मार डालते हैं

कोई अन्य सीमाएं नहीं लगाई जानी चाहिए: कार्यकर्ता को गतिशील पुस्तकालयों (केवल पढ़ने के लिए फ़ोल्डर) से लोड करने में सक्षम होना चाहिए, नए थ्रेड या प्रक्रियाएं, कॉल सिस्टम फ़ंक्शन, ecc ecc, लेकिन सीमाएं लोडेड संस्थाओं द्वारा विरासत में मिलनी चाहिए और सम-वार तरीके से लागू होना चाहिए (उदाहरण के लिए हमारे पास वर्कर स्पॉन दो थ्रेड नहीं हो सकते हैं जो 800MB प्रत्येक का उपयोग करते हैं, ऐसे वर्कर के लिए मेमोरी लिमिट 1GB है)।

यह बिना यह कहे चला जाता है कि श्रमिक के पास अपने अधिकारों को बढ़ाने के लिए कोई रास्ता नहीं होना चाहिए।

मैंने अपनी आवश्यकताओं को पूरा करने वाले सबसे सरल समाधान के लिए उपलब्ध विकल्पों (SELinux, AppArmor, cgroups, ulimit, Linux namespaces, LXC, Docker, ...) की समीक्षा करने में काफी समय बिताया।

वर्तमान समझ: LXC और डोकर अपने प्रयोग के मामले के लिए भारी पक्ष पर एक सा और पूरी तरह से सुरक्षित नहीं हैं 1 । आसान विन्यास के कारण SELinux के लिए बेहतर AppArmor, इसे fs और नेट प्रतिबंधों के लिए उपयोग करें; अल्जीमिट (जो एक एकल प्रक्रिया पर संचालित होता है) के लिए बेहतर है, इसका इस्तेमाल मेम और सीपीयू प्रतिबंधों के लिए किया जाता है।

क्या यह मेरा लक्ष्य प्राप्त करने का सबसे सरल तरीका है? क्या मैं विशेष रूप से AppArmor या cgroups का उपयोग कर सकता हूं? क्या मेरे मॉडल में कुछ स्पष्ट सुरक्षा छेद है? गाइडलाइन होनी चाहिए "कार्यकर्ता को खुद को नीचे लाने की अनुमति है लेकिन कुछ और नहीं"


2
यदि सीमा [आईएनजी] संसाधन आपका लक्ष्य है, तो आप उबंटू अतिथि (या वास्तव में उस मामले के लिए कोई डेबियन-व्युत्पन्न) की तुलना में बहुत बेहतर कर सकते हैं । किसी भी मामले में, तो आप शायद चाहते उपयोगकर्ता के मोड linux और / या (हाल ही में कर्नेल के साथ) उपयोगकर्ता नाम स्थान
mikeserv

2
LXC ठीक वही लगता है जो आपको चाहिए। आपको क्यों लगता है कि यह भारी ओर असुरक्षित है? (निश्चित रूप से, इसमें कीड़े थे, लेकिन आपके पास कुछ भी हो सकता है।)
Gilles 'SO- बंद करो बुराई जा रहा है'

लिंक्ड प्रेजेंटेशन (2011 से) और उबंटू LXC डॉक्यूमेंट के सिक्योरिटी सेक्शन में 'नेमस्पेस लीक' के बारे में बात करना बहुत आश्वस्त नहीं है। LXC की तरह लगता है, ज्यादातर नामस्थान और cgroups पर आधारित है, वैसे भी अभी सबसे अच्छा विकल्प हो सकता है। मुझे लिनक्स-सैंडबॉक्सिंग , दिलचस्प पढ़ना भी मिला
StephQ

इसके लिए थोड़े से पीछे हटने की आवश्यकता हो सकती है, लेकिन क्या आपने बीएसडी जेलों को चलाने पर विचार किया है?
राइडर

जबकि LXC 'भारी' हो सकता है कि यह VM के एक झुंड की तरह है, यह वास्तव में उन्हें बनाने के लिए सरल है। इन समाधानों में से कुछ, जबकि 'लाइटर' को बहुत अधिक कॉन्फ़िगरेशन की आवश्यकता हो सकती है। LXC के साथ, आपको लेखन जैसी चीजों को कॉन्फ़िगर करने की आवश्यकता नहीं हो सकती है, क्योंकि एक ऐप में पूरे कंटेनर होंगे।
मिकप जूल 28'16

जवाबों:


1

हां, आप विशेष रूप से उन मनमाने कोड को मॉनिटर और नियंत्रित करने के लिए cgroups और SELinux / AppArmor का उपयोग कर सकते हैं जिन्हें आप निष्पादित करेंगे।

Cgroups के साथ, आप निम्न कार्य कर सकते हैं:

  1. cpusetसबसिस्टम के साथ सीपीयू कोर उपयोग को 1 सीपीयू तक सीमित करें
  2. memoryसबसिस्टम के साथ मेमोरी उपयोग की सीमा निर्धारित करें , यहां तक ​​कि कांटे पर भी नज़र रखें। एक उदाहरण के लिए https://github.com/gsauthof/cgmemtime देखें ।
  3. सबसिस्टम के loसाथ नहीं है कि कुछ भी करने के लिए नेटवर्क का उपयोग रोकें net_prio

और SELinux / AppArmor के साथ, आप प्रक्रिया की रीड / राइट एक्सेस को सीमित कर सकते हैं।

नोट: मैं AppArmor से अपरिचित हूं, लेकिन यह एक अनिवार्य अभिगम नियंत्रण (मैक) प्रणाली है, जिसका अर्थ है कि लेखन और पढ़ने की रक्षा करना यह काम है।

इन प्रणालियों का उपयोग लेखन के उचित विन्यास का विषय है। बेशक, यह सब कुछ बहुत आसान कहा गया है। तो यहाँ कुछ संदर्भ लिंक आपको आरंभ करने के लिए दिए गए हैं:

शुभ लाभ!


1

मैं केवल AppArmor के लिए SELinux को छोड़ दूंगा अगर मैं उबंटू का उपयोग कर रहा था । (वास्तव में काफी मुश्किल)

LXC अपने आप से सुरक्षित नहीं है। यदि आपको सुरक्षा की आवश्यकता है तो आपको उन्हें libvirt ( SELinux MLS के आधार पर ) के माध्यम से उपयोग करना होगा ।

आपकी समस्या है अनंत तो शेल्फ से और अनंत समय के बिना किसी भी समाधान खोजने की कोशिश नहीं करते हैं, तो याद रखें कि यहां तक कि kernel.org pwoned किया गया था और हाल ही में एफबीआई की घोषणा की है कि किसी को अब तक का पता लगाया जा रहा है बिना साल के लिए अपने सिस्टम का उपयोग किया गया।

मैं बहुत अच्छी सुरक्षा के लिए LXC / libvirt के साथ जाऊंगा या मैं "नए" इंटेल क्लियर कंटेनर की कोशिश करूंगा , जो आपके कंटेनर के लिए DAX / KSM के स्पष्ट उपयोग के साथ बहुत ही हल्के VM का उपयोग करें (मैंने उनका परीक्षण नहीं किया है लेकिन वे लगते हैं वास्तव में होनहार)।

यदि आप कर्नेल शोषण, व्याकरण के बारे में चिंतित हैं आपका समाधान है लेकिन आपको इसे अपने कंटेनर समाधान (सुनिश्चित करने के लिए सिरदर्द) के साथ एकीकृत करना होगा।

सुनिश्चित करने के लिए इतना आसान काम नहीं, LXC / libvirt वास्तव में साफ-सुथरा है, लेकिन शायद स्पष्ट कंटेनर जाने का रास्ता है।

डोकर? मैं स्थानीय परीक्षण से अधिक के लिए docker का उपयोग नहीं करता / करती जब कोई वेजिटेरियन बॉक्स उपलब्ध नहीं होता, तो उन्हें अधिक काम करने और बेहतर समुदाय की आवश्यकता होती है।

बेशक सिस्टमड कंटेनर भी अच्छे हैं, लेकिन मेरा मानना ​​है कि आप उन्हें पसंद नहीं करते / चाहते हैं क्योंकि आपने उनका उल्लेख भी नहीं किया है और वे विक्रेता कृषि समाधान नहीं हैं।

यदि आप कुछ "आसान" और अधिक शौकिया चाहते हैं, तो आप फायरजेल की जांच कर सकते हैं , मैं इसे कुछ डेस्कटॉप "ऐप्स" के लिए उपयोग कर रहा हूं और यह काम करता है (यह आपके कस्टम ऐप के लिए टेम्पलेट बनाना काफी आसान है, "निजी" का उपयोग करें आपके dirs के शीर्ष पर mounts और केवल स्थानीय उपयोग के लिए नेटवर्क को प्रतिबंधित करता है, माता-पिता के लिए विरासत में मिली प्रक्रियाओं को जन्म देता है और ...)।

बिना पागल हुए चीयर्स एंड मस्ती। ;)


0

seccomp-bpf एक और विकल्प है जो OpenSSH, vsftpd और Chromium के लिए अच्छी तरह से काम करता है, इसमें केवल बाहर निकलना (), sigreturn (), रीड () यह भी लिखने का उपयोग करता है () हालांकि यह विन्यास योग्य बर्कले पैकेट फ़िल्टर नियम के सिस्टम कॉल को फ़िल्टर करने की अनुमति देता है। यह भी स्मृति, सीपीयू आदि के लिए cgroups के साथ संयोजन के रूप में इस्तेमाल किया जा सकता है ...

https://wiki.mozilla.org/Security/Sandbox/Seccomp


0

आप ग्रिड कंप्यूटिंग सिस्टम में देखना चाह सकते हैं। विशेष रूप से, BOINC ( http://boinc.berkeley.edu ) आपके सभी बॉक्सों की लगभग जाँच करता है।

मेरा मानना ​​है कि यह आपके मापदंडों पर काम करता है जैसे:

fs: अपनी स्वयं की निर्देशिका को कहीं और पढ़ / लिख सकता है

नेट: केवल आपके BOINC सर्वर तक नेटवर्क पहुंच की अनुमति के लिए कॉन्फ़िगर किया जा सकता है, लेकिन बॉक्स IIRC से बाहर डिफ़ॉल्ट नहीं है

मेम: हाँ, बेकार और बेकार की मशीनों के लिए अलग-अलग मेमोरी लिमिट

सीपीयू: हाँ, यह भी कह सकते हैं "अगर कंप्यूटर निष्क्रिय नहीं है तो चलाएं"

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.