2012-05-11 11 views
5

मैंने सी में अपना स्वयं का वेब सर्वर लिखा है। मैं रूट के बिना पोर्ट 80 पर कैसे बांध सकता हूं ताकि सुरक्षा से समझौता नहीं किया जा रहा हो (बफर ओवरफ्लो इत्यादि)?रूट के बिना पोर्ट 80 पर वेब सर्वर को बाध्य करें

क्या मुझे पोर्ट 80 पर चलने वाले किसी अन्य "स्थिर" सर्वर से किसी भी ट्रैफ़िक को आगे बढ़ाना चाहिए?

उत्तर

5

एक आगे प्रॉक्सी का उपयोग करना वास्तव में सबसे आसान और सबसे अनुशंसित समाधान है। इससे पहले कि वे आपके स्वयं के लिखित सर्वर तक पहुंचने से पहले भी अमान्य अनुरोधों को फ़िल्टर करने का लाभ उठाते हैं।
यदि आपका एप्लिकेशन किसी उपयोगकर्ता के आईपी पते का उपयोग करता है तो उसे अपने वेबसर्वर का उपयोग करने वाले किसी भी शीर्षलेख से पुनर्प्राप्त करना याद रखें (X-Client-IP इत्यादि)। हालांकि, केवल उन अनुरोधों के लिए ऐसा करें जो वास्तव में आपके वेबसर्वर से आते हैं, अन्यथा उपयोगकर्ता अपने आईपी को खराब कर सकते हैं। आप यह जांच कर ऐसा कर सकते हैं कि अनुरोध आपके आईपी से आया है या केवल इस मामले में हेडर की जांच करें या बस अपना एप्लिकेशन स्थानीयहोस्ट से बांधें।

एक और समाधान प्रोग्राम को CAP_NET_BIND_SERVICE क्षमता प्रदान करेगा। इसके लिए रूट को setcap cap_net_bind_service=ep /path/to/the/executable का उपयोग करने की आवश्यकता है - चूंकि ध्वज किसी फाइल सिस्टम विशेषता में संग्रहीत होता है, इसलिए फ़ाइल को किसी अन्य सिस्टम में कॉपी करते समय या एप्लिकेशन को पुन: संकलित करते समय खो जाएगा।

बेशक आप अपना प्रोग्राम सेटूइड रूट भी बना सकते हैं और फिर bind() पर कॉल करने के बाद एक अनधिकृत उपयोगकर्ता पर स्विच कर सकते हैं। हालांकि, इस पर निर्भर करता है कि आपका प्रोग्राम कैसे काम करता है और यह क्या करता है यह एक अच्छा विचार नहीं हो सकता है - उदाहरण के लिए, अगर किसी कारण से सुनने के सॉकेट को बंद करना और फिर से खोलना है, तो उसे प्रक्रिया के पूर्ण पुनरारंभ की आवश्यकता होगी।

+0

+1, हालांकि वे किसी भी अन्य यूनिक्स के लिए पोर्टेबल नहीं हैं। – dwalter

+0

अधिकांश लोग वैसे भी लिनक्स का उपयोग करते हैं। और मुझे लगता है * बीएसडी में कुछ समान है। – ThiefMaster

2

यदि आप अपने सर्वर को पोर्ट 80 पर बांधना चाहते हैं तो आपको रूट के रूप में ऐसा करना होगा और बाद में विशेषाधिकारों को छोड़ना होगा।

bind(sockfd, addr, addrlen); 
/* process is running as root, drop privileges after bind*/ 
if (setgid(groupid) != 0) 
    errx(1, "setgid: Unable to drop group privileges: %s", strerror(errno)); 
if (setuid(userid) != 0) 
    errx(1, "setuid: Unable to drop user privileges: %S", strerror(errno)); 

मैं कैसे पोर्ट 80 करने के लिए बाध्य कर सकते हैं यह इतना है कि सुरक्षा के साथ समझौता नहीं किया जा रहा है (बफर अतिप्रवाह आदि)

जड़ करता है नहीं नहीं चल जड़ न रहने पर भी अपने सिस्टम अधिक सुरक्षित है यह सिर्फ एक और परत शोषण के लिए जोड़ता है। कैसे नहीं रूट के रूप में चलाने के लिए के बारे में सोच के बजाय, कृपया सुनिश्चित करें कि आप strcpy(), sprintf(), आदि जैसे किसी भी ज्ञात-असुरक्षित कार्यों का उपयोग नहीं है, लेकिन बजाय bind() बुला लिए strncpy(), snprintf(), आदि

+0

यह उल्लेख किया जाना चाहिए कि 'errx' एक गैर मानक मानक है जो कई बीएसडी-व्युत्पन्न या संगत प्रणालियों पर उपलब्ध है। यदि आपको इसकी कार्यक्षमता की आवश्यकता है (जो एक छोटा 2-3 लाइन फ़ंक्शन है) तो आपको अपना खुद का लिखना चाहिए ताकि आपके प्रोग्राम की पोर्टेबिलिटी को नुकसान न पहुंचाए। –

3

एक वैकल्पिक का उपयोग रूट के रूप में, फिर विशेषाधिकार छोड़ना, एक रूट प्रक्रिया है जो सॉकेट बनाता है और इसे बांधता है, और उसके बाद SCM_RIGHTS संदेश का उपयोग करके यूनिक्स-डोमेन सॉकेट कनेक्शन पर अनजान प्रक्रिया को सुनकर सॉकेट पास करता है।

2

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

पोर्ट 80 ट्रैफ़िक को 8080 जैसे अधिक हानिरहित बंदरगाह पर रीडायरेक्ट करने के लिए iptables का उपयोग करना एक विकल्प है। इसे सेट करने के तरीके पर description है।

Iptables सेटअप करने का सबसे आसान टूल नहीं है, लेकिन एक बार जब आप इसे महारत हासिल कर लेते हैं, तो यह बहुत उपयोगी और शक्तिशाली (और सुरक्षित) होता है।

+0

मेरे लिए यह केवल OUTPUT श्रृंखला में एनएटी तालिका पर काम किया। लेकिन यह सवाल का सबसे सीधा जवाब है। – nus

0

मैं पिछले कुछ समय से इस समस्या पर काम किया और निष्कर्ष है कि systemd + iptables हल है के लिए आया था, और नहीं क्षमताओं, elaborated in great detail here के रूप में। क्षमताओं के लिए

संबंधित मुद्दे