लॉगिन और सु इंटर्नल्स


11

मैं यह समझने की कोशिश कर रहा हूं कि लिनक्स में उपयोगकर्ता की अनुमति कैसे काम करती है। कर्नेल बूट और initरूट के रूप में शुरू होता है, है ना? Init फिर स्टार्टअप स्क्रिप्ट चलाता है और चलाता है getty( agetty), फिर से रूट के रूप में। मैं सिर्फ उपयोगकर्ता नाम और रन को भूल जाता हूं login, फिर भी जड़ के रूप में, मुझे लगता है। अभी तक कुछ भी दिलचस्प नहीं है। लेकिन लॉगिन क्या करता है? मैं "लॉग इन करने का प्रयास करता हूं" से बेहतर कुछ भी नहीं खोज सका। मान लीजिए कि लॉगिन उस पासवर्ड से मेल खाता है (और हम सामान्य उपयोगकर्ता के रूप में लॉग इन करने की कोशिश कर रहे हैं), यह उपयोगकर्ता आईडी कैसे बदलता है? मैंने सोचा था कि उसके लिए सिस्टम कॉल होनी चाहिए लेकिन मैं इसे ढूंढ नहीं पा रहा था (हो सकता है कि मैं सिर्फ अंधा हूं?)


इसके बारे में भी susuजब हम इसे चलाते हैं तो 'setuid' बिट सेट होता है, यह हमेशा रूट के रूप में चलता है। लेकिन जब हम इसे सामान्य उपयोगकर्ता के रूप में लॉग इन करने के लिए कहते हैं, तो इसे फिर से उपयोगकर्ता आईडी बदलने की आवश्यकता होती है। क्या मैं सही ढंग से समझता हूं कि वही "जादू" होता है suऔर loginजब उन्हें उपयोगकर्ता को बदलने की आवश्यकता होती है? यदि हां, तो दो अलग-अलग कार्यक्रम क्यों हैं? लॉगिन चलाते समय क्या कोई अतिरिक्त प्रकार का गंभीर व्यवसाय हो रहा है?

जवाबों:


9

लॉगिन प्रोग्राम क्या करते हैं, इसके कई हिस्से हैं। लॉगिन प्रोग्राम अलग-अलग हैं कि वे उस उपयोगकर्ता के साथ कैसे बातचीत करते हैं जो लॉग इन करने की कोशिश कर रहे हैं। यहां कुछ उदाहरण दिए गए हैं:

  • login: पाठ टर्मिनल पर इनपुट पढ़ता है
  • su: पहले से लॉग-इन किए गए उपयोगकर्ताओं द्वारा आह्वान किए जाने पर, इसके कमांड-लाइन तर्कों से अधिकांश डेटा, एक टर्मिनल से प्रमाणीकरण डेटा (पासवर्ड) प्राप्त होता है।
  • gksu: के समान है su, लेकिन एक्स में प्रमाणीकरण डेटा पढ़ता है
  • rlogind: rlogin प्रोटोकॉल के माध्यम से एक TCP कनेक्शन पर इनपुट प्राप्त करता है
  • sshd: SSH प्रोटोकॉल के माध्यम से एक TCP कनेक्शन पर इनपुट प्राप्त करता है
  • एक्स डिस्प्ले मैनेजर (एक्सडीएम, जीडीएम, केडीएम, ...): loginएक्स डिस्प्ले पर इनपुट के समान , लेकिन इनपुट पढ़ें

