यूनिक्स / लिनक्स: असली उपयोगकर्ता आईडी, प्रभावी उपयोगकर्ता आईडी और सहेजे गए उपयोगकर्ता आईडी के बीच अंतर


104

मुझे पहले से ही वास्तविक उपयोगकर्ता आईडी के बारे में पता है । यह प्रणाली में एक उपयोगकर्ता के लिए अद्वितीय संख्या है।

मेरी प्रणाली में, मेरा uidहै

$ echo $UID
1014
$                 

अन्य दो आईडी के लिए क्या हैं?
और प्रभावी उपयोगकर्ता आईडी और सहेजे गए उपयोगकर्ता आईडी का उपयोग क्या है और हम इसे सिस्टम में कहां उपयोग करते हैं?


FYI करें - विकिपीडिया पृष्ठ पर उल्लिखित फ़ाइल सिस्टम यूजर आईडी भी है: en.wikipedia.org/wiki/User_identifier
Willem van Ketwich

मुझे लगता है कि उन्होंने इसका उल्लेख नहीं किया क्योंकि (आपके विकि लिंक से): "कर्नेल 2.0 के बाद से, फ़्यूसीड का अस्तित्व आवश्यक नहीं है क्योंकि लिनक्स सिग्नल भेजने के लिए SUSv3 नियमों का पालन करता है, लेकिन अनुकूलता कारणों से फ़्यूसीड बना रहता है।"
RtmY

जवाबों:


148

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

तो, वास्तविक उपयोगकर्ता आईडी वह है जो आप वास्तव में हैं (जो प्रक्रिया का मालिक है), और प्रभावी उपयोगकर्ता आईडी वह है जो ऑपरेटिंग सिस्टम निर्णय लेने के लिए देखता है कि आपको कुछ करने की अनुमति है या नहीं (अधिकांश समय) , कुछ अपवाद हैं)।

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

अब, यह भी होता है कि आप एक setuid प्रोग्राम निष्पादित करते हैं, और एक अन्य उपयोगकर्ता (जैसे root) के रूप में चलने के अलावा , setuid प्रोग्राम भी आपकी ओर से कुछ करने वाला होता है। यह कैसे काम करता है?
सेट्यूड प्रोग्राम को निष्पादित करने के बाद, इसमें आपकी असली आईडी होगी (क्योंकि आप प्रक्रिया के मालिक हैं) और फ़ाइल स्वामी की प्रभावी उपयोगकर्ता आईडी (उदाहरण के लिए root) क्योंकि यह सेट्यूड है।

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

अब उस सेतुड प्रोग्राम में वापस जाने का कोई तरीका नहीं है क्योंकि सभी कर्नेल को पता है कि आपकी आईडी और ... आपकी आईडी है । बैंग, तुम मर चुके हो।

यह सेव्ड सेट-यूजर आईडी है।


6
सहेजी गई उपयोगकर्ता आईडी के बारे में उस अंतिम बिंदु पर अधिक स्पष्टता के लिए, विकिपीडिया
जीडीपी 2

क्या आप मुझे कुछ रीडिंग की ओर इशारा कर सकते हैं, जहाँ मैं पा सकता हूँ कि कौन सी sys कॉल इसके बजाय रियल यूआईडी की जाँच कर सकती है? धन्यवाद
mik1904

1
@ mik1904: सबसे महत्वपूर्ण एक जिसे आप उपयोग करने की संभावना रखते हैं जो वास्तव में वास्तविक यूआईडी की जांच करता है access। वह इसका ९९.९% है। इसके अलावा setfsuid(लेकिन शायद ही कभी की जरूरत है), और कुछ बहुत ही निम्न स्तर के फ़नल, और आपको प्राथमिकताओं या शेड्यूलर को प्राप्त करने / स्थापित करने के लिए वास्तविक उपयोगकर्ता आईडी की आवश्यकता होती है (लेकिन इसकी जांच नहीं की जाती है), और आईडी संचालकों को संकेत देने के लिए या waitएट अल द्वारा लौटाए जाते हैं । कर रहे हैं असली आईडी। यदि आपने वास्तविक उपयोगकर्ता आईडी बदली है, तो execveजांच नहीं करता, लेकिन विफल हो सकता है । यह forkभी चेक नहीं करता है, लेकिन यदि आप वास्तविक यूआईडी पर अधिकतम प्रक्रिया कोटा तक पहुंचते हैं तो विफल हो सकते हैं । Google site:man7.orgयहां आपका मित्र है।
डेमोन

"पिंग कमांड को एक सॉकेट खोलने की आवश्यकता है और लिनक्स कर्नेल इसके लिए रूट विशेषाधिकार की मांग करता है।" यह वास्तव में सही नहीं है। pingएक कच्चे सॉकेट की जरूरत है । कोई भी उपयोगकर्ता (आमतौर पर) सॉकेट खोल सकता है, और सुनने के लिए 1024 से ऊपर।
डैनियल फैरेल

