2012-09-05 15 views
13

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

  1. इस एक स्थायी ड्रॉप
  2. दोनों (ई) uid और (ई) gid
  3. केवल गैर-रूट करने के लिए स्विच करना चाहिए लिनक्स समर्थन (कर्नेल> 2.6.32)
  4. पूरक समूहों

सबसे अच्छा तरीका मैंने पाया के लिए कोई जरूरत नहीं है:

uid_t new_uid = ...; 
gid_t new_gid = ...; 

gid_t rgid, egid, sgid; 
if (setresgid(new_gid, new_gid, new_gid) < 0) 
{ 
    perror("setresgid"); 
    exit(EXIT_FAILURE); 
} 
if (getresgid(&rgid, &egid, &sgid) < 0) 
{ 
    perror("getresgid"); 
    exit(EXIT_FAILURE); 
} 
if (rgid != new_gid || egid != new_gid || sgid != new_gid) 
{ 
    printf("unexpected gid"); 
    exit(EXIT_FAILURE); 
} 

if (setgroups(0, 0) != 0) 
{ 
    perror("setgroups"); 
    exit(EXIT_FAILURE); 
} 

uid_t ruid, euid, suid; 
if (setresuid(new_uid, new_uid, new_uid) < 0) 
{ 
    perror("setresuid"); 
    exit(EXIT_FAILURE); 
} 
if (getresuid(&ruid, &euid, &suid) < 0) 
{ 
    perror("getresuid"); 
    exit(EXIT_FAILURE); 
} 
if (ruid != new_uid || euid != new_uid || suid != new_uid) 
{ 
    printf("unexpected uid"); 
    exit(EXIT_FAILURE); 
} 

मैं एक exe में इस लपेट और प्रदर्शित uid है और gid का सही उपयोग करते हुए दिखाई देते हैं कि कर सकते हैं:

ps -eO user,uid,ruid,suid,group,gid,rgid,sgid 

कार्यक्रम एक विशेषाधिकार प्राप्त बंदरगाह के लिए बाध्य नहीं कर सकते हैं या सबसे जड़ के स्वामित्व वाली फ़ाइलों में हेरफेर, तो बस इतना ही है अच्छा।

मुझे captest प्रोग्राम (libcap-ng-utils में शामिल) भी मिला है जो सत्यापित करता है कि प्रक्रिया में कोई अप्रत्याशित capabilities(7) नहीं है।

हालांकि, चूंकि सुरक्षा एक चिंता है, इसलिए मैं अधिक आत्मविश्वास होना चाहता हूं कि मैंने सभी गैर-आवश्यक विशेषाधिकारों को सही तरीके से हटा दिया है। मैं कैसे निश्चित हो सकता हूं?

धन्यवाद।

+0

तुम बाहर [setuidgid] की जाँच की है (http://cr.yp.to/daemontools/setuidgid .html)? यह [डीजे का हिस्सा है। बर्नस्टीन] [http://cr.yp.to/djb.html) [डेमॉन उपकरण पैकेज] (http://cr.yp.to/daemontools.html)। इस कार्यक्रम के स्रोत की समीक्षा करना सहायक हो सकता है। –

+0

यह देखने के लिए कि आप इसे कैसे पूरा किया जा सकता है, आप 'सूडो' या 'सु' स्रोत पर एक नज़र डाल सकते हैं। – Kevin

उत्तर

1

ऐसा करने के लिए "कैननिकल" तरीका डी.जे. बर्नस्टीन द्वारा उनके 'सेटुइडगिड' कोड में लागू किया गया था, जिसका मूल रूप से अपने क्यूमेल कार्यक्रम में उपयोग किया जाता था, आजकल 'डेमोंटोल्स' में शामिल किया गया था।

वास्तविक GNU coreutils में इस्तेमाल किया कोड प्रक्रिया के डीजेबी के विवरण के आधार पर किया जाता है, अपने कोड यहाँ दिख रहा है https://github.com/wertarbyte/coreutils/blob/master/src/setuidgid.c

+0

आह, ठंडा। मैं आगे बढ़ने जा रहा हूं और इस जवाब को स्वीकार कर रहा हूं हालांकि मैं लाइसेंसिंग के कारण सीधे इसका उपयोग नहीं कर सकता। –

+0

लिंक टूटा हुआ है। – alexander255

+0

ध्यान देने के लिए धन्यवाद, अब – Jaromil

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