ये कार्यक्रम इसी तरह से संचालित होते हैं।

  1. पहला भाग प्रमाणीकरण है : कार्यक्रम उपयोगकर्ता से कुछ इनपुट को पढ़ता है और यह तय करता है कि उपयोगकर्ता लॉग इन करने के लिए अधिकृत है या नहीं। पारंपरिक विधि उपयोगकर्ता नाम और पासवर्ड को पढ़ने के लिए है, और जाँचें कि उपयोगकर्ता सिस्टम के उपयोगकर्ता डेटाबेस में उल्लिखित है और उपयोगकर्ता द्वारा टाइप किया गया पासवर्ड डेटाबेस में एक है। लेकिन कई अन्य संभावनाएं (एकमुश्त पासवर्ड, बायोमेट्रिक प्रमाणीकरण, प्राधिकरण हस्तांतरण,…) हैं।

  2. एक बार यह स्थापित हो जाने के बाद कि उपयोगकर्ता लॉग इन करने के लिए अधिकृत है और किस खाते में, लॉगिन प्रोग्राम उपयोगकर्ता के प्राधिकरण को स्थापित करता है, उदाहरण के लिए इस सत्र में उपयोगकर्ता किन समूहों से संबंधित होगा।

  3. लॉगिन कार्यक्रम खाता प्रतिबंधों की भी जाँच कर सकता है। उदाहरण के लिए, यह एक लॉगिन समय, या अधिकतम संख्या में लॉग-इन उपयोगकर्ताओं को लागू कर सकता है, या कुछ कनेक्शनों पर कुछ उपयोगकर्ताओं को मना कर सकता है।

  4. अंत में लॉगिन प्रोग्राम उपयोगकर्ता के सत्र को सेट करता है। कई विकल्प हैं:

    1. प्रक्रिया अनुमतियों को प्राधिकरण में तय किया गया था निर्धारित करें: उपयोगकर्ता, समूह, सीमाएँ, ... आप यहां इस विकल्प का एक सरल उदाहरण देख सकते हैं (यह केवल उपयोगकर्ता और समूहों को संभालता है)। मूल विचार यह है कि लॉगिन प्रोग्राम अभी भी इस बिंदु पर रूट के रूप में चल रहा है, इसलिए इसमें अधिकतम विशेषाधिकार हैं; यह पहले रूट उपयोगकर्ता होने के अलावा अन्य सभी विशेषाधिकार हटाता है, और अंत में setuidउस अंतिम लेकिन कम से कम विशेषाधिकार को छोड़ने के लिए कहता है।
    2. संभवतः उपयोगकर्ता के होम डायरेक्टरी को माउंट करें, "आपके पास मेल" संदेश आदि प्रदर्शित करें।
    3. कुछ प्रोग्राम को उपयोगकर्ता के रूप में आमंत्रित करें, आमतौर पर उपयोगकर्ता के शेल (के लिए loginऔर su, या sshdयदि कोई आदेश निर्दिष्ट नहीं किया गया था; एक एक्स डिस्प्ले मैनेजर एक एक्स सेशन मैनेजर या विंडो मैनेजर को आमंत्रित करता है)।

आजकल अधिकांश इकाइयाँ लॉगिन सेवाओं के प्रबंधन का एक समान तरीका प्रदान करने के लिए PAM (Pluggable Authentication Modules) का उपयोग करती हैं। PAM अपनी कार्यक्षमता को 4 भागों में बांटता है : "नीतिगत" दोनों प्रमाणीकरण (1 ऊपर) और प्राधिकरण (ऊपर 2) शामिल हैं; "खाता" और "सत्र" उपरोक्त 3 और 4 हैं; और "पासवर्ड" भी है, जिसका उपयोग लॉगिन के लिए नहीं बल्कि प्रमाणीकरण टोकन (जैसे पासवर्ड) को अद्यतन करने के लिए किया जाता है।


4

आपके द्वारा खोजा जा रहा सिस्टम कॉल जैसी चीज़ों को कहा जाता है setuidऔर seteuidयद्यपि वास्तव में हेम का एक पूरा परिवार है जो वास्तव में उपयोगकर्ता पहचान के भिन्न रूपों पर निर्भर करता है जिसे आप बदलने की कोशिश कर रहे हैं।

setgidएक प्रक्रिया के रूप में चलने वाले समूह को बदलने के लिए समानांतर कॉल भी हैं ।


4

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

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

स्वाभाविक रूप से यह कर्नेल है जो वास्तव में 'UID / GID' प्रक्रिया को बदलने का काम करता है। मैं लिनक्स कर्नेल सिस्टम कॉल के कार्यान्वयन को कैसे पा सकता हूं? syscalls के बारे में बहुत कुछ बताता है; मेरे कर्नेल स्रोत में:

#define __NR_setgid 144
__SYSCALL(__NR_setgid, sys_setgid)
#define __NR_setuid 146
__SYSCALL(__NR_setuid, sys_setuid)

इसलिए 144 और 146 मेरी मशीन पर उन कार्यों के लिए सिस्टम कॉल नंबर हैं


मैंने यह देखने के लिए suस्रोत की जांच नहीं की कि यह क्या करता है, लेकिन मुझे संदेह है कि यह exec()एक शेल का उपयोग करने से पहले शेल के ठीक पहले रूट विशेषाधिकार भी छोड़ देता है

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