सूडो के इंटर्न कैसे काम करते हैं?


74

sudoआंतरिक रूप से कैसे काम करता है ? यह कैसे संभव है कि यह रूट पासवर्ड के बिना रूट बन सकता है, इसके विपरीत su? क्या syscalls, आदि प्रक्रिया में शामिल हैं? क्या यह लिनक्स में एक गैपिंग सुरक्षा छेद नहीं है (जैसे कि मैं एक भारी-भरकम पैच को क्यों नहीं संकलित कर सकता था, sudoजो कि नियमित रूप से जो कुछ भी करता sudoथा, लेकिन अनपेक्षित उपयोगकर्ता के पासवर्ड के लिए नहीं पूछा था)?

मैंने लॉगिन और सु इंटर्नल्स को पढ़ा है । मैंने यह भी पढ़ा है कि सूदो का इस्तेमाल कैसे किया जाता है? लेकिन शीर्षक के बावजूद, वे मुख्य रूप से suऔर के बीच के मतभेदों से निपटते हैं sudo

जवाबों:


80

यदि आप निष्पादन योग्य पर एक नज़र डालें sudo:

$ which sudo
/usr/bin/sudo
$ ls -la /usr/bin/sudo
---s--x--x 2 root root 208808 Jun  3  2011 /usr/bin/sudo

आप देखेंगे कि यह अनुमति बिट्स को वहन करता है ---s--x--x। इन्हें निम्न प्रकार से तोड़ा जा सकता है:

-|--s|--x|--x
-      - first dash denotes if a directory or a file ("d" = dir, "-" = file)  
--s    - only the setuid bit is enabled for user who owns file
--x    - only the group execute bit is enabled
--x    - only the other execute bit is enabled

इसलिए जब कोई प्रोग्राम सेट किया गया होता है तो वह बिट सक्षम होता है (जिसे SUID भी कहा जाता है) इसका मतलब है कि जब कोई इस प्रोग्राम को चलाता है तो यह उस उपयोगकर्ता के क्रेडेंशियल के साथ चलेगा जो फ़ाइल का मालिक है, उर्फ। इस मामले में जड़।

उदाहरण

अगर मैं निम्नलिखित कमांड को उपयोगकर्ता के नमूने के रूप में चलाता हूं:

$ whoami
saml

$ sudo su -
[sudo] password for saml: 

आप देखेंगे कि sudoवास्तव में निष्पादन जड़ के रूप में चल रहा है:

$ ps -eaf|grep sudo
root     20399  2353  0 05:07 pts/13   00:00:00 sudo su -

सेतु तंत्र

यदि आप उत्सुक हैं कि SUID कैसे काम करती है तो एक नज़र डालें man setuid। यहां मैन पेज का एक अंश दिया गया है, जो इसे मेरे से बेहतर बताता है:

setuid () कॉलिंग प्रक्रिया की प्रभावी उपयोगकर्ता आईडी सेट करता है। यदि कॉलर का प्रभावी यूआईडी रूट है, तो वास्तविक यूआईडी और सेव्ड सेट-यूजर-आईडी भी सेट हैं। Linux के अंतर्गत, setuid () को POSIX संस्करण की तरह _POSIX_SAVED_IDS सुविधा के साथ लागू किया जाता है। यह एक सेट-यूजर-आईडी (रूट के अलावा) प्रोग्राम को अपने सभी उपयोगकर्ता विशेषाधिकारों को छोड़ने के लिए, कुछ अन-विशेषाधिकारित कार्य करने की अनुमति देता है, और फिर एक प्रभावी तरीके से मूल प्रभावी उपयोगकर्ता आईडी को पुनः प्राप्त करता है।

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

यहां मुख्य अवधारणा यह है कि कार्यक्रमों में एक वास्तविक उपयोगकर्ता (यूआईडी) और एक प्रभावी (ईयूआईडी) है। जब यह बिट सक्षम हो जाता है, तो Setuid प्रभावी उपयोगकर्ता (EUID) सेट कर रहा है।

तो कर्नेल के दृष्टिकोण से यह ज्ञात है कि हमारे उदाहरण में, samlअभी भी मूल मालिक (UID) है, लेकिन EUID को जिस किसी के साथ सेट किया गया है, वह निष्पादन योग्य का स्वामी है।

setgid

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

संदर्भ


4
sudo -sइसके बजाय आपको इसका उपयोग करना चाहिए sudo suक्योंकि यह एक बेकार उपयोग है su। :)
टोटर

4

असली sudoबाइनरी सेटुइड रूट है , और आप बस अस्तित्व में फाइल नहीं कर सकते हैं जो इस तरह से सेट हैं।

सेयुड और सेटगिड ("निष्पादन पर सेट उपयोगकर्ता आईडी के लिए संक्षिप्त" और "निष्पादन पर समूह आईडी सेट करें", क्रमशः) [1] यूनिक्स पहुंच अधिकार झंडे हैं जो उपयोगकर्ताओं को निष्पादन योग्य के मालिक या समूह की अनुमतियों के साथ एक निष्पादन योग्य चलाने की अनुमति देते हैं। निर्देशिका में व्यवहार बदलने के लिए।


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

2

किसी के बारे में किसी को छूने के लिए लगता है कि syscalls के भाग का जवाब देने के लिए, महत्वपूर्ण syscalls में से एक या तो setresuid () या setresgid () है। मुझे यकीन है कि अन्य लोग भी हैं, लेकिन ये 2 सेट्यूड / सूडो के लिए बहुत विशिष्ट प्रतीत होते हैं।

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