1024 से नीचे के पोर्ट को सुनने के लिए उपयोगकर्ता को अनुमति देना


63

मुझे पोर्ट 80 पर सुनने वाले सर्वर को चलाने के लिए एक उपयोगकर्ता (रूट से अलग) को अनुमति देने की आवश्यकता है।

क्या इसे करने का कोई तरीका है?


1
यह प्रश्न व्याख्या के लिए खुला है। मैं उम्मीद कर रहा हूं कि आपका मतलब है "आपने एक नई प्रणाली सेवा बनाई है जिसे आप (रूट के रूप में) सुरक्षा कारणों से अप्रकाशित खाते में चलाना चाहेंगे" (अच्छा अभ्यास माना जाता है) और न ही "मेरे पास एक उपयोगकर्ता है जिसे पूछा जाता है कि क्या वे कर सकते हैं मेरे सिस्टम पर अपना स्वयं का वेब सर्वर चलाएं, मैं उन्हें कैसे अनुमति दूं? " (खराब प्रैक्टिस माना जाता है)
माइकल शॉ

3
@Ptolemy, वास्तविक कारण यह है: मेरी मशीन एक फ़ायरवॉल के पीछे है जो किसी भी पोर्ट को ब्लॉक करती है, लेकिन 80। मैं एक सर्वर होस्ट करना चाहता हूं (जो विशेषाधिकार नहीं छोड़ता है!), इस प्रकार इसे पोर्ट 80 पर सुनने की आवश्यकता है, लेकिन डॉन 'इसे विश्वास के रूप में जड़ के रूप में चलाने के लिए (स्पष्ट सुरक्षा कारणों के लिए)। अगर आपको परवाह है तो मुझे यह करने की अनुमति है।
peoro

जवाबों:


50

setcap 'cap_net_bind_service=+ep' /path/to/program

यह विशिष्ट प्रक्रियाओं के लिए काम करेगा। लेकिन किसी विशेष उपयोगकर्ता को 1024 से नीचे के बंदरगाहों के लिए बाध्य करने की अनुमति देने के लिए आपको उसे sudoers में जोड़ना होगा।

अधिक के लिए इस चर्चा को देखें।


31

(इनमें से कुछ तरीकों का उल्लेख अन्य उत्तरों में किया गया है; मैं वरीयता क्रम में कई संभावित विकल्प दे रहा हूं।)

आप निम्न पोर्ट को उच्च पोर्ट पर पुनर्निर्देशित कर सकते हैं और उच्च पोर्ट पर सुन सकते हैं।

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 1080

विशेषाधिकार प्राप्त पोर्ट पर सुनने के बाद आप अपने सर्वर को रूट और ड्रॉप विशेषाधिकार के रूप में शुरू कर सकते हैं। अधिमानतः, अपने आप को कोड करने के बजाय, अपने सर्वर को एक आवरण से शुरू करें जो आपके लिए काम करता है। यदि आपका सर्वर प्रति कनेक्शन एक उदाहरण शुरू करता है, तो इसे inetd(या इसी तरह के प्रोग्राम जैसे xinetd) से शुरू करें। इसके लिए inetd, इस तरह से एक लाइन का उपयोग करें /etc/inetd.conf:

http  stream  tcp  nowait  username:groupname  /path/to/server/executable  argv[0] argv[1]…

यदि आपका सर्वर एकल उदाहरण में सुनता है, तो इसे प्रोग्राम से शुरू करें जैसे कि authbind। या तो एक खाली फ़ाइल बनाएं /etc/authbind/byport/80और सर्वर चलाने वाले उपयोगकर्ता के लिए इसे निष्पादन योग्य बनाएं ; या बनाएँ /etc/authbind/byuid/1234, जहाँ 1234 UID सर्वर है, जिसमें लाइन है 0.0.0.0/0:80,80

यदि आपका सर्वर निष्पादन योग्य एक फाइल सिस्टम पर संग्रहीत है जो क्षमताओं का समर्थन करता है, तो आप इसे क्षमता दे सकते हैं । सावधान रहें कि क्षमताएं अभी भी अपेक्षाकृत नई हैं और अभी भी कुछ किंक हैंcap_net_bind_service

setcap cap_net_bind_service=ep /path/to/server/executable

4
प्रत्येक मामले में मुझे निपटना पड़ा, निष्पादन योग्य एक स्क्रिप्ट थी जो जावा या अजगर लॉन्च की गई थी। ठीक अंक पर खर्च करने के लिए 10 घंटे के बिना एक आदमी के रूप में, आपके iptables समाधान इसे दर्द रहित रूप से कवर करता है।
srking

