रूट होने के बिना एक प्रक्रिया "जेल" कैसे करें?


26

क्या मैं जड़ था, मैं बस एक डमी उपयोगकर्ता / समूह बना सकता था, तदनुसार फाइल अनुमति सेट कर सकता था और उस उपयोगकर्ता के रूप में प्रक्रिया को निष्पादित कर सकता था। हालाँकि मैं नहीं हूँ, तो क्या बिना जड़ के इसे हासिल करने का कोई तरीका है?


1
@alex: मेरे पास एक स्क्रिप्ट है जिसमें कई सिमुलेशन (विभिन्न निर्देशिकाओं में) निष्पादित किए जा रहे हैं और यह सुनिश्चित करना चाहते हैं कि कोई भी बात नहीं है कि प्रोग्रामिंग कितनी बुरी है, वे केवल अपनी निर्देशिका में फ़ाइलों तक पहुंच सकते हैं और गलती से संशोधित नहीं कर सकते हैं उदाहरण के लिए अन्य सिमुलेशन का उत्पादन
टोबीस किन्नर रे

2
@ टोबियास: मुझे आपकी बात सही लगी। chrootस्वाभाविक रूप से वहाँ फिट होगा, लेकिन फिर आप जड़ नहीं हैं।
एलेक्स

1
मुझे लगता है कि सेलिनक्स, एपर्मोर, और ग्रामसुरिटी, ऐसा करने में सक्षम हो सकती है, लेकिन मुझे यकीन नहीं है। लेकिन तब यदि वे उपलब्ध नहीं हैं या sys व्यवस्थापक द्वारा कॉन्फ़िगर नहीं किए गए हैं, तो आप उस पर सोल हैं।
xenoterracide

4
इस तरह के एक प्रश्न ने मुझे वर्षों तक आश्चर्यचकित करने के लिए कुछ किया है। यह एक ऐसी स्वाभाविक इच्छा प्रतीत होती है: बिना रूट किए, अपने उपयोगकर्ता की कुछ अनुमतियों के साथ प्रक्रियाओं को चलाने में सक्षम होने के लिए, अर्थात एक उपयोगकर्ता-सेटअप "जेल" में एक प्रक्रिया को सीमित करने में सक्षम होने के लिए, जो प्रक्रिया को भी दे देगा। अपने उपयोगकर्ता की तुलना में कम अधिकार। यह एक दया है कि सामान्य यूनियनों ने इसे मानक रूप से पेश नहीं किया है!
इम्ज़ - इवान ज़खरीशेव

2
अपने सिस्टम व्यवस्थापक से आपको दूसरा उपयोगकर्ता खाता बनाने के लिए कहने का प्रयास करें।
लॉरेंस सी

जवाबों:


23

अधिक समान Qs अधिक ध्यान देने योग्य उत्तर के साथ:

नोट: वहां दिए गए कुछ उत्तर विशिष्ट समाधानों की ओर इशारा करते हैं जो अभी तक यहां उल्लेखित नहीं हैं।

असल में, अलग-अलग कार्यान्वयन के साथ काफी कुछ जेलिंग टूल हैं, लेकिन उनमें से कई या तो डिजाइन द्वारा सुरक्षित नहीं हैं (जैसे fakeroot, LD_PRELOAD-बेड), या पूरा नहीं (जैसे fakeroot-ng, -बेडptrace ), या रूट की आवश्यकता होगी ( chrootया, या नकलीचोटplash पर उल्लेख किया गया है ) चेतावनी लेबल )।

ये सिर्फ उदाहरण हैं; मैंने इन 2 विशेषताओं ("भरोसा किया जा सकता है?", "सेट अप करने के लिए रूट की आवश्यकता है") के संकेत के साथ, उन्हें सभी साइड-बाय-साइड सूचीबद्ध करने का सोचा, शायद ऑपरेटिंग-सिस्टम-स्तरीय वर्चुअलाइजेशन कार्यान्वयन पर

सामान्य तौर पर, वहाँ के उत्तर संभावनाओं की पूर्ण वर्णित सीमा और उससे भी अधिक को कवर करते हैं:

वर्चुअल मशीन / ओएस

कर्नेल एक्सटेंशन (SELinux की तरह)

  • (यहां टिप्पणियों में उल्लेख किया गया है),

chroot