39

मैं कुछ उदाहरणों के साथ कदम से कदम समझाने की कोशिश करूँगा।

लघु पृष्ठभूमि

प्रत्येक प्रक्रिया का अपना 'प्रक्रिया साख' जो जैसी विशेषताओं में शामिल है PID, PPID, PGID, session IDऔर भी वास्तविक और प्रभावी उपयोगकर्ता और समूह के आईडी: RUID, EUID, RGID, EGID

हम उन पर ध्यान केंद्रित करेंगे।


भाग 1: यूआईडी और जीआईडी ​​को समझें

अब मैं अपने क्रेडेंशियल्स और रन के साथ एक शेल में लॉग इन करूँगा:

$ grep $LOGNAME /etc/passwd
rotem:x:1000:1000:rotem,,,:/home/rotem:/bin/bash

आप मेरा लॉग इन (रोटेम), यूआईडी और जीआईडी देख सकते हैं जो दोनों 1000 हैं, और अन्य विवरण जैसे शेल मैं लॉग इन हूं।


भाग 2: RUID और RGID को समझें

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

इसे चेक करने के लिए एक सरल कमांड चलाते हैं:

$ sleep 10 & ps aux | grep 'sleep'

और UID और GID प्रक्रिया की जाँच करें:

$ stat -c "%u %g" /proc/$pid/
1000 1000

उन हैं रियल यूजर आईडी ( RUID) और वास्तविक समूह आईडी ( RGIDकी) प्रक्रिया

(*) यूआईडी और जीआईडी ​​को देखने के लिए अन्य विकल्पों की जाँच करें और इसे एक-लाइनर में प्राप्त करने के तरीके

अभी के लिए, तथ्य यह है कि स्वीकार EUIDऔर EGIDविशेषताओं के निरर्थक 'कर रहे हैं और अभी के बराबर है RUIDऔर RGIDपर्दे के पीछे।

भाग 3: ईयूआईडी और ईजीआईडी ​​को समझें

pingएक उदाहरण के रूप में कमांड लेते हैं ।

whichफिर कमांड के साथ बाइनरी लोकेशन की खोज करें ls -la:

-rwsr-xr-x  1 root root   64424 Mar 10  2017  ping

आप देख सकते हैं कि फ़ाइल का स्वामी और समूह हैं root। ऐसा इसलिए है क्योंकि pingकमांड को एक सॉकेट खोलने की आवश्यकता है और लिनक्स कर्नेल उसके rootलिए विशेषाधिकार की मांग करता है।

लेकिन pingअगर मैं rootविशेषाधिकार नहीं रखता तो मैं कैसे उपयोग कर सकता हूं ?
सूचना 'एस' फ़ाइल अनुमति के मालिक भाग में 'एक्स' के बजाय पत्र।
यह विशिष्ट द्विआधारी निष्पादन योग्य फ़ाइलों (जैसे pingऔर sudo) के लिए एक विशेष अनुमति बिट है जिसे सेट्यूड के रूप में जाना जाता है ।

यह जहां है EUIDऔर EGIDखेलने में आता है।
क्या होगा जब कोई सेट्यूड बाइनरी pingनिष्पादित करता है, तो प्रक्रिया इस प्रभावी बाइनरी निष्पादन योग्य फ़ाइल के मालिक के EUIDलिए डिफ़ॉल्ट से अपनी प्रभावी उपयोगकर्ता आईडी ( ) बदलती है RUIDजो इस मामले में है -root
यह सब साधारण तथ्य से किया जाता है कि इस फ़ाइल में setuidबिट है।

कर्नेल यह निर्णय लेता है कि क्या इस प्रक्रिया को देखने का विशेषाधिकार है EUID। क्योंकि अब EUIDबिंदु root, ऑपरेशन कर्नेल द्वारा अस्वीकार नहीं किया जाएगा।

सूचना : नवीनतम लिनक्स रिलीज पर pingकमांड का आउटपुट इस तथ्य के कारण अलग दिखाई देगा कि उन्होंने इस सेट्यूड दृष्टिकोण के बजाय लिनक्स क्षमताओं को अपनाया है - उन लोगों के लिए जो परिचित नहीं हैं - यहां पढ़ें ।

भाग 4: SUID और SGID के बारे में क्या?

सहेजे गए उपयोगकर्ता आईडी ( SUID) का उपयोग तब किया जा रहा है जब एक विशेषाधिकार प्राप्त प्रक्रिया चल रही है ( rootउदाहरण के लिए) और इसे कुछ अनपेक्षित कार्यों को करने की आवश्यकता है।

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



1
एसयूआईडी पर अंतिम पैरा को छोड़कर स्पष्ट उत्तर। विशेषाधिकार प्राप्त और विशेषाधिकार प्राप्त कार्यों के साथ भ्रमित हो गया। उपयोगी है यदि एक उदाहरण प्रदान किया जाता है। धन्यवाद।
उपेंद्र

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