Iptables समाधान के लिए, मुझे एक फ़िल्टर नियम भी जोड़ना था, जैसे -A INPUT -p tcp --dport 1080 -j ACCEPTकि यह काम नहीं करेगा (मेरे पास एक -j DROPकैच-ऑल भी है।) इसलिए मैं दो सुनने वाले सॉकेट के साथ बचा हुआ हूं।
thom_nic

4

संक्षिप्त उत्तर यह है कि यह डिजाइन द्वारा संभव नहीं है।

लंबा जवाब यह है कि खुले स्रोत की दुनिया में बहुत सारे लोग डिजाइन के साथ खेल रहे हैं और वैकल्पिक तरीकों के साथ आ रहे हैं। सामान्य तौर पर यह व्यापक रूप से स्वीकृत अभ्यास है कि यह संभव नहीं होना चाहिए। यह तथ्य कि आप कोशिश कर रहे हैं, इसका मतलब है कि आपके सिस्टम में एक और डिज़ाइन दोष है और आपको अपने पूरे सिस्टम आर्किटेक्चर को * nix सर्वोत्तम प्रथाओं और सुरक्षा निहितार्थों के प्रकाश में फिर से समझना चाहिए।

जिसके अनुसार, एक कम बंदरगाहों के लिए गैर-रूट एक्सेस को प्राधिकृत करने के लिए कार्यक्रम है authbind । दोनों SELinux और grsecurity भी इस तरह के ठीक देखते प्रमाणीकरणों के लिए चौखटे प्रदान करते हैं।

अंत में, यदि आप विशिष्ट उपयोगकर्ताओं को विशिष्ट कार्यक्रमों को रूट के रूप में चलाना चाहते हैं और आपको वास्तव में ज़रूरत है तो बस एक उपयोगकर्ता को अपाचे या ऐसा कुछ फिर से शुरू करने की अनुमति देने के लिए, sudoआपका मित्र है!


8
पोर्ट "सुरक्षा" वास्तव में आपको आधुनिक दुनिया में बहुत ज्यादा नहीं देता है।
pjc50

3
@ pjc50: हाँ यह करता है। यह निहित विश्वास के बारे में है। कम बंदरगाह संख्या उच्च विश्वास को दर्शाती है। एसएसएच, पीओपी, एफ़टीपी और अन्य डेमों से उम्मीद की जाती है कि सिस्टम स्तर के पासवर्ड और अन्य क्रेडेंशियल्स के लिए उनके पोर्ट खोले जाने के लिए कहा जाए। यदि उपयोगकर्ताओं को एक बॉक्स पर कम बंदरगाहों पर सुनने की अनुमति दी जाती है, तो वे अप्रयुक्त उपयोगकर्ताओं (या दुर्घटनाग्रस्त) बंदरगाहों पर फॉसी डेमॉन शुरू कर सकते हैं और असुरक्षित उपयोगकर्ताओं से पासवर्ड काट सकते हैं। उन पासवर्ड को रूट सहित अन्य खातों से समझौता करने के लिए उस बॉक्स पर इस्तेमाल किया जा सकता है।
कालेब

8
यह सुरक्षा का एक बहुत कमजोर रूप है। अगर आप किसी चीज़ से जुड़े हैं और सर्टिफिकेट ट्रांजैक्शन नहीं किया है तो आपको इस बात का अंदाजा नहीं है कि आप किससे बात कर रहे हैं - यानी MITM अटैक।
pjc50

5
मुझे लगता है कि बंदरगाहों के लिए जो ज़रूरी है वह है: फिर आप "मेल पोर्ट 25" को चुन सकते हैं, तब (ए) आपके मेल डेमन को रूट प्राइवेट के साथ शुरू करने की आवश्यकता नहीं है और (बी) कोई भी इसे हाईजैक नहीं कर सकता है।
pjc50