चेरोट-आधारित सहायक (जो कि हालांकि रूट सेट किया जाना चाहिए, क्योंकि chrootरूट की आवश्यकता होती है; या शायद chrootएक अलग नामस्थान में काम कर सकता है - नीचे देखें):

[उनके बारे में थोड़ा और बताने के लिए!]

ज्ञात चुरोट-आधारित अलगाव उपकरण:

  • इसके hsh-runऔर hsh-shellआदेशों के साथ हैशर । ( हैशर को एक सुरक्षित और दोहराने योग्य तरीके से सॉफ़्टवेयर बनाने के लिए डिज़ाइन किया गया था।)
  • एक अन्य जवाब में विद्वानों का उल्लेख है
  • ...

ptrace

एक और भरोसेमंद अलगाव समाधान ( एक-केseccomp अलावा एक ) के माध्यम से पूरा syscall- अवरोधन होगा ptrace, जैसा कि मैनपेज में बताया गया है fakeroot-ng:

पिछले कार्यान्वयनों के विपरीत, फ़ेकरूट-एनजी एक ऐसी तकनीक का उपयोग करता है जो पता लगाने की प्रक्रिया को छोड़ देता है कि वह फ़ेकरूट-एनजी की "सेवाओं" का उपयोग करेगा या नहीं। किसी प्रोग्राम को स्टेटिकली कंपाइल करना, सीधे कर्नेल को कॉल करना और खुद के एड्रेस स्पेस को मैनिपुलेट करना ये सभी तकनीकें हैं जिनका उपयोग किसी प्रक्रिया पर LD_PRELOAD आधारित नियंत्रण को बायपास करने के लिए किया जा सकता है और फ़ेकरूट-एनजी पर लागू नहीं होता है। यह है, सैद्धांतिक रूप से, इस तरह से fakeroot-ng ढालना संभव के रूप में पता लगाया प्रक्रिया पर कुल नियंत्रण है।

जबकि यह सैद्धांतिक रूप से संभव है, यह नहीं किया गया है। फ़ेकरूट-एनजी कुछ "अच्छी तरह से व्यवहार किया" मान्यताओं के बारे में अनुमान लगाता है कि प्रक्रिया के बारे में पता लगाया जा रहा है, और एक प्रक्रिया जो उन मान्यताओं को तोड़ सकती है, अगर पूरी तरह से बच नहीं सकती है, तो कम से कम कुछ "नकली" वातावरण के लिए इसे fakeroot पर लगाया जाए- एनजी। जैसे, आपको एक सुरक्षा उपकरण के रूप में फ़ेकरूट-एनजी का उपयोग करने के खिलाफ कड़ी चेतावनी दी जाती है। बग रिपोर्ट जो दावा करती है कि एक प्रक्रिया जानबूझकर (जैसा कि अनजाने में विरोध किया गया है) नकली‐ रूट-एनजी के नियंत्रण से बच जाएगी या तो "बग नहीं" या कम प्राथमिकता के रूप में चिह्नित किया जाएगा।

यह संभव है कि इस नीति को भविष्य में पुनर्विचार किया जाए। हालाँकि, कुछ समय के लिए आपको चेतावनी दी गई है।

फिर भी, जैसा कि आप इसे पढ़ सकते हैं, fakeroot-ngखुद को इस उद्देश्य के लिए डिज़ाइन नहीं किया गया है।

(BTW, मुझे आश्चर्य है कि उन्होंने seccompक्रोमियम के बजाय -based दृष्टिकोण का उपयोग करने के लिए क्यों चुना है एक- ptraceआधारित ...)

ऊपर वर्णित उपकरणों में से, मैंने अपने लिए जियोर्डी को नोट किया है, क्योंकि मुझे यह पसंद है कि नियंत्रण कार्यक्रम हास्केल में लिखा गया है।

ज्ञात ptrace- आधारित अलगाव उपकरण:

seccomp

