10 KiB
CGroup Namespace
{{#include ../../../../banners/hacktricks-training.md}}
Basic Information
Cgroup namespace एक Linux kernel फीचर है जो namespace के भीतर चल रहे प्रक्रियाओं के लिए cgroup hierarchies का पृथक्करण प्रदान करता है। Cgroups, जिसका संक्षिप्त रूप control groups है, एक kernel फीचर है जो प्रक्रियाओं को हायरार्किकल समूहों में व्यवस्थित करने की अनुमति देता है ताकि CPU, मेमोरी, और I/O जैसे सिस्टम संसाधनों पर सीमाएँ प्रबंधित और लागू की जा सकें।
हालांकि cgroup namespaces अन्य प्रकार के namespaces (PID, mount, network, आदि) की तरह एक अलग namespace प्रकार नहीं हैं, वे namespace पृथक्करण के सिद्धांत से संबंधित हैं। Cgroup namespaces cgroup hierarchy का दृश्य वर्चुअलाइज़ करते हैं, ताकि cgroup namespace के भीतर चल रही प्रक्रियाएँ होस्ट या अन्य namespaces में चल रही प्रक्रियाओं की तुलना में hierarchy का एक अलग दृश्य देख सकें।
How it works:
- जब एक नया cgroup namespace बनाया जाता है, यह बनाने वाली प्रक्रिया के cgroup के आधार पर cgroup hierarchy का एक दृश्य के साथ शुरू होता है। इसका मतलब है कि नए cgroup namespace में चल रही प्रक्रियाएँ पूरी cgroup hierarchy का केवल एक उपसमुच्चय देखेंगी, जो बनाने वाली प्रक्रिया के cgroup पर आधारित cgroup subtree तक सीमित है।
- cgroup namespace के भीतर प्रक्रियाएँ अपनी स्वयं की cgroup को hierarchy के मूल के रूप में देखेंगी। इसका मतलब है कि namespace के भीतर प्रक्रियाओं के दृष्टिकोण से, उनकी अपनी cgroup मूल के रूप में प्रकट होती है, और वे अपनी स्वयं की subtree के बाहर cgroups को नहीं देख या एक्सेस नहीं कर सकते।
- Cgroup namespaces सीधे संसाधनों का पृथक्करण प्रदान नहीं करते; वे केवल cgroup hierarchy दृश्य का पृथक्करण प्रदान करते हैं। संसाधन नियंत्रण और पृथक्करण अभी भी cgroup subsystems (जैसे, cpu, memory, आदि) द्वारा लागू किया जाता है।
CGroups के बारे में अधिक जानकारी के लिए देखें:
{{#ref}} ../cgroups.md {{#endref}}
Lab:
Create different Namespaces
CLI
sudo unshare -C [--mount-proc] /bin/bash
एक नए /proc फ़ाइल सिस्टम के उदाहरण को माउंट करके, यदि आप पैरामीटर --mount-proc का उपयोग करते हैं, तो आप सुनिश्चित करते हैं कि नए माउंट नामस्थान में उस नामस्थान के लिए विशिष्ट प्रक्रिया जानकारी का सटीक और अलगावित दृश्य है।
त्रुटि: bash: fork: मेमोरी आवंटित नहीं कर सकता
जब unshare को -f विकल्प के बिना निष्पादित किया जाता है, तो एक त्रुटि उत्पन्न होती है क्योंकि Linux नए PID (प्रक्रिया आईडी) नामस्थान को संभालने के तरीके के कारण। मुख्य विवरण और समाधान नीचे दिए गए हैं:
- समस्या का विवरण:
- Linux कर्नेल एक प्रक्रिया को
unshareसिस्टम कॉल का उपयोग करके नए नामस्थान बनाने की अनुमति देता है। हालाँकि, नए PID नामस्थान के निर्माण की शुरुआत करने वाली प्रक्रिया (जिसे "unshare" प्रक्रिया कहा जाता है) नए नामस्थान में प्रवेश नहीं करती है; केवल इसकी बाल प्रक्रियाएँ करती हैं। %unshare -p /bin/bash%चलाने से/bin/bashउसी प्रक्रिया में शुरू होता है जैसेunshare। परिणामस्वरूप,/bin/bashऔर इसकी बाल प्रक्रियाएँ मूल PID नामस्थान में होती हैं।- नए नामस्थान में
/bin/bashकी पहली बाल प्रक्रिया PID 1 बन जाती है। जब यह प्रक्रिया समाप्त होती है, तो यह नामस्थान की सफाई को ट्रिगर करती है यदि कोई अन्य प्रक्रियाएँ नहीं हैं, क्योंकि PID 1 का विशेष कार्य अनाथ प्रक्रियाओं को अपनाना है। Linux कर्नेल तब उस नामस्थान में PID आवंटन को अक्षम कर देगा।
- परिणाम:
- नए नामस्थान में PID 1 का समाप्त होना
PIDNS_HASH_ADDINGध्वज की सफाई की ओर ले जाता है। इसके परिणामस्वरूप, नए प्रक्रिया बनाने के दौरानalloc_pidफ़ंक्शन नए PID को आवंटित करने में विफल रहता है, जिससे "Cannot allocate memory" त्रुटि उत्पन्न होती है।
- समाधान:
- इस समस्या को
unshareके साथ-fविकल्प का उपयोग करके हल किया जा सकता है। यह विकल्पunshareको नए PID नामस्थान बनाने के बाद एक नई प्रक्रिया बनाने के लिए फोर्क करता है। %unshare -fp /bin/bash%निष्पादित करने से यह सुनिश्चित होता है किunshareकमांड स्वयं नए नामस्थान में PID 1 बन जाता है।/bin/bashऔर इसकी बाल प्रक्रियाएँ फिर इस नए नामस्थान में सुरक्षित रूप से समाहित होती हैं, PID 1 के पूर्व समय में समाप्त होने को रोकती हैं और सामान्य PID आवंटन की अनुमति देती हैं।
यह सुनिश्चित करके कि unshare -f ध्वज के साथ चलता है, नए PID नामस्थान को सही ढंग से बनाए रखा जाता है, जिससे /bin/bash और इसकी उप-प्रक्रियाएँ बिना मेमोरी आवंटन त्रुटि का सामना किए कार्य कर सकती हैं।
Docker
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
जांचें कि आपका प्रोसेस किस नेमस्पेस में है
ls -l /proc/self/ns/cgroup
lrwxrwxrwx 1 root root 0 Apr 4 21:19 /proc/self/ns/cgroup -> 'cgroup:[4026531835]'
सभी CGroup नामस्थान खोजें
sudo find /proc -maxdepth 3 -type l -name cgroup -exec readlink {} \; 2>/dev/null | sort -u
# Find the processes with an specific namespace
sudo find /proc -maxdepth 3 -type l -name cgroup -exec ls -l {} \; 2>/dev/null | grep <ns-number>
CGroup namespace के अंदर प्रवेश करें
nsenter -C TARGET_PID --pid /bin/bash
आप केवल दूसरे प्रक्रिया नामस्थान में प्रवेश कर सकते हैं यदि आप रूट हैं। और आप दूसरे नामस्थान में प्रवेश नहीं कर सकते बिना एक वर्णनकर्ता जो इसे इंगित करता है (जैसे /proc/self/ns/cgroup)।
संदर्भ
{{#include ../../../../banners/hacktricks-training.md}}