हालाँकि 80 और 443 सिस्टम पोर्ट हैं, फिर भी अधिकांश वेब सर्वर उन्हें कैसे बांध सकते हैं?


18

80 को पोर्ट करने के लिए बांधने वाली एक वेब-सेवा चलाने के लिए आमतौर पर विशेषाधिकारों की आवश्यकता नहीं होती है। चूँकि पोर्ट 80/443 सिस्टम पोर्ट होते हैं, इसका अर्थ है कि वे केवल विशेषाधिकार प्राप्त उपयोगकर्ताओं द्वारा उपयोग किए जा सकते हैं, कैसे आती हैं वे सेवाएं अभी भी इन पोर्टों को बांधने में सक्षम हैं?



1
"आमतौर पर sudoer विशेषाधिकारों की आवश्यकता नहीं होती है" गलत है।
tedder42

जवाबों:


29

मूल रूप से दो अलग-अलग दृष्टिकोण हैं:

  1. प्रारंभ में रूट के रूप में चलना शुरू करें, विशेषाधिकार प्राप्त पोर्ट से बांधें, और फिर एक अनपेक्षित उपयोगकर्ता को छोड़ दें।

  2. inetd, या xinetd विशेषाधिकार प्राप्त चलाता है, और आगे चलकर अप्रभावित वेब सर्वर के लिए अनुरोध करता है।


3
लिनक्स पर आप कार्यक्रम के लिए CAP_NET_BIND_SERVICE क्षमता भी लागू कर सकते हैं या आप सिस्टम पोर्ट को नियमित पोर्ट पर पुनर्निर्देशित करने के लिए iptables का उपयोग कर सकते हैं।
ज़ैन लिंक्स

10
और सिर्फ ओपी के लिए स्पष्ट करने के लिए: कारण है कि विकल्प # 1 काम करता है क्योंकि जब प्रक्रियाएं विशेषाधिकार छोड़ती हैं, तो उन्हें खुली फ़ाइल विवरणकों को बनाए रखने की अनुमति दी जाती है - भले ही उन्हें दूसरी बार खोलने की अनुमति न हो।
strugee


5

चूंकि पोर्ट 80/443 सिस्टम पोर्ट हैं, जिसका अर्थ है कि वे केवल विशेषाधिकार प्राप्त उपयोगकर्ताओं द्वारा उपयोग किए जा सकते हैं

मुझे लगता है कि आपके पास यह गलत है। इन बंदरगाहों का उपयोग कोई भी कर सकता है। उन्हें बांधना एक विशेषाधिकार प्राप्त ऑपरेशन है।

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

मैं netcat के साथ एक प्रदर्शन करूँगा।

एक साधारण उपयोगकर्ता के रूप में, मैं 80 पोर्ट नहीं कर सकता:

$ nc -l -p 80
Can't grab 0.0.0.0:80 with bind : Permission denied

मैं 8080 पोर्ट कर सकता हूं:

$ nc -l -p 8080

इस बीच एक अन्य टर्मिनल में, मैं पोर्ट 80 से कनेक्ट कर सकता हूं और कुछ डेटा भेज सकता हूं, और यह देख सकता हूं कि सर्वर अंत में मैं अभी शुरू हुआ हूं:

$ nc 127.0.0.1 8080 <<<"Hello world"

अगर मैं 80 को पोर्ट करना चाहता हूं, तो मुझे रूट होने की जरूरत है:

$ sudo nc -l -p 80

या मैं बाइनरी CAP_NET_BIND_SERVICEको क्षमता प्रदान कर सकता हूं nc:

$ cp `which nc` .
$ sudo setcap 'cap_net_bind_service=+ep' ./nc
$ ./nc -l -p 80

एक अन्य विकल्प सर्वर प्रोग्राम को इस तरह लिखना है कि इसे कहा जाता है के बाद यह listen()रूट विशेषाधिकार छोड़ देता है। यह एक बहुत ही सामान्य समाधान है, और आप इसे अधिकांश डेमॉन के साथ देखेंगे। उदाहरण के लिए, अपाचे जड़ के रूप में init से शुरू हो जाता है, और फिर रूट विशेषाधिकार छोड़ देता है और उपयोगकर्ता www-dataया ऐसा ही कुछ बन जाता है एक बार यह पोर्ट 80 के लिए बाध्य है। /etc/init.d/apache startरूट के रूप में चलाने की कोशिश करें और अपाचे संभवतः शुरू करने में विफल रहेगा।


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