मुझे पोर्ट 80 पर सुनने वाले सर्वर को चलाने के लिए एक उपयोगकर्ता (रूट से अलग) को अनुमति देने की आवश्यकता है।
क्या इसे करने का कोई तरीका है?
मुझे पोर्ट 80 पर सुनने वाले सर्वर को चलाने के लिए एक उपयोगकर्ता (रूट से अलग) को अनुमति देने की आवश्यकता है।
क्या इसे करने का कोई तरीका है?
जवाबों:
setcap 'cap_net_bind_service=+ep' /path/to/program
यह विशिष्ट प्रक्रियाओं के लिए काम करेगा। लेकिन किसी विशेष उपयोगकर्ता को 1024 से नीचे के बंदरगाहों के लिए बाध्य करने की अनुमति देने के लिए आपको उसे sudoers में जोड़ना होगा।
अधिक के लिए इस चर्चा को देखें।
(इनमें से कुछ तरीकों का उल्लेख अन्य उत्तरों में किया गया है; मैं वरीयता क्रम में कई संभावित विकल्प दे रहा हूं।)
आप निम्न पोर्ट को उच्च पोर्ट पर पुनर्निर्देशित कर सकते हैं और उच्च पोर्ट पर सुन सकते हैं।
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
-A INPUT -p tcp --dport 1080 -j ACCEPT
कि यह काम नहीं करेगा (मेरे पास एक -j DROP
कैच-ऑल भी है।) इसलिए मैं दो सुनने वाले सॉकेट के साथ बचा हुआ हूं।
संक्षिप्त उत्तर यह है कि यह डिजाइन द्वारा संभव नहीं है।
लंबा जवाब यह है कि खुले स्रोत की दुनिया में बहुत सारे लोग डिजाइन के साथ खेल रहे हैं और वैकल्पिक तरीकों के साथ आ रहे हैं। सामान्य तौर पर यह व्यापक रूप से स्वीकृत अभ्यास है कि यह संभव नहीं होना चाहिए। यह तथ्य कि आप कोशिश कर रहे हैं, इसका मतलब है कि आपके सिस्टम में एक और डिज़ाइन दोष है और आपको अपने पूरे सिस्टम आर्किटेक्चर को * nix सर्वोत्तम प्रथाओं और सुरक्षा निहितार्थों के प्रकाश में फिर से समझना चाहिए।
जिसके अनुसार, एक कम बंदरगाहों के लिए गैर-रूट एक्सेस को प्राधिकृत करने के लिए कार्यक्रम है authbind । दोनों SELinux और grsecurity भी इस तरह के ठीक देखते प्रमाणीकरणों के लिए चौखटे प्रदान करते हैं।
अंत में, यदि आप विशिष्ट उपयोगकर्ताओं को विशिष्ट कार्यक्रमों को रूट के रूप में चलाना चाहते हैं और आपको वास्तव में ज़रूरत है तो बस एक उपयोगकर्ता को अपाचे या ऐसा कुछ फिर से शुरू करने की अनुमति देने के लिए, sudo
आपका मित्र है!
आप netcat या xinetd या iptables पोर्ट को अग्रेषित कर सकते हैं, या अपाचे का उपयोग फ्रंट एंड प्रॉक्सी के रूप में कर सकते हैं और प्रक्रिया को एक गैर-विशेषाधिकारित पोर्ट पर चला सकते हैं।
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
करने और अपने तरीके से काम कर रहे हैं जब तक आप छोटी से छोटी गहराई है कि काम करता है और उस का उपयोग करें।
मैंने ipirables PREROUTING REDIRECT विधि की कोशिश की, लेकिन पाया कि यह अग्रेषित पैकेट को भी प्रभावित करता है। यही है, अगर मशीन इंटरफेस के बीच पैकेट को अग्रेषित कर रही है (जैसे कि अगर यह एक ईथरनेट नेटवर्क से जुड़े वाई-फाई एक्सेस प्वाइंट के रूप में काम कर रहा है), तो iptables नियम इंटरनेट से जुड़े गंतव्यों से जुड़े क्लाइंट के कनेक्शन को भी पकड़ लेगा, और उन्हें रीडायरेक्ट कर देगा। यंत्र। ऐसा नहीं है कि मैं क्या चाहता था - मैं केवल उन कनेक्शनों को पुनर्निर्देशित करना चाहता था जो मशीन को निर्देशित किए गए थे।
एक संभावना टीसीपी पोर्ट अग्रेषण का उपयोग करने की है। जैसे socat
:
socat TCP4-LISTEN:www,reuseaddr,fork TCP4:localhost:8080
हालाँकि उस विधि के साथ एक नुकसान यह है कि, जो अनुप्रयोग 8080 पोर्ट पर सुन रहा है, तो आने वाले कनेक्शनों का स्रोत पता (जैसे लॉगिंग या अन्य पहचान उद्देश्यों के लिए) नहीं जानता है।