अलगाव को प्राप्त करने का एक ज्ञात तरीका Google क्रोमियम में उपयोग किए जाने वाले seccomp सैंडबॉक्सिंग दृष्टिकोण के माध्यम से है । लेकिन यह दृष्टिकोण यह बताता है कि आप एक सहायक लिखते हैं जो "इंटरसेप्टेड" फ़ाइल एक्सेस और अन्य syscalls के कुछ (अनुमत लोगों) को संसाधित करेगा; और यह भी, निश्चित रूप से, syscalls को "अवरोधन" करने का प्रयास करें और उन्हें सहायक में पुनर्निर्देशित करें (शायद, इसका मतलब यह भी होगा कि नियंत्रित प्रक्रिया के कोड में इंटरसेप्टेड syscalls की जगह के रूप में; इसलिए, यह ध्वनि नहीं करता है; काफी सरल होने के लिए; यदि आप रुचि रखते हैं, तो आप केवल मेरे उत्तर के बजाय विवरणों को पढ़ेंगे)।

अधिक संबंधित जानकारी (विकिपीडिया से):

(अंतिम आइटम दिलचस्प लग रहा है अगर कोई seccompक्रोमियम के बाहर सामान्य- आधारित समाधान की तलाश कर रहा है। "seccomp-nurse" के लेखक से पढ़ने लायक एक ब्लॉग पोस्ट भी है: SECCOMP सैंडबॉक्सिंग समाधान के रूप में ।)

"Seccomp- नर्स" परियोजना से इस दृष्टिकोण का चित्रण :

                      यहाँ छवि विवरण दर्ज करें

लिनक्स के भविष्य में एक "लचीला" seccomp संभव है?

2009 में भी लिनक्स कर्नेल को पैच करने के सुझाव दिए गए थे ताकि seccompमोड में अधिक लचीलापन हो - ताकि "कई कलाबाजियां जिनकी हमें वर्तमान में आवश्यकता है, उनसे बचा जा सके"। ("एक्रोबेटिक्स" एक सहायक लिखने की जटिलताओं को संदर्भित करता है जिसे जेल की प्रक्रिया की ओर से कई संभावित निर्दोष syscalls को निष्पादित करना पड़ता है और जेल की प्रक्रिया में संभवतः निर्दोष syscalls को प्रतिस्थापित करना होता है।) LWN लेख ने इस बिंदु पर लिखा है:

एक सुझाव जो सामने आया वह था एक नया "मोड" जोड़ने के लिए seccomp। एपीआई को इस विचार के साथ डिजाइन किया गया था कि विभिन्न अनुप्रयोगों में विभिन्न सुरक्षा आवश्यकताएं हो सकती हैं; इसमें एक "मोड" मान शामिल है जो प्रतिबंधों को निर्दिष्ट करता है जिन्हें जगह में रखा जाना चाहिए। केवल मूल मोड को कभी लागू किया गया है, लेकिन दूसरों को निश्चित रूप से जोड़ा जा सकता है। एक नया मोड बनाना जिसने आरंभ करने की प्रक्रिया को निर्दिष्ट करने की अनुमति दी कि कौन सी सिस्टम कॉल की अनुमति होगी, क्रोम सैंडबॉक्स जैसी स्थितियों के लिए सुविधा को अधिक उपयोगी बना देगा।

एडम लैंगली (Google के भी) ने एक पैच पोस्ट किया है जो कि बस यही करता है। नया "मोड 2" कार्यान्वयन एक बिटमास्क को स्वीकार करता है जो बताता है कि कौन से सिस्टम कॉल सुलभ हैं। यदि उन में से एक prctl () है, तो सैंडबॉक्स कोड अपने स्वयं के सिस्टम कॉल को प्रतिबंधित कर सकता है (लेकिन यह सिस्टम कॉल तक पहुंच को बहाल नहीं कर सकता है जिसे अस्वीकार कर दिया गया है)। सभी ने बताया, यह एक उचित समाधान की तरह दिखता है जो सैंडबॉक्स डेवलपर्स के लिए जीवन को आसान बना सकता है।

उस ने कहा, इस कोड को कभी विलय नहीं किया जा सकता क्योंकि चर्चा अन्य संभावनाओं पर आगे बढ़ी है।

यह "लचीला सेकंडपैक" लिनक्स में वांछित सुविधा प्रदान करने के लिए लिनक्स की संभावनाओं को करीब लाएगा, बिना सहायकों को लिखने की आवश्यकता के बिना जटिल।

