अप्रभावी उपयोगकर्ताओं के रूप में ऊपर की ओर कार्य चलाना


142

अपॉइंटमेंट जॉब करने के लिए कैनोनिकल तरीका क्या है जो उपयोगकर्ता को बदल देता है और स्क्रिप्ट को अनप्रिवेल्ड यूजर के रूप में चलाता है?

जाहिर है कि कोई भी उपयोग कर सकता है suया कर सकता है sudo, लेकिन यह हैक करने योग्य लगता है (और अनावश्यक लॉग लाइनें उत्पन्न कर सकता है)।

जवाबों:


108

नवोदय v1.4 के साथ, setuid और setgid कॉन्फ़िग फ़ाइल में मूल रूप से समर्थित हैं।


7
इस पर बारीकियों के लिए कुकबुक देखें: upstart.ubuntu.com/cookbook/#run-a-job-as-a-different-user
जेसन

10
दूसरे शब्दों में, यह Precise (12.04) और नए में समर्थित है।
एडवर्ड एंडरसन

8
दूसरे शब्दों में, centos में समर्थित नहीं है 6
socketpair

5
रिकॉर्ड के लिए, initctl --versionअपस्टार्ट के अपने वर्तमान संस्करण को खोजने के लिए।
महन

4
आमतौर पर, AWS पर अमेज़ॅन लिनक्स डिस्ट्रो आरएचईएल 6 के अपस्टार्ट संस्करण (0.6.5 !!!!) का उपयोग करता है, इसलिए इसका उपयोग करने वाले किसी व्यक्ति को 'सु' समाधान का उपयोग करना होगा।
असफंद काजी

86

Freenode पर #upstart चैनल पर पूछने पर, आधिकारिक मामला इस प्रकार है:

अपस्टार्ट की भविष्य की रिलीज़ में इसके लिए मूल समर्थन होगा, लेकिन अभी के लिए, आप कुछ का उपयोग कर सकते हैं:

exec su -s /bin/sh -c 'exec "$0" "$@"' username -- /path/to/command [parameters...]

7
यह एकमात्र उत्तर है जिसने अमेज़ॅन लिन्यू EC2 पर काम किया (मैंने sudo और su के सभी रूपांतरों की कोशिश की, जिनमें - session- कमांड, -c, ad nauseum); उनमें से किसी ने भी प्रक्रिया को एक बार शुरू करने से रोकने की अनुमति नहीं दी; इस लिए आपका बहुत - बहुत धन्यवाद।
काटो

यह कुछ फैंसी शेल मैजिक है, +1।
स्टीव केलेट

6
इसने मेरे लिए CentOS 6 (Upstart 0.6.5) पर काम नहीं किया। वहाँ कांटे की एक श्रृंखला है (4 गहरी मुझे लगता है) suकि इस तरह से शुरू किया है expect forkऔर यहां तक कि expect daemonअंतिम PID को पकड़ नहीं है।
मार्क लाकटा

2
मैंने जेनकिन्स प्रक्रिया को बूट करने के लिए अमेज़ॅन लिनक्स (उपस्टार्ट 0.6.5) पर इसका इस्तेमाल किया (जो खुद को धन्यवाद नहीं देता, शुक्र है) और इसने काम किया! मुझे इसे लॉग फाइल में मानक आउटपुट को पुनर्निर्देशित करने के लिए थोड़ा बदलना पड़ा और कुछ पर्यावरण चर सेट करने पड़े, लेकिन यह काम कर गया! मेरा संस्करण ऐसा दिखता है:exec su -s /bin/sh -c 'HOME=/foo/bar exec "$0" "$@" &>/var/log/foobar.log' username -- /path/to/command [parameters...]
Asfand Qazi

17

स्टार्ट-स्टॉप-डेमॉन का उपयोग कैसे करें?

exec start-stop-daemon --start --chuid daemonuser --exec /bin/server_cmd

से कल का नवाब रसोई की किताब :

डेबियन और उबंटू सिस्टम के लिए अनुशंसित विधि सहायक उपयोगिता का उपयोग करने के लिए है start-stop-daemon। [...] start-stop-daemonPAM ("प्लगगेज ऑथेंटिकेशन मॉड्यूल") को उस प्रक्रिया तक सीमित नहीं करता है जो इसे शुरू करती है।

नोट: start-stop-daemonआरएचईएल में समर्थित नहीं है।


2
आप समूह का उपयोग कर सकते हैं, यदि आपको इसकी आवश्यकता है। --चुइद डेमोनूसर के साथ: डेमॉन्ग्रुप
एवगेनी

13

इसे करने के कई तरीके हैं, सभी थोड़े अलग शब्दार्थों के साथ, विशेष रूप से समूह सदस्यता से संबंधित हैं:

  • setuidgid आपके द्वारा निर्दिष्ट समूह में आपको डाल देगा।

    • मूल डेमोनटॉल्स ' setuidgidआपको केवल उस समूह में रखेगा, जिससे आप उन अन्य समूहों से संबंधित फ़ाइलों तक नहीं पहुंच पाएंगे, जिनके आप सदस्य हैं।
    • setuidgidDaemontools-दोहराना से और setuidgidnosh टूलसेट से दोनों एक है -s(उर्फ --supplementary) विकल्प जो सभी में उस समूह में डाल देगा, और भी डाल अनुपूरक समूहों उपयोगकर्ता आपके द्वारा निर्दिष्ट।
  • newgrpएक बार उपयोग करने के बाद आप कम विशेषाधिकार प्राप्त उपयोगकर्ता अपने समूह में एक एकल समूह जोड़ देंगे, लेकिन यह एक नया उप-समूह भी बनाता है, जिससे स्क्रिप्ट के अंदर उपयोग करना मुश्किल हो जाता है।

  • start-stop-daemon आपके समूह की सदस्यता को सुरक्षित रखता है, और केवल सेट / रीड / सेटगिड की तुलना में बहुत अधिक काम करता है।

  • chpst -u username:group1:group2:group3... commandnameआपको यह निर्दिष्ट करने की अनुमति देगा कि समूह के सदस्यों को क्या अपनाना है, लेकिन ( उबंटू में ) यह केवल runitपैकेज के साथ आता है , जो इसका एक विकल्प है upstart

  • su -c commandname usernameउपयोगकर्ता के समूह के सभी सदस्यों को चुनता है, जैसा कि करता है sudo -u username commandname, इसलिए वे शायद कम से कम विस्मय का मार्ग हैं।


