शेल लिपियों पर यूआईडी सेट नहीं कर सकते


14

क्या कोई मुझे यह पता लगाने में मदद कर सकता है कि यहाँ क्या हो रहा है? मेरे पास ट्रैकिंग पैकेट की गिनती के कुछ नियम हैं। जब मैं निम्नलिखित स्क्रिप्ट को रूट के रूप में चलाता हूं:

#!/bin/bash
iptables -t mangle -xnvL

मुझे वह आउटपुट मिलता है जिसकी मुझे उम्मीद है:

//snip
233203 199929802 MARK  //blah blah blah
//snip

हालांकि, मैं इसे कैक्टि के हिस्से के रूप में चलाना चाहता हूं, जो अपाचे के रूप में चलता है। अब अपाचे iptables नहीं चला सकता है, यही वजह है कि मेरे पास स्क्रिप्ट है। मैंने इसे SUID रूट के रूप में स्थापित किया :

-rwsr-sr-x 1 root root   37 May 14 23:06 iptables_packet_report.sh

लेकिन तब मुझे यह आउटपुट मिलता है:

server # sudo -u apache ./iptables_packet_report.sh
iptables v1.4.2: can't initialize iptables table `mangle': Table does not exist (do you need to insmod?)
Perhaps iptables or your kernel needs to be upgraded.

जाहिर है मेरा कर्नेल ठीक है, और यह तथ्य कि मैं इसे गैर-रूट के रूप में चला रहा हूं, कुछ गड़बड़ कर रहा है, लेकिन मुझे समझ नहीं आता कि क्यों। मैंने [प्रदर्शन] के साथ SUID की दोहरी जाँच की ( http://en.wikipedia.org/wiki/Setuid#Demon निष्पादन और पुष्टि की कि यह काम कर रहा था।

server # sudo -u apache ./printid
Real UID  = 81
Effective UID = 0
Real GID  = 81
Effective GID = 0

मेरा अंतिम लक्ष्य अपाचे के रूप में चलने के दौरान iptables -t mangle -xnvL का आउटपुट प्राप्त करना है, इसलिए मैं कैक्टि का उपयोग इसे पूरी तरह से ग्राफ करने के लिए कर सकता हूं।

जवाबों:


16

आप शेल स्क्रिप्ट के लिए SUID रूट का उपयोग नहीं कर सकते। केवल वास्तविक कार्यक्रम SUID रूट हो सकते हैं, शेल स्क्रिप्ट "#!" से शुरू होती हैं। और दुभाषिया को SUID चलाना होगा और यह किसी कारण से काम नहीं करता है जो मुझे नहीं पता था

सुडो पर एक नज़र डालें और इसे स्थापित करें! संपादित करें / आदि / sudoerrs, इस तरह एक पंक्ति जोड़ें:

www-data        ALL=NOPASSWD: /usr/local/sbin/iptables_packet_report.sh

फिर बस दौड़ो

sudo /usr/local/sbin/iptables_packet_report.sh

आपके कोड से

फिर इसे पासवर्ड के लिए नहीं कहना चाहिए, लेकिन स्वचालित रूप से प्रक्रिया का मूल्यांकन करना चाहिए।

मुझे पूरा यकीन है कि आपके त्रुटि संदेश भी तब होंगे जब आप मैन्युअल रूप से www-data में su करेंगे और इसे मैन्युअल रूप से चलाएंगे


13

जैसा कि ईसाई ने मेरी समस्या का संकेत दिया कि मैं एक शेल स्क्रिप्ट पर SUID करने की कोशिश कर रहा था। जैसा कि यहां बताया गया है कि शेल स्क्रिप्ट पर SUID सेट करना एक बहुत बुरा विचार है:

UNIX के तहत एक शेल स्क्रिप्ट को निष्पादित करना एक दो-चरण प्रक्रिया शामिल है: जब कर्नेल निर्धारित करता है कि एक शेल स्क्रिप्ट चलने वाली है, तो यह पहली बार शेल दुभाषिया की एक SUID प्रतिलिपि शुरू करता है, फिर शेल दुभाषिया खोल स्क्रिप्ट को निष्पादित करना शुरू करता है। क्योंकि ये दो ऑपरेशन दो असतत चरणों में किए जाते हैं, आप पहले चरण के बाद कर्नेल को बाधित कर सकते हैं और फ़ाइल को स्विच कर सकते हैं जो शेल दुभाषिया निष्पादित करने वाला है। इस शैली में, एक हमलावर कंप्यूटर को अपने चयन के किसी भी शेल स्क्रिप्ट को निष्पादित करने के लिए प्राप्त कर सकता है

इस वजह से, कई आधुनिक लिनक्स डिस्ट्रॉक्ट SUID शेल स्क्रिप्ट्स को नजरअंदाज करते हैं, जिसमें gentoo भी शामिल है जिसका मैं उपयोग कर रहा था। मैं sudoers फ़ाइल को संपादित करने में सक्षम था और इसे काम कर रहा था।


शानदार जवाब!
डेव चेनी

किसी को पता है कि क्या यह सोलारिस 10 के लिए सच है?
एरिक जॉनसन

2

मुझे लगता है कि क्रिश्चियन का समाधान सबसे अच्छा है, लेकिन अगर आप वास्तव में चाहते थे, तो आप संकलित प्रोग्राम पर shc और फिर setuid रूट का उपयोग करके स्क्रिप्ट को संकलित कर सकते हैं ।

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