2012-03-19 10 views
9

एक एम्बेडेड सिस्टम (2.4 कर्नेल) में मुझे रूट के रूप में चलने वाली प्रक्रिया से eth0 इंटरफेस में कच्ची सॉकेट पहुंच की आवश्यकता है।लिनक्स पर सामान्य उपयोगकर्ता के रूप में कच्चे सॉकेट का उपयोग 2.4

मैंने कमांड लाइन से CAP_NET_RAW क्षमता सेट करके और cap_set_proc() का उपयोग करके प्रोग्रामेटिक रूप से किसी भी सफलता के साथ इस समस्या को हल करने का प्रयास किया। ऐसा लगता है कि मैं कमांड लाइन

टोपी प्रक्रिया `1586 पर है 'सेट करने में विफल पर कार्यक्रम मैं एक EPERM त्रुटि मिलती है, ऐसा करने के लिए, की अनुमति नहीं है: (कार्रवाई की अनुमति नहीं)

क्या मैं चाहता हूं कि ऐसा करने का कोई आसान तरीका है? यदि नहीं, तो CAP_NET_RAW क्षमता को सफलतापूर्वक सेट करने के लिए कौन से कदम आवश्यक हैं?

संपादित करें: मेरे पास रूट पहुंच है, लेकिन प्रक्रिया को स्थायी रूप से चलाना क्योंकि रूट कोई विकल्प नहीं है। Libcap का संस्करण 1.10 है, कोई 'setcap' बाइनरी नहीं है, लेकिन 'setpcaps' है।

संपादित करें - जॉर्ज Skoptsov का जवाब दे:

अगर मैं तुम्हें सही, अपने सुझाव setuid के साथ एक प्रक्रिया शुरू है, तो CAP_NET_RAW क्षमता सेट और फिर विशेषाधिकार ड्रॉप करने के लिए है मिलता है। मैंने निम्न कोड के साथ यह कोशिश की, लेकिन ऐसा लगता है कि कैप्स कमांड त्रुटियों को वापस नहीं करता है। seteuid के साथ() बाहर टिप्पणी की, कच्चे पहुँच काम करता है, लेकिन केवल के बाद से प्रक्रिया रूट के रूप में तो चल रहा है:

cap_t caps = cap_get_proc(); 
cap_value_t cap_list[1]; 
cap_list[0] = CAP_NET_RAW; 
if (cap_set_flag(caps, CAP_EFFECTIVE, 1, cap_list, CAP_SET) == -1) 
{ 
    printf("cap_set_flag error"); 
} 
if (cap_set_proc(caps) == -1) 
{ 
    printf("cap_set_proc error"); 
} 

if (seteuid(getuid()) != 0) 
{ 
    printf("seteuid error"); 
} 

function_that_needs_raw_access(); 

आपकी मदद के लिए धन्यवाद। क्रिस

+0

यदि आप नीचे दिए गए मेरे सुझाव का पालन करते हैं, तो आपकी प्रक्रिया एक नहीं चल जाएगी जड़, लेकिन स्टार्ट-अप पर रूट विशेषाधिकार होंगे, जो आपको इच्छित क्षमताओं को सेट करने की अनुमति देगा। –

+0

आपके सुझावों के लिए धन्यवाद जॉर्ज, हालांकि, मुझे कोई सफलता नहीं मिली ... मेरे संपादन देखें। – Chris

+0

क्रिस, शायद आप 'function_that_needs_raw_access()' में स्पष्ट रूप से आवश्यक होने पर विशेषाधिकारों को बढ़ाने के साथ बहुत सावधान रह सकते हैं? –

उत्तर

6

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

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

सबसे पहले, यह सुनिश्चित करें कि प्रक्रिया को रूट के रूप में चलाने पर सफलतापूर्वक सेट किया गया है। तब प्रक्रिया के मालिक के रूप जड़ सेट और setuid ध्वज सेट करने के लिए

sudo chown root process 
sudo chmod ugo+s process 

का उपयोग करें। फिर जांचें कि जब प्रक्रिया अन्य उपयोगकर्ताओं द्वारा चलायी जाती है तो क्षमता सेट की जाती है। चूंकि इस प्रक्रिया में अब सभी सुपरसुर विशेषाधिकार होंगे, आपको सुरक्षा सावधानी बरतनी चाहिए, और जैसे ही आपके कोड को अब इसकी आवश्यकता नहीं है, विशेषाधिकारों को छोड़ दें (CAP_NET_RAW को सक्षम करने के बाद)।

आप this method का पालन कर सकते हैं ताकि आप यह सुनिश्चित कर सकें कि आप उन्हें ठीक से छोड़ रहे हैं।

+0

मुझे नहीं पता कि CAP_NET_RAW को कैसे सक्षम किया जाए। Setcap कमांड नहीं है। सेटुइड ध्वज के साथ प्रक्रिया को चलाने पर सब कुछ काम करता है, लेकिन मैं प्रक्रिया को रूट के रूप में चलाने के लिए नहीं चाहता ... – Chris

+0

आप प्रक्रिया को रूट के रूप में नहीं चला रहे हैं। जैसे ही आप क्षमताओं को सेट करते हैं, आप इन विशेषाधिकारों को जल्द से जल्द छोड़ सकते हैं, जो आपके लिए रूट के तहत काम कर रहा है। –

+0

मेरी मूल समस्या वास्तव में हल नहीं होती है, लेकिन जॉर्ज ने मेरी मदद करने की कोशिश की क्योंकि मैं इस जवाब को स्वीकार करता हूं और यह "निकटतम" समाधान है। – Chris

3

प्रक्रिया रूट के रूप में चलनी चाहिए, या निष्पादन योग्य पर CAP_NET_RAW क्षमताओं को होना चाहिए।

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

यदि आपके पास किसी भी तरह से रूट पहुंच नहीं है, और न ही निष्पादन योग्य पर CAP_NET_RAW या सेटयूड रूट सेट करने के लिए रूट पहुंच वाले किसी को भी मिल सकता है, तो आप पैकेट कैप्चरिंग को गैर-रूट उपयोगकर्ता के रूप में नहीं कर पाएंगे।

+0

कोई सेटकैप कमांड नहीं है, केवल सेटपैप्स है। मैंने चलने की प्रक्रिया के लिए कैप्स सेट करने के लिए रूट के रूप में setpcaps को चलाने की कोशिश की है, लेकिन यह काम नहीं करेगा (मूल पोस्ट में त्रुटि संदेश देखें)। – Chris

1

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

$ setcap cap_net_raw=pe *program* 

आप इस विशेषाधिकार के बिना यह विशेषाधिकार नहीं दे सकते। निश्चित रूप से रूट कार्यक्रमों को यह विशेषाधिकार दे सकता है।

+0

लिनक्स '2.6.24' के तहत कोई फ़ाइल क्षमता नहीं है। सवाल यही है। –

0

टीएल; डीआर IMHO कर्नेल < 3.0 में समर्थित नहीं है।

वहाँ गिरी netdev मेलिंग सूची में इसका समर्थन के बारे में चर्चा नहीं हुई: https://lwn.net/Articles/420800/ और https://lwn.net/Articles/420801/

और शामिल उस में c319b4d76b9e583a5d88d6bf190e079c4e43213d, कर्नेल 3.0 में जारी प्रतिबद्ध:

commit c319b4d76b9e583a5d88d6bf190e079c4e43213d 
Author: Vasiliy Kulikov <[email protected]> 
Date: Fri May 13 10:01:00 2011 +0000 

    net: ipv4: add IPPROTO_ICMP socket kind 

Follows: v2.6.39-rc2 
Precedes: v3.0-rc1 

CAP_NET_RAW बिना रनिंग पिंग (यानी क्षमताओं की स्थापना के बिना या बिना सेट uid) संशोधन में पिंग के लिए लागू किया गया था 87dbb3a5db657d5eae6934707beaf0507980a1c3 , iputils s20150815:

commit 87dbb3a5db657d5eae6934707beaf0507980a1c3 
Author: Nikos Mavrogiannopoulos <[email protected]> 
Date: Fri May 29 11:01:00 2015 +0200 

    This patch allows running ping and ping6 without root privileges on 
    kernels that support it. Almost identical to Lorenzo 
    Colitti's original patch except: 
    ... 

Follows: s20140519 
Precedes: s20150815 
संबंधित मुद्दे