जब एक प्रक्रिया एक विशिष्ट समूह के रूप में चल रही हो तो लिनक्स अनुमतियां कैसे काम करती हैं?


12

यह कुछ ऐसा है जिसकी मुझे कोई जानकारी नहीं मिली है इसलिए किसी भी मदद की सराहना की जाएगी।

मेरी समझ इस प्रकार है। निम्न फ़ाइल लें:

-rw-r-----  1 root        adm   69524 May 21 17:31 debug.1

उपयोगकर्ता philइस फ़ाइल तक नहीं पहुँच सकता:

phil@server:/var/log$ head -n 1 debug.1
cat: debug.1: Permission denied

यदि समूह philमें जोड़ा जाता है adm, तो यह हो सकता है:

root@server:~# adduser phil adm
Adding user `phil' to group `adm' ...
Adding user phil to group adm
Done.
phil@server:/var/log$ head -n 1 debug.1
May 21 11:23:15 server kernel: [    0.000000] DMI: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.7.5.1-0-g8936dbb-20141113_115728-nilsson.home.kraxel.org 04/01/2014

यदि, हालांकि, एक प्रक्रिया शुरू की जाती है, जबकि यह स्पष्ट रूप से सेट करने के user:groupलिए phil:philफ़ाइल को पढ़ा नहीं जा सकता है। इस तरह शुरू हुई प्रक्रिया:

nice -n 19 chroot --userspec phil:phil / sh -c "process"

यदि इस प्रक्रिया को शुरू किया जाता है phil:adm, तो यह फाइल को पढ़ सकती है:

nice -n 19 chroot --userspec phil:adm / sh -c "process"

तो सवाल वास्तव में है:

एक विशिष्ट उपयोगकर्ता / समूह कॉम्बो के साथ एक प्रक्रिया चलाने के बारे में क्या विशेष है जो उस उपयोगकर्ता के पूरक समूहों द्वारा स्वामित्व वाली फ़ाइलों तक पहुंचने में सक्षम प्रक्रिया को रोकता है और क्या इसके आसपास कोई रास्ता है?


ध्यान दें कि शेल का इससे कोई लेना-देना नहीं है: अनुमतियाँ शेल द्वारा संसाधित नहीं होती हैं। यदि वे जहाँ आप एक नया खोल लिख कर रूट प्राप्त कर सकते हैं।
ctrl-alt-delor

जवाबों:


9

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

एक उदाहरण देखें। मेरे पास एक उपयोगकर्ता है user, और वह समूह में है student:

root@host:~$ id user
uid=10298(user) gid=20002(student) groups=20002(student)

मेरे पास फाइल इस प्रकार है:

root@host:~$ ls -l file
-rw-r----- 1 root root 9 Mai 29 13:39 file

वह इसे नहीं पढ़ सकता है:

user@host:~$ cat file
cat: file: Permission denied 

अब, मैं catउपयोगकर्ता userऔर समूह के संदर्भ में प्रक्रिया को बढ़ा सकता हूं root। अब, बिल्ली प्रक्रिया के लिए आवश्यक अनुमति है:

root@host:~$ chroot --userspec user:root / sh -c "cat file"
file contents

यह देखना दिलचस्प है कि क्या idकहता है:

root@host:~$ chroot --userspec user:root / sh -c "id"
uid=10298(user) gid=0(root) groups=20002(student),0(root)

एचएम, लेकिन उपयोगकर्ता userउस समूह में नहीं है ( root)। idइसका informations कहां से मिलता है? यदि तर्क के बिना कहा जाता है, idसिस्टम कॉल का उपयोग करता है getuid(), getgid()और getgroups()। अतः idस्वयं का प्रक्रिया प्रसंग मुद्रित है। वह संदर्भ हमने बदल दिया है --userspec

जब एक तर्क के साथ कहा जाता है, idतो उपयोगकर्ता के समूह असाइनमेंट को निर्धारित करता है:

root@host:~$ chroot --userspec user:root / sh -c "id user"
uid=10298(user) gid=20002(student) groups=20002(student)

आपके प्रश्न के लिए:

एक विशिष्ट उपयोगकर्ता / समूह कॉम्बो के साथ एक प्रक्रिया चलाने के बारे में क्या विशेष है जो उस उपयोगकर्ता के पूरक समूहों द्वारा स्वामित्व वाली फ़ाइलों तक पहुंचने में सक्षम प्रक्रिया को रोकता है और क्या इसके आसपास कोई रास्ता है?

आप सुरक्षा प्रक्रिया के संदर्भ को सेट कर सकते हैं, जिसे उस प्रक्रिया को हल करने की आवश्यकता है जो प्रक्रिया को करने की आवश्यकता है। प्रत्येक प्रक्रिया में एक uid और gid सेट होता है जिसके तहत वह चलता है। आम तौर पर कॉलिंग प्रक्रिया "यूजर्स" को संदर्भ के रूप में यूआईडी और जीआईडी ​​लेती है। "लेता है" से मेरा मतलब है कि कर्नेल करता है, अन्यथा यह एक सुरक्षा समस्या होगी।

