मैं एक ऐसे प्रोजेक्ट पर काम कर रहा हूं जिसमें अनुकरण वितरित सिमुलेशन: मनमाने कोड को कई नोड्स पर निष्पादित किया जाता है और परिणाम बाद में एकत्र और एकत्र किए जाते हैं।
प्रत्येक नोड एक उबंटू लिनक्स वर्चुअल मशीन का एक उदाहरण है और एक मास्टर प्रक्रिया चलाता है जो कोड को अग्रेषित करने के लिए कई कार्यकर्ता प्रक्रियाओं (प्रत्येक कोर के लिए 1) को निष्पादित करने का ख्याल रखता है।
यह प्रश्न यह सुनिश्चित करने के बारे में है कि प्रत्येक कार्यकर्ता सैंडबॉक्स वाले वातावरण में संचालित होता है, उनमें से प्रत्येक के लिए एक वर्चुअल मशीन उदाहरण का उपयोग किए बिना। श्रमिकों के लिए सटीक आवश्यकताएं हैं:
- एफएस : कोई लिखने की अनुमति नहीं, केवल एक निर्देशिका (और उप-फ़ोल्डर्स) तक सीमित पढ़ने की अनुमति
- नेट : केवल स्थानीय संचार की अनुमति है (IPC, TCP, जो भी ...)
- मेम : मेमोरी उपयोग पर टोपी (कोई स्वैप मेमोरी नहीं) यदि मेम सीमा से अधिक है
- सीपीयू : केवल 1 कोर की अनुमति दी, अगर समय सीमा से अधिक मार डालते हैं
कोई अन्य सीमाएं नहीं लगाई जानी चाहिए: कार्यकर्ता को गतिशील पुस्तकालयों (केवल पढ़ने के लिए फ़ोल्डर) से लोड करने में सक्षम होना चाहिए, नए थ्रेड या प्रक्रियाएं, कॉल सिस्टम फ़ंक्शन, ecc ecc, लेकिन सीमाएं लोडेड संस्थाओं द्वारा विरासत में मिलनी चाहिए और सम-वार तरीके से लागू होना चाहिए (उदाहरण के लिए हमारे पास वर्कर स्पॉन दो थ्रेड नहीं हो सकते हैं जो 800MB प्रत्येक का उपयोग करते हैं, ऐसे वर्कर के लिए मेमोरी लिमिट 1GB है)।
यह बिना यह कहे चला जाता है कि श्रमिक के पास अपने अधिकारों को बढ़ाने के लिए कोई रास्ता नहीं होना चाहिए।
मैंने अपनी आवश्यकताओं को पूरा करने वाले सबसे सरल समाधान के लिए उपलब्ध विकल्पों (SELinux, AppArmor, cgroups, ulimit, Linux namespaces, LXC, Docker, ...) की समीक्षा करने में काफी समय बिताया।
वर्तमान समझ: LXC और डोकर अपने प्रयोग के मामले के लिए भारी पक्ष पर एक सा और पूरी तरह से सुरक्षित नहीं हैं 1 । आसान विन्यास के कारण SELinux के लिए बेहतर AppArmor, इसे fs और नेट प्रतिबंधों के लिए उपयोग करें; अल्जीमिट (जो एक एकल प्रक्रिया पर संचालित होता है) के लिए बेहतर है, इसका इस्तेमाल मेम और सीपीयू प्रतिबंधों के लिए किया जाता है।
क्या यह मेरा लक्ष्य प्राप्त करने का सबसे सरल तरीका है? क्या मैं विशेष रूप से AppArmor या cgroups का उपयोग कर सकता हूं? क्या मेरे मॉडल में कुछ स्पष्ट सुरक्षा छेद है? गाइडलाइन होनी चाहिए "कार्यकर्ता को खुद को नीचे लाने की अनुमति है लेकिन कुछ और नहीं" ।