7
हालांकि यह "डिजाइन के अनुसार" सच हो सकता है जब लिनक्स अपनी प्रारंभिक अवस्था में था, यह तब और अब बहुत कम समझ में आता है। सुरक्षा सभी के बारे में है जो एक उपयोगकर्ता कर सकता है और नहीं कर सकता है। उदाहरण के लिए, पोर्ट 80 का उपयोग करने के लिए केवल रूट उपयोगकर्ता को अनुमति देना एक बहुत बड़ा सुरक्षा जोखिम है, क्योंकि इसका मतलब है कि आपको उन लोगों को रूट एक्सेस देना होगा, जिन्हें पोर्ट 80 का उपयोग करने की आवश्यकता है, लेकिन रूट एक्सेस नहीं होना चाहिए । यदि आप पोर्ट 80 का उपयोग करने के लिए गैर-रूट उपयोगकर्ता एक्स पर भरोसा करते हैं, तो आपको अपने ओएस में उस ट्रस्ट को एनकोड करने में सक्षम होना चाहिए। सौभाग्य से, जैसा कि आपने उल्लेख किया है, भद्दे काम-आस-पास हैं जो इसे अनुमति देते हैं, जैसे कि ऑर्किड।
बीटी

3

आप netcat या xinetd या iptables पोर्ट को अग्रेषित कर सकते हैं, या अपाचे का उपयोग फ्रंट एंड प्रॉक्सी के रूप में कर सकते हैं और प्रक्रिया को एक गैर-विशेषाधिकारित पोर्ट पर चला सकते हैं।


3

Authbind , @Gilles ने पहले ही इसका उल्लेख किया था, लेकिन मैं इस पर थोड़ा विस्तार करना चाहूंगा।

इसका सुविधाजनक एक्सेस कंट्रोल (मैन पेज में विवरण) है: आप पोर्ट, इंटरफ़ेस एड्रेस, यूआईडी, एड्रेस ऑफ रेंज या पोर्ट और इन के संयोजन द्वारा एक्सेस को फ़िल्टर कर सकते हैं।

इसका बहुत उपयोगी पैरामीटर है --depth:

- स्तर का स्तर

उन कार्यक्रमों को प्रभावित करने का कारण बनता है जो कॉलिंग ग्राफ में गहरे स्तर के होते हैं। डिफ़ॉल्ट 1 है।

"लेवल्स डीप" का मतलब है जब एक स्क्रिप्ट (या प्रोग्राम), एक और स्क्रिप्ट चलाता है जो इसे एक स्तर तक उतरता है। तो अगर आपके पास --depth 5इसका मतलब है 1 के स्तर पर (या यह 0 है?) 5 के माध्यम से आपको बाँधने की अनुमति है, जबकि स्तर 6 और पर, आप नहीं करते हैं। उपयोगी तब होता है जब आप एक स्क्रिप्ट को एक्सेस करना चाहते हैं, लेकिन ऐसे प्रोग्राम नहीं जो आपके ज्ञान के साथ या उसके बिना चलते हैं।


उदाहरण के लिए, आपके पास कुछ ऐसा हो सकता है: सुरक्षा के लिए, आपके पास एक उपयोगकर्ता है javaजो केवल जावा चलाने के लिए है और आप उसे पोर्ट 80 तक पहुंच देना चाहते हैं:

echo > /etc/authbind/byport/80
chown root:java /etc/authbind/byport/80
chmod 710 /etc/authbind/byport/80

मैंने इसे बनाया है ../byport/80 file, इसे javaउपयोगकर्ताओं के समूह को दिया है (प्रत्येक उपयोगकर्ता का अपना समूह है), और इसे समूह द्वारा निष्पादन योग्य बनाया है, जिसका अर्थ है कि यह javaउपयोगकर्ता के लिए निष्पादन योग्य है । यदि आप पोर्ट द्वारा पहुँच दे रहे हैं, तो फ़ाइल को उस उपयोगकर्ता द्वारा निष्पादित किया जाना चाहिए जिसके पास पहुंच होनी चाहिए, इसलिए हमने ऐसा किया।

यह औसत जो के लिए पर्याप्त हो सकता है, लेकिन क्योंकि आप जानते हैं कैसे उपयोग करने के लिए --depthपैरामीटर, आप (के रूप में चलाने javaउपयोगकर्ता) authbind --depth [depth] my_web_app's_start_scriptसे शुरू --depth 1करने और अपने तरीके से काम कर रहे हैं जब तक आप छोटी से छोटी गहराई है कि काम करता है और उस का उपयोग करें।

विवरण के लिए मैन पेज पढ़ें


1

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

एक संभावना टीसीपी पोर्ट अग्रेषण का उपयोग करने की है। जैसे socat:

socat TCP4-LISTEN:www,reuseaddr,fork TCP4:localhost:8080

हालाँकि उस विधि के साथ एक नुकसान यह है कि, जो अनुप्रयोग 8080 पोर्ट पर सुन रहा है, तो आने वाले कनेक्शनों का स्रोत पता (जैसे लॉगिंग या अन्य पहचान उद्देश्यों के लिए) नहीं जानता है।

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