`Nsenter:` का उपयोग करके बाल प्रक्रियाओं को जेल करने का विश्वसनीय तरीका


15

मुझे पता है कि कई अन्य चीजों के अलावा, लिनक्स नेमस्पेस को लीवरेज किया जा सकता है, ताकि किसी भी मौके के बिना उनके सुरक्षित और सीमित बच्चे की प्रक्रियाओं को प्रतिबंधित किया जा सके init। लेकिन मैं कार्यान्वयन विवरण पर फ़र्ज़ी हूं। मैं util-linuxइस तरह के रूप में प्रदान किए गए औजारों का उपयोग कैसे कर सकता हूं mountऔर nsenterदेख सकता हूं , मॉनिटर कर सकता हूं और यह सुनिश्चित कर सकता हूं कि लॉन्च की गई सभी प्रक्रियाएं किसी अन्य प्रक्रिया के प्रत्यक्ष नाम स्थान के वंशज हैं?

जवाबों:


19

PID नाम स्थान बनाएँ

यहाँ उपयोग करने का सही आदेश है unshare। ध्यान दें कि ऐसा करने के लिए आवश्यक विकल्प केवल से उपलब्ध हैं util-linux 2.23। यह विचार है कि आप जिस प्रोग्राम को चला रहे हैं, उसके लिए एक नया पीआईडी ​​नामस्थान बनाया जाए, इस नाम स्थान पर उसके सभी बच्चे भी बनाए गए हैं। आप बस एक नया PID नामस्थान में एक कमांड चला सकते हैं:

sudo unshare -fp some_command

एक शेल चलाने के लिए, बस कमांड को छोड़ दें। यह एक ऐसी प्रक्रिया बनाएगा, जिसमें अपने किसी भी बच्चे के साथ माता-पिता (सिस्टम) के नामस्थान के भीतर हमेशा की तरह एक पीआईडी ​​होगा। हालांकि, नए नामस्थान के भीतर, 1इस initप्रक्रिया की कुछ विशेष विशेषताओं के साथ एक पीआईडी ​​होगा । शायद एक निगरानी के दृष्टिकोण से सबसे अधिक प्रासंगिक विशेषता यह है कि यदि इसके किसी भी वंशज अनाथ हैं, तो वे वास्तविक initप्रक्रिया के बजाय इस प्रक्रिया में फिर से सम्‍मिलित होंगे ।

ज्यादातर मामलों की निगरानी के लिए बस ऐसा करना काफी हो सकता है। जैसा कि पहले उल्लेख किया गया है, सभी नामस्थानों के भीतर की प्रक्रियाओं में मूल नाम स्थान के भीतर PID होते हैं, इसलिए उनकी गतिविधियों की निगरानी के लिए नियमित आदेशों का उपयोग किया जा सकता है। हमें यह भी आश्वासन दिया जाता है कि अगर नाम स्थान में कोई भी प्रक्रिया अनाथ हो जाती है, तो यह शीर्ष स्तर के कार्यक्रम के पीआईडी ​​के नीचे प्रक्रिया पेड़ की शाखाओं से बाहर नहीं गिरेगी, जिसका अर्थ है कि इसे अभी भी आसानी से ट्रैक किया जा सकता है।

एक माउंट नेमस्पेस के साथ मिलाएं

हालाँकि, हम जो नहीं कर सकते हैं वह पीआईडी ​​के संबंध में प्रक्रिया की निगरानी करता है जो यह सोचता है कि यह है। ऐसा करने के लिए, और विशेष रूप से psनए नामस्थान के भीतर कमांड का उपयोग करने में सक्षम होने के लिए , आपको नामस्थान के लिए एक अलग procfsफाइल सिस्टम माउंट करने की आवश्यकता है । यह बदले में एक और समस्या की ओर जाता है क्योंकि एकमात्र स्थान जिसके लिए psस्वीकार करता procfsहै /proc। एक समाधान यह होगा कि एक chrootजेल बनाई जाए और procfsवहां नया माउंट किया जाए । लेकिन यह एक बोझिल दृष्टिकोण है क्योंकि कम से कम हमें किसी भी बायनेरिज़ को कॉपी करने (या कम से कम हार्ड लिंक) की आवश्यकता होती है जिसे हम किसी भी पुस्तकालयों के साथ उपयोग करने का इरादा रखते हैं जो वे नई जड़ पर निर्भर करते हैं।

