एक अनपेक्षित एलएक्ससी कंटेनर क्या है?


20

अगर लिनक्स कंटेनर (LXC कंटेनर) को "अनप्रिविल्ड" कहा जाता है तो इसका क्या मतलब है?

जवाबों:


20

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

कुछ समय के लिए अनपेक्षित एलएक्ससी कंटेनरों की मेरी प्रारंभिक धारणा के विपरीत, इसका मतलब यह नहीं है कि कंटेनर को एक अप्रकाशित होस्ट उपयोगकर्ता के स्वामित्व में होना चाहिए। वह केवल एक संभावना है।

प्रासंगिक है:

  1. मेज़बान उपयोगकर्ता ( usermod [-v|-w|--add-sub-uids|--add-sub-gids]) के लिए अधीनस्थ यूआईडी और जीआईडी ​​की एक सीमा परिभाषित की गई है
  2. ... और यह श्रेणी कंटेनर कॉन्फ़िगरेशन में मैप की गई है ( lxc.id_map = ...)

यहां तक ​​कि rootअप्रकाशित कंटेनरों के मालिक भी हो सकते हैं, क्योंकि मेजबान पर कंटेनर प्रक्रियाओं के प्रभावी यूआईडी मैपिंग द्वारा परिभाषित सीमा के अंदर समाप्त हो जाएंगे।

हालाँकि, इसके लिए rootआपको पहले अधीनस्थ आईडी को परिभाषित करना होगा। विपरीत उन के माध्यम से बनाया adduser, rootडिफ़ॉल्ट रूप से परिभाषित अधीनस्थ आईडी की एक सीमा नहीं होगी।

यह भी ध्यान रखें कि आपके द्वारा दी गई पूरी सीमा आपके निपटान में है, इसलिए आपके पास निम्नलिखित कॉन्फ़िगरेशन लाइनों के साथ 3 कंटेनर हो सकते हैं (केवल यूआईडी मानचित्रण दिखाया गया है):

  1. lxc.id_map = u 0 100000 100000
  2. lxc.id_map = u 0 200000 100000
  3. lxc.id_map = u 0 300000 100000

यह मानते हुए कि root100000 और 400000 के बीच अधीनस्थ यूआईडी का मालिक है। मैंने पाया कि सभी दस्तावेज प्रति कंटेनर 65536 अधीनस्थ आईडी का उपयोग करने का सुझाव देते हैं, कुछ इसे अधिक मानव-पठनीय बनाने के लिए 100000 का उपयोग करते हैं, हालांकि।

दूसरे शब्दों में: आपको प्रत्येक कंटेनर में एक ही रेंज असाइन करने की आवश्यकता नहीं है।

4 बिलियन से अधिक (~ 2^32) संभव अधीनस्थ आईडी का मतलब है कि आप अपने मेजबान उपयोगकर्ताओं के अधीनस्थ श्रेणियों से निपटने के दौरान उदार हो सकते हैं।

Unprivileged कंटेनर स्वामित्व में है और रूट द्वारा चलता है

फिर से रगड़ने के लिए। एक अप्रकाशित LXC अतिथि को मेजबान पर एक अप्रकाशित उपयोगकर्ता द्वारा चलाने की आवश्यकता नहीं है।

इस तरह से एक अधीनस्थ यूआईडी / जीआईडी ​​मैपिंग के साथ अपने कंटेनर को कॉन्फ़िगर करना:

lxc.id_map = u 0 100000 100000
lxc.id_map = g 0 100000 100000

जहां rootहोस्ट पर मौजूद उपयोगकर्ता उस दिए गए अधीनस्थ ID श्रेणी का मालिक है, आपको मेहमानों को और भी बेहतर बनाने की अनुमति देगा।

हालांकि, ऐसे परिदृश्य में एक महत्वपूर्ण अतिरिक्त लाभ है (और हाँ, मैंने सत्यापित किया है कि यह काम करता है): आप सिस्टम स्टार्टअप पर अपना कंटेनर ऑटो-स्टार्ट कर सकते हैं।

आमतौर पर जब LXC के बारे में जानकारी के लिए वेब पर दस्तखत किया जाता है, तो आपको बताया जाएगा कि यह एक unprivileged LXC अतिथि को ऑटोस्टार्ट करना संभव नहीं है। हालाँकि, यह केवल उन कंटेनरों के लिए डिफ़ॉल्ट रूप से सही है जो कंटेनर के लिए सिस्टम-वाइड स्टोरेज में नहीं हैं (आमतौर पर ऐसा कुछ /var/lib/lxc)। यदि वे हैं (जो आमतौर पर इसका मतलब है कि वे जड़ द्वारा बनाए गए थे और जड़ द्वारा शुरू किए गए हैं), तो यह पूरी तरह से अलग कहानी है।

lxc.start.auto = 1

एक बार जब आप इसे अपने कंटेनर कॉन्‍फ़िगर में रख देंगे, तो यह काम काफी अच्‍छे से होगा।

अनुमतियाँ और कॉन्फ़िगरेशन सही हो रही है

मैंने अपने आप से थोड़ा संघर्ष किया, इसलिए मैं यहां एक खंड जोड़ रहा हूं।

