सवाल रूट पहुंच के बिना 1024 से कम बंदरगाहों से बांधें [डुप्लिकेट]


इस प्रश्न का उत्तर यहां दिया गया है:

मैं उन अनुप्रयोगों को चलाने के लिए चाहता हूं जो मैं उस बैंड पर रूट नंबर की आवश्यकता के बिना 1000 से कम पोर्ट नंबर पर काम कर रहा हूं।

मैं लिनक्स मिंट का उपयोग कर रहा हूं और इसे सेट अप करने के लिए रूट पहुंच है। मैं आदर्श रूप से एसएसएच पर ऐसा करने में सक्षम होना पसंद करूंगा।

यह भी सुनकर खुश है कि यह संभव नहीं है या मुझे ऐसा नहीं करना चाहिए, अगर ऐसा है।

संपादित करें: अधिकतर मुझे विकास के लिए उच्च पोर्ट नंबरों का उपयोग करने में प्रसन्नता हो रही है, लेकिन फ्लैश पोर्ट 843 पर सॉकेट नीति की अपेक्षा कर रहा है। वर्तमान में मुझे ऐप को रूट के रूप में चलाने की ज़रूरत है और इसलिए मैं इसे अपने मेकफ़ाइल से नहीं चला सकता जो कि एक पिटा है ।


42
2018-05-10 10:41


मूल


यह संभव नहीं है और आपको यह नहीं करना चाहिए :) (और यदि आपको इसे करना है, तो बाईंडिंग के बाद suexec और ड्रॉप विशेषाधिकार) - Tzarium
@Tzarium - उस सीधे जवाब की सराहना करते हैं, हालांकि मैं जो सुनना चाहता था :) :) दुख की बात जल्द ही स्वीकार्य रूप से स्वीकार की जाएगी। - tarn
@Tzarium यह न केवल संभव है लेकिन आसान है यदि आपका सिस्टम फाइल सिस्टम क्षमताओं का समर्थन करता है। @ जोफॉर्कर देखें setcapनीचे जवाब दें। - Gerald Combs
औथबिंद भी एक अच्छा जवाब है (नीचे साइमन से)। यह कई अलग-अलग तरीकों से बहुत संभव है ... - Shane Madden♦
डुप्लिकेट: serverfault.com/questions/84360/...  serverfault.com/questions/182413/...  serverfault.com/questions/133415/...  serverfault.com/questions/245374/...  stackoverflow.com/questions/413807/...  stackoverflow.com/questions/2444591 - joeforker


जवाब:


निचले बंदरगाह संख्या से अनुरोधों का जवाब देने के लिए अपने डिमन को प्राप्त करने का एक अन्य तरीका iptables का उपयोग करना है या निचले क्रमांकित बंदरगाह को उच्च संख्या वाले बंदरगाह पर रीडायरेक्ट करने के समान है जो आपका डेमन सुन रहा है:

sudo iptables -A PREROUTING -t nat -p tcp --dport 80 -j REDIRECT --to-port 8080

पोर्ट को बेनकाब करने के साथ 80 और 8080 को अपने एप्लिकेशन श्रोता बंदरगाह के साथ बदलें।


36
2018-05-10 11:15



ठीक है, यह एक व्यावहारिक कामकाज की तरह लगता है। मैं उसमें देख लूंगा, धन्यवाद। - tarn
मैंने पहले किया है और यह ठीक काम करता है: iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 843 -j REDIRECT --to-port 8430 (यह पोर्ट 843 पर बंदरगाह 8430 पर आने वाले कनेक्शन को रीडायरेक्ट करता है) - Andrew Lambert
सेटकैप के विपरीत, कोई भी कार्यक्रम न केवल आपके द्वारा निर्दिष्ट कार्यक्रम, अप्रतिबंधित बंदरगाह पर सुन पाएगा। - joeforker


बेशक यह संभव है। आपको केवल बाइनरी CAP_NET_BIND_SERVICE देना होगा।

sudo setcap cap_net_bind_service=ep some-binary

लिनक्स में, चीजों को रूट कर सकते हैं क्षमताओं के एक सेट में तोड़ दिया गया है। CAP_NET_BIND_SERVICE बंदरगाहों से बांधने की क्षमता <= 1024 है।

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