तो, यह वास्तव में उपयोगकर्ता नहीं है, जिसके पास फ़ाइल को पढ़ने की कोई अनुमति नहीं है, इसकी प्रक्रिया 'अनुमति' ( cat) है। लेकिन यह प्रक्रिया कॉलिंग उपयोगकर्ता के यूआईडी / जीआईडी ​​के साथ चलती है।

तो आपको अपने यूआईडी और उस समूह के जीआईडी ​​के साथ चलने की प्रक्रिया के लिए एक विशिष्ट समूह में होने की आवश्यकता नहीं है।


2
एक प्रक्रिया में आम तौर पर केवल प्राथमिक समूह की साख होती है। यह माध्यमिक समूहों के क्रेडेंशियल्स के लिए acess प्राप्त कर सकता EUIDहै जो कॉलिंग का हिस्सा है initgroups(3)। हालाँकि, initgroups(3)यह एक अपेक्षाकृत महंगा ऑपरेशन है, क्योंकि इसमें सभी समूहों को शामिल करना है। इस कारण से, प्रक्रियाएं केवल तभी कॉल करती हैं initgroups(3)जब उनके पास ऐसा करने का एक विशिष्ट कारण हो।
lcd047

6

--userspecपर विकल्प का उपयोग chrootउपयोगकर्ता और एक एकल समूह निर्दिष्ट करता है जब चलाने के लिए उपयोग करें chroot। पूरक समूहों को परिभाषित करने के लिए आपको --groupsविकल्प का भी उपयोग करना होगा ।

डिफ़ॉल्ट प्रक्रियाओं द्वारा उपयोगकर्ता के प्राथमिक और अनुपूरक समूह उन्हें चलाते हैं, लेकिन उपयोग करके --userspecआप बता chmodरहे हैं कि निर्दिष्ट एकल समूह का उपयोग करना ओवरराइड करना।

लिनक्स में अनुमतियों का विस्तृत प्रलेखन credentials(7)मैनपेज में उपलब्ध है ।


2

जब आप लिनक्स में लॉग इन करते हैं, तो लॉग-इन की प्रक्रिया को सत्यापित करने के बाद, आप फिल के रूप में लॉग इन कर सकते हैं - इसे यूआईडी की सहायता प्राप्त होती है और जिन समूहों से संबंधित है, उन्हें एक प्रक्रिया के रूप में सेट किया जाता है, जिसे तब आपके शेल के रूप में शुरू किया जाता है। यूआईडी, जीआईडी ​​और पूरक समूह प्रक्रिया की एक संपत्ति हैं।

उसके बाद शुरू हुआ कोई भी बाद का कार्यक्रम, उस शेल का एक वंशज है, और बस उन क्रेडेंशियल्स की एक प्रति प्राप्त करता है। * यह बताता है कि उपयोगकर्ता के अधिकारों को बदलने से रनिंग प्रक्रियाओं पर कोई असर नहीं पड़ता है। परिवर्तनों को अगले लॉगिन पर उठाया जाएगा, हालाँकि।

* अपवाद ऐसे प्रोग्राम हैं जिनके सेटुइड या सेटगिड बिट सेट होते हैं, जिनमें एक अलग प्रभावी उपयोगकर्ता आईडी होगी । यह su (1) में उदाहरण के लिए उपयोग किया जाता है, इसलिए यह rootनिष्पादित होने पर भी विशेषाधिकारों के साथ चल सकता है phil

आपके द्वारा समूह में जोड़े philजाने के बाद adm, वह चला सकता है su phil, और suइच्छाशक्ति को जड़ के रूप में सत्यापित कर सकता है कि वह वास्तव में फिल के पासवर्ड प्रदान करता है और फिर उसे यूआईडी, जीआईडी ​​और पूरक समूहों के साथ एक शेल में भूमि करता है। और जैसा कि उपयोगकर्ता को समूह में जोड़ने के बाद किया जाता है, वह शेल पहले से ही admसमूह में होगा।

मैं चेरोट (1) को एक अलग उपयोगकर्ता के रूप में चलाने के लिए सबसे अनुकूल कार्यक्रम नहीं मानता , लेकिन यह निश्चित रूप से काम पूरा करता है। पैरामीटर --userspec phil:philइसे यूआईडी philऔर जीआईडी ​​के साथ चलाता है phil। कोई अतिरिक्त समूह सेट नहीं है (इसके लिए आप प्रदान करेंगे --groups)। इस प्रकार, बच्चों की प्रक्रिया admसमूह में नहीं है ।

आपकी प्रक्रिया को फिल के रूप में चलाने का एक और सामान्य तरीका होगा su phil -c "process"। जैसा suकि उपयोगकर्ता डेटाबेस जानकारी से यूआईडी, जीआईडी ​​और पूरक समूहों को लोड करता है, उपयोगकर्ता के processपास वर्तमान में वही क्रेडेंशियल्स होंगे।

¹ यह लॉगिन (1) , sshd, su, gdb या अन्य प्रोग्राम हो सकता है। इसके अलावा, यह संभवतया pam मॉड्यूल के माध्यम से प्रबंधित किया जा रहा है।

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