कॉन्फ़िगरेशन स्निपेट के अलावा lxc.includeजिसके माध्यम से आमतौर पर नाम /usr/share/lxc/config/$distro.common.conf(जहां $distroएक डिस्ट्रो का नाम है) जाता है, आपको यह देखना चाहिए कि क्या /usr/share/lxc/config/$distro.userns.confआपके सिस्टम पर भी है और इसमें भी शामिल है। उदाहरण के लिए:

lxc.include = /usr/share/lxc/config/ubuntu.common.conf
lxc.include = /usr/share/lxc/config/ubuntu.userns.conf

इसके अलावा अधीनस्थ आईडी मैपिंग जोड़ें:

lxc.id_map = u 0 100000 65535
lxc.id_map = g 0 100000 65535

जिसका अर्थ है कि होस्ट UID 100000 LXC अतिथि के उपयोगकर्ता नामस्थान के root अंदर है।

अब सुनिश्चित करें कि अनुमतियाँ सही हैं। यदि आपके अतिथि का नाम उस पर्यावरण चर में संग्रहित किया जाएगा जिसे $lxcguestआप निम्नलिखित में से किसी एक में चलाएंगे:

# Directory for the container
chown root:root $(lxc-config lxc.lxcpath)/$lxcguest
chmod ug=rwX,o=rX $(lxc-config lxc.lxcpath)/$lxcguest
# Container config
chown root:root $(lxc-config lxc.lxcpath)/$lxcguest/config
chmod u=rw,go=r $(lxc-config lxc.lxcpath)/$lxcguest/config
# Container rootfs
chown 100000:100000 $(lxc-config lxc.lxcpath)/$lxcguest/rootfs
chmod u=rwX,go=rX $(lxc-config lxc.lxcpath)/$lxcguest/rootfs

आपको अपने पहले प्रयास के बाद कुछ अनुमति-संबंधी त्रुटियां होने के बाद कंटेनर चलाने की अनुमति देनी चाहिए।


4
अच्छा जवाब - लेकिन lxcइस तरह की चीज की जरूरत नहीं है। आप util-linuxटूल का उपयोग करके किसी भी प्रकार का नाम स्थान कंटेनर बना सकते हैं unshare। आप util-linuxउपकरण का उपयोग करके उक्त कंटेनर में प्रवेश कर सकते हैं nsenter। बाद वाला टूल आपको इसके बिना पहले से निर्मित कंटेनर में चल रही प्रक्रियाओं को जोड़ने की अनुमति देता है। नामस्थान समर्थन को-कर्नेल में लागू किया गया है।
14

4
@ बाइक: आपका मतलब है कि आपको उपयोगकर्ता का उपयोग करने के लिए एलएक्ससी की आवश्यकता नहीं है ? मैं जानता था कि। मैं यह भी जानता हूं कि डॉकटर के पास अब इन सुविधाओं का उपयोग करने वाला अपना स्वयं का पुस्तकालय है। लेकिन आप LXC द्वारा दी जाने वाली सुविधाओं की मदद के बिना एक पूरे सिस्टम को कैसे कंटेनरीकृत करेंगे? और आप ऐसा क्यों करेंगे? मेरा मतलब है कि एक भी एप्लिकेशन शामिल है और इसके साथ संयुक्त chrootमदद कर सकता है, लेकिन एलएक्ससी पूरे सिस्टम को कंटेनरीकृत करने के लिए विभिन्न नाम रिक्त स्थान (यूटीएस, माउंट आदि ...) को जोड़ती है।
0xC0000022L

2
ठीक है ... जैसा कि मैंने कहा, unshareपहले से ही यह किसी भी / सभी विभिन्न नामस्थानों के लिए admirably करता है - और यहां तक ​​कि आपको /procएक एकल क्ली-स्विच के साथ एक अलग, निजी माउंट भी मिलेगा । यदि आपका एकल आवेदन है initऔर आपका chrootहै initramfsतो आपको सेकंड फ्लैट में एक पूरा कंटेनर मिलता है।
मोकेसर

0

0xC0000022L पर फॉलोअप करने के लिए, जिसके समाधान ने मेरे लिए ठीक काम किया, मैंने आवश्यक स्वामित्व परिवर्तनों को स्वचालित करने के लिए वृद्धि -uid-gid.pl पर्ल स्क्रिप्ट लिखी ताकि LXC कंटेनरों के भीतर फाइलें ठीक से मैप की जा सकें।

इसके बिना, इस प्रस्तावित सेटअप के साथ, LXC कंटेनर रूटफ़ के भीतर एक फ़ाइल मुख्य होस्ट पर 0 / रूट से संबंधित होगी, LXC कंटेनर के भीतर, 65534 / कोई भी मैप नहीं किया जाएगा। LXC कंटेनर के भीतर 0 / रूट पर मैप किए जाने के लिए, उन्हें होस्ट पर 100000 होना चाहिए।

यह यहां वर्णित है https://yeupou.wordpress.com/2017/06/23/setting-up-lxc-containers-with-mapped-giduid/ और स्क्रिप्ट सीधे gitlab https://gitlab.com पर प्राप्त की जा सकती है /yeupou/stalag13/blob/master/usr/local/bin/increase-uid-gid.pl

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