अनचाहे बंदरगाहों के लिए पोर्ट 80 और 443 को अग्रेषित करने के लिए ओएसएक्स के लिए एक स्क्रिप्ट यहां दी गई है:

echo " 
rdr pass inet proto tcp from any to any port 80 -> 127.0.0.1 port 8080
rdr pass inet proto tcp from any to any port 443 -> 127.0.0.1 port 8443
" | sudo pfctl -ef -

35
2018-05-10 15:37



बहुत बढ़िया, यह वह जवाब है जो मैं चाहता था। आज रात कोशिश करेंगे। धन्यवाद। - tarn
थोड़ी सी अतिरिक्त जानकारी क्यूं कर यह एकमात्र दृष्टिकोण है जो काम करता है: kneuro.net/cgi-bin/lxr/http/source/net/ipv4/... । PROT_SOCK= 1024, और snum लक्षित बंदरगाह है। - BMDan
बोनस प्वाइंट्स के लिए: वास्तविक मस्तिष्क-मोड़ के लिए एक्सेसएफएस देखें। - BMDan
authbind साथ ही काम करता है और प्रति-पोर्ट और उपयोगकर्ता / समूह आधारित नियंत्रण की अनुमति देता है, बस सेट अप करना याद रखें /etc/authbind/byports तदनुसार (बहुत से लोग स्थापित करने लगते हैं authbind तो बस इसे आउट ऑफ़ द बॉक्स के लिए काम करने की उम्मीद है)। - Jason C
क्या ओएसएक्स पर एक समान दृष्टिकोण है? - svassr


मुझे लगता है कि ऐसा करने का एक तरीका है लेकिन यह 100% सुनिश्चित नहीं है कि यह काम करेगा।

यह बंदरगाह की बाध्यकारी है जिसके लिए जड़ की आवश्यकता होती है, न कि एप्लिकेशन इसका उपयोग कर रहा है, इसलिए नीचे दी गई विधि काम कर सकती है लेकिन आपको पहले स्थान पर सुडो पहुंच की आवश्यकता है।

सबसे पहले आप रूट प्रक्रिया के रूप में अपनी प्रक्रिया शुरू करते हैं sudo myApp, एक बार बंदरगाह बांधने के बाद आप प्रक्रिया के मालिक को एक गैर-विशेषाधिकार प्राप्त उपयोगकर्ता को बदल सकते हैं।


8
2018-05-10 10:47



यह एप्लिकेशन को रूट के रूप में चलाएगा और संभावित रूप से सिस्टम को सुरक्षा जोखिमों के सामने उजागर करेगा। काम करता है लेकिन iptables रीडायरेक्ट अधिक सुरक्षित है। - HampusLi
इस तरह लगभग सभी डेमोन काम करते हैं; रूट उन्हें शुरू करता है (init), वे आवश्यक बंदरगाहों को खोलते हैं, फिर उनके यूआईडी / जीआईडी ​​को एक अप्रतिबंधित उपयोगकर्ता को मौका देते हैं। - Chris S


मुझे बाइंड () सिस्टम कॉल (एलडी_PRELOAD लाइब्रेरी के माध्यम से) को लपेटकर, "एथबिंड" नामक एक लाइब्रेरी को याद किया जाता है, और यदि एक विशेषाधिकार प्राप्त बंदरगाह का अनुरोध किया जाता है, तो एक विशेषाधिकृत बंदरगाह प्रोग्राम को उत्पन्न करने के लिए, जो एक प्रति प्राप्त करता है फ़ाइल डिस्क्रिप्टर, फिर सत्यापित करता है कि एप्लिकेशन को वास्तव में बंदरगाह से बांधने की अनुमति है, बाध्य () और निकास करता है।

परियोजना की स्थिति के बारे में निश्चित नहीं है, लेकिन यदि आवश्यक हो तो विधि को लागू करने के लिए काफी सरल होना चाहिए।


6
2018-05-10 12:24



मैं कहूंगा कि लाइब्रेरी पर ऐपबिर्म / ऐपअर्मोर / सेलिनक्स / अन्य लिनक्स सुरक्षा मॉड्यूल की तुलना में ऑथबिंड अप्रचलित है। - joeforker