(इस उत्तर के रूप में मूल रूप से एक ही सामग्री के साथ एक ब्लॉग पोस्टिंग: http://geofft.mit.edu/blog/sbb/33 ।)

नाम स्थान ( unshare)

नेमस्पेस ( -बेड unshareसॉल्यूशंस ) के माध्यम से अलग करना - यहां उल्लेख नहीं किया गया है - उदाहरण के लिए, माउंटिंग-पॉइंट्स (FUSE के साथ संयुक्त)?

नामस्थानों पर अधिक, अब, जैसा कि उनका कार्यान्वयन पूरा हो चुका है (यह अलगाव तकनीक nme "लिनक्स कंटेनर", या "LXC" के तहत जाना जाता है , है ना? ..):

"नामस्थानों के समग्र लक्ष्यों में से एक कंटेनर के कार्यान्वयन का समर्थन करना है, हल्के वर्चुअलाइजेशन के लिए एक उपकरण (साथ ही अन्य उद्देश्य)"

एक नया उपयोगकर्ता नाम स्थान बनाना भी संभव है, ताकि "एक प्रक्रिया में उपयोगकर्ता नामस्थान के बाहर एक सामान्य अनपेक्षित उपयोगकर्ता ID हो सकती है, जबकि एक ही समय में उपयोगकर्ता नाम के अंदर 0 का उपयोगकर्ता ID हो सकता है। इसका मतलब है कि यह प्रक्रिया पूर्ण रूट विशेषाधिकार है। उपयोगकर्ता नामस्थान के अंदर संचालन के लिए, लेकिन नाम स्थान के बाहर संचालन के लिए अनपेक्षित है "।

ऐसा करने के लिए वास्तविक कार्य आदेशों के लिए, निम्न उत्तरों को देखें:

और विशेष उपयोगकर्ता-अंतरिक्ष प्रोग्रामिंग / संकलन

लेकिन ठीक है, ज़ाहिर है, वांछित "जेल" की गारंटी उपयोगकर्ता-अंतरिक्ष में प्रोग्रामिंग से लागू होती है ( ओएस से इस के लिए अतिरिक्त समर्थन के बिना ; शायद यही कारण है कि यह सुविधा ओएसईएस के डिजाइन में पहले स्थान पर शामिल नहीं हुई है। ); अधिक या कम जटिलताओं के साथ।

उल्लेख किया ptrace- या- seccompसैंड सैंडबॉक्सिंग को सैंडबॉक्स-हेल्पर लिखकर गारंटी को लागू करने के कुछ वेरिएंट के रूप में देखा जा सकता है जो आपकी अन्य प्रक्रियाओं को नियंत्रित करेगा, जिसे "ब्लैक बॉक्स" के रूप में माना जाएगा, अनिक्स प्रोग्राम।

एक अन्य दृष्टिकोण प्रोग्रामिंग तकनीकों का उपयोग करना हो सकता है जो उन प्रभावों के बारे में परवाह कर सकते हैं जिन्हें अस्वीकृत होना चाहिए। (यह आपको होना चाहिए जो तब प्रोग्राम लिखते हैं, वे अब ब्लैक बॉक्स नहीं हैं।) एक का उल्लेख करने के लिए, एक शुद्ध प्रोग्रामिंग भाषा का उपयोग करना (जो आपको साइड-इफेक्ट्स के बिना प्रोग्राम करने के लिए मजबूर करेगा) जैसे हास्केल बस सभी प्रभावों को बना देगा प्रोग्राम स्पष्ट है, इसलिए प्रोग्रामर आसानी से सुनिश्चित कर सकता है कि कोई अस्वीकृत प्रभाव नहीं होगा।

मुझे लगता है, कुछ अन्य भाषा, जैसे, जावा में प्रोग्रामिंग के लिए सैंडबॉक्सिंग सुविधाएं उपलब्ध हैं।


इस विषय पर जानकारी जमा करने वाले कुछ पृष्ठों को भी वहां के उत्तरों में इंगित किया गया था:


रूटलेस गोबॉइनक्स एक विकल्प के रूप में अच्छी तरह से हो सकता है ...
टोबियास किंजलर

@tobias लेकिन क्या रूटलेस गोबोलिनक्स गारंटी देता है कि एक उपयोगकर्ता द्वारा लिखा गया प्रोग्राम बाहरी वातावरण तक नहीं पहुंच
पाएगा

1
वास्तव में नहीं - मैं किसी तरह गलत धारणा के तहत था कि यह एक "स्थानीय" रूट उपयोगकर्ता बनने की अनुमति देगा, जो तब वर्चुअल उपयोगकर्ताओं को इस तरह की प्रक्रिया के लिए बना सकता है - हालांकि इसका उपयोग करना संभव हो सकता है chroot, लेकिन इसके लिए अभी भी आवश्यकता होगी वास्तविक मूल विशेषाधिकार ...
टोबियास किन्ज़लर

8

यह यूनिक्स अनुमति मॉडल का एक मौलिक सीमा है: केवल रूट ही प्रतिनिधि कर सकता है।

आपको वर्चुअल मशीन (सभी VM तकनीकों का सच नहीं) को चलाने के लिए रूट होने की आवश्यकता नहीं है, लेकिन यह एक हेवीवेट समाधान है।

उपयोगकर्ता-मोड लिनक्स अपेक्षाकृत हल्का लिनक्स-ऑन-लिनक्स वर्चुअलाइजेशन समाधान है। इसे स्थापित करना इतना आसान नहीं है; आप कम से कम न्यूनतम बूट करने के लिए आवश्यक (में कुछ फाइलों के साथ एक रूट विभाजन (एक निर्देशिका में) को भरने के लिए की आवश्यकता होगी /etc, /sbin/initऔर उसके निर्भरता, एक लॉगिन कार्यक्रम, एक खोल और उपयोगिताओं)।


1

मुझे लगता है कि आप LD_PRELOADकुछ फ़ाइलों के लिए अवरोधन के साथ कुछ किस्मत हो सकती है, लेकिन यह वास्तव में मुश्किल हो सकता है।


Google क्रोमियम की seccomp सैंडबॉक्सिंग एक अधिक विश्वसनीय चीज़ है - syscall अवरोधन, प्रभावी रूप से। - unix.stackexchange.com/questions/6433/…
imz - Ivan Zakharyaschev

बस किसी चीज़ को रोकने की कोशिश करने और (क्रोमियम के मामले में) के बीच अंतर अलगाव की गारंटी है।
इम्ज़ - इवान ज़खरीशेव 13

1
के माध्यम से अवरोधन पर LD_PRELOADभरोसा नहीं किया जा सकता (खतना किया जा सकता है), लेकिन इसके माध्यम से अवरोधनptrace
इम्ज़ - इवान ज़खरीशेव

1
एक सरल उदाहरण यहां प्रस्तुत किया गया है < joey.kitenet.net/blog/entry/fakechroot_warning_label > जो दिखाता है कि -basedLD_PRELOAD समाधान को सुरक्षा उपाय के रूप में भरोसा नहीं किया जा सकता है।
इम्ज़ - इवान ज़खरीशेव

0

पूरी सूची से मैं सिर्फ जोड़ना चाहूंगा:

  • फ़ेकरूट (डेबियन पैकेज मेनटेनर से): इसका उद्देश्य "दोस्ताना" टूल के साथ पैकेज बनाना है। यह पूर्ण अलगाव नहीं है, लेकिन यह विभिन्न उपयोगकर्ताओं और नकली उपकरणों और अन्य विशेष छद्म फाइलों के साथ पैकेज बनाने में मदद करता है।

  • नकली (जो फ़ेकरूट का उपयोग करता है)। इस कार्यक्रम में कई बग हैं। उदाहरण के लिए, "/ etc / मेजबान" glibc में हार्डकोड किया गया है: आप इसे इस टूल के माध्यम से नहीं बदल सकते।

  • qemu: आपको एक लिनक्स कर्नेल संकलित करने की आवश्यकता है, लेकिन परिणाम बहुत तेज़ है, और यह असली जड़ विशेषाधिकारों के साथ एक "नकली" (यानी आभासी) मशीन है। आप किसी भी बूट छवि को बना सकते हैं और माउंट कर सकते हैं।


0

फायरजेल किसी भी प्रक्रिया को जेल करने का एक अच्छा साधन है, जिसमें बहुत सारे विकल्प और बहुत लचीले तरीके से रूट एक्सेस के बिना या बिना:


2
फायरजेल का उपयोग करने पर थोड़ा और विस्तार से स्वागत किया जाएगा। उस लिंक के मृत हो जाने के बाद, आपके उत्तर की जानकारी सामग्री केवल उपयोगिताओं के नाम पर चली जाएगी। (इसमें शामिल हैं कि क्या यह वितरण पर उपलब्ध पैकेज है, इसका उपयोग कैसे करें आदि)।
एंथन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.