8

setuidgidपैकेज से उपयोग करें daemontools

यहाँ दस्तावेज़: http://cr.yp.to/daemontools/setuidgid.html


7
डेमोंटोलस अपस्टार्ट की एक शर्त नहीं है, इसलिए यह 'कैनोनिकल' जवाब की तरह प्रतीत नहीं होता
एडम नेल्सन

2
इसके अलावा, डेमोनटूल ब्रह्माण्ड (ubuntu 10.04) में है, और अपस्टार्ट मुख्य है।
jtimberman

4

अमेज़न ईसी 2 पर एक उबंटू 10.10 उदाहरण पर, मुझे start-stop-daemonकमांड के साथ बेहतर भाग्य मिला था ।

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

निम्नलिखित है जो मेरे लिए काम किया है।

script
  export PYTHONPATH=.:/home/ubuntu/.local/lib/python2.7/site-packages/:/home/ubuntu/python/lib/python2.7/site-packages/
  exec start-stop-daemon --start  --chuid ubuntu --exec /home/ubuntu/python_envs/MyProj/bin/python /home/ubuntu/www/MyProj/MyProj.py -- --config-file-dir=/home/ubuntu/www/MyProj/config/ >> /home/ubuntu/startup.log 2>&1 &
end script

PYTHONPATHमें कुछ संकुल स्रोत से स्थापित पाने के लिए है अजगर जब इस नवोदय काम चलाता मॉड्यूल पथ। मुझे निरपेक्ष रास्तों में सब कुछ करना पड़ा क्योंकि chdirश्लोक काम नहीं करता था।


मुझे एग्जिट स्टार्ट-स्टॉप-डेमॉन के साथ उपयोग किए जाने वाले एनवी चर के साथ भी समस्या थी ।
थॉमस ब्रैट

3

मैं CentOS 6 का उपयोग कर रहा था, और मुझे मेरे लिए काम करने के लिए अनुशंसित हैक (Upstart 0.6.5 के लिए) नहीं मिल सका, और न ही 'su' ट्रिक क्योंकि इसमें शामिल फोर्क की संख्या (4 मुझे लगता है) 'उम्मीद कांटा' द्वारा ट्रैक नहीं की गई थी 'या' उम्मीद डेमॉन '।

मैंने आखिरकार बस किया

chown user:group executable
chmod +s executable

(यानी सेटिउड बिट सेट करें और स्वामित्व बदलें)।

यह सबसे सुरक्षित तरीका नहीं हो सकता है, लेकिन एक आंतरिक अनुसंधान एवं विकास परियोजना के लिए, यह हमारे मामले में कोई फर्क नहीं पड़ा।


यदि आप सिर्फ chmod 1700एक के chmod u+sx,go-xबजाय एक या कम से कम वहाँ थे +s, तो यह "पर्याप्त रूप से सुरक्षित" के रूप में योग्य होगा। :)
dannysauer

0

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

आप sudo पासवर्ड कैश का टाइमआउट भी बदल सकते हैं । जब तक आपकी मशीन शारीरिक रूप से सुरक्षित नहीं हो जाती (लेकिन, आप मानते हैं कि यह संभावना नहीं है कि कोई राहगीर सुडौल पहुंच हासिल करने का प्रयास करेगा), मैं इसकी सिफारिश नहीं करता।

एक अच्छा कारण है कि विशेषाधिकार प्राप्त कार्यों को करने के बहुत कम तरीके हैं और वे अनावश्यक रूप से आवश्यक लॉगिंग करते हैं। ढीले प्रतिबंध आपके सिस्टम के लिए एक सुरक्षा खतरा होगा, और लॉगिंग की कमी का मतलब यह होगा कि यह जानने का कोई तरीका नहीं है कि आपके द्वारा समझौता किए जाने पर क्या हुआ।

यदि आपकी लॉग फ़ाइलों का आकार एक चिंता का विषय है तो कुछ गलत है। सूडो सामान्य परिस्थितियों में केवल एक लाइन प्रति उपयोग उत्पन्न करता है।


0

सेंटोस 6 में, ऊपर की ओर 0.6.5, मेरे लिए क्या काम किया गया है।

script

    exec su user_name << EOF
        exec /path/to/command [parameters...]
EOF

end script

या:

script

    exec su user_name << EOF
       ..... what you want to do ....
EOF

end script

जब उपयोग करें

exec su -s /bin/sh -c 'exec "$0" "$@"' username -- /path/to/command [parameters...]

नौकरी की प्रक्रिया को रोका नहीं जा सकता initclt stop। मुझे लगता है कि इसका कारण है:

1. the job forked and the main process is not tracked.
2. the main process changed its process group,because of `su -c`
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.