समाधान यह भी है कि एक नए माउंट नेमस्पेस का उपयोग किया जाए । इसके भीतर हम नए procfsको सही तरीके से माउंट कर सकते हैं जो सही रूट /procनिर्देशिका का उपयोग करता है , पीआईडी ​​नाम स्थान के भीतर उपयोग करने योग्य हो सकता है और किसी और चीज के साथ हस्तक्षेप नहीं करता है। इस प्रक्रिया को बहुत सरल बनाने के लिए, unshareकमांड --mount-procविकल्प देता है :

sudo unshare -fp --mount-proc some_command

अब psसंयुक्त नामस्थानों के भीतर चलने पर केवल PID नामस्थान के साथ प्रक्रियाएँ दिखाई देंगी और यह PID होने के रूप में शीर्ष स्तर की प्रक्रिया दिखाएगी 1

किस बारे में nsenter?

जैसा कि नाम से पता चलता है, nsenterएक नामस्थान में प्रवेश करने के लिए इस्तेमाल किया जा सकता है जो पहले से बनाया गया है unshare। यह उपयोगी है अगर हम नामपट के अंदर से जानकारी प्राप्त करना चाहते हैं अन्यथा असंबंधित लिपि से। सबसे आसान तरीका है कि नाम स्थान के भीतर चल रहे किसी भी कार्यक्रम के पीआईडी ​​को एक्सेस करें। यह स्पष्ट करने के लिए कि नामस्थान के भीतर से लक्षित कार्यक्रम का पीआईडी ​​होना चाहिए, जहां nsenterसे चलाया जा रहा है (क्योंकि नामस्थानों को नेस्ट किया जा सकता है, एक एकल प्रक्रिया के लिए कई पीआईडी ​​होना संभव है)। लक्ष्य PID / माउंट नामस्थान में एक शेल चलाने के लिए, बस करें:

sudo nsenter -t $PID -m -p

यदि यह नामस्थान ऊपर की तरह सेट किया गया है, psतो अब उस नाम स्थान के भीतर केवल प्रक्रियाओं को सूचीबद्ध करेगा।


धन्यवाद, ग्रीम। यह पहले ही सवाल का जवाब दे चुका है। वास्तव में मुझे क्या मिला यह पूछने के लिए कि हम / खरीद / pid / ns / * में विभिन्न फाइलों पर procfs मैन पेज से नोट्स पढ़ रहे हैं, जो कहता है: "इस फाइल को बढ़ते हुए देखें (माउंट (2) देखें) फाइलसिस्टम में कहीं और रखता है। ... इस प्रक्रिया के नाम स्थान जिंदा द्वारा निर्दिष्ट, भले ही सभी प्रक्रियाएं वर्तमान में नाम स्थान समाप्त हो जाएं। " शायद ही एक ही सवाल है, मुझे पता है, लेकिन यह पहले से ही इतना अच्छा है कि मैंने सोचा कि अगर आपको लगा कि यह प्रासंगिक है तो आप इसे जोड़ना चाह सकते हैं। linux.die.net/man/5/proc
mikeserv

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

हाँ, बाकी पर भी यकीन नहीं im। लेकिन इस जवाब के साथ manऔर खुद के लिए एक सप्ताहांत के साथ मेरा मतलब है कि इसके साथ थोड़ा और परिचित हों। एक बार फिर धन्यवाद। हो सकता है कि --user नामस्थान में इसकी अधिक प्रासंगिकता हो ।
1
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.