शेल स्क्रिप्ट में रूट विशेषाधिकार कैसे छोड़ते हैं?


14

OpenVPN में "--up" विकल्प का उपयोग आम तौर पर राउटिंग आदि के लिए किया जाता है और इसलिए OpenVPN को रूट विशेषाधिकार को छोड़ने से पहले इसे संसाधित किया जाता है। हालाँकि, मैं शेल स्क्रिप्ट का आह्वान कर रहा हूँ, जिन्हें एक अनपेक्षित उपयोगकर्ता के रूप में चलाने की आवश्यकता है।

मैं उसको कैसे करू? मैंने ड्रॉप प्रोसेस प्रिविलेज का अध्ययन किया है , विशेष रूप से बहुपद और टायलर के उत्तर, लेकिन मुझे समझ में नहीं आता है कि कैसे लागू किया जाए। मैं Centos 6.5 में काम कर रहा हूं, और suid को अवरुद्ध किया गया है, दोनों "chmod u + s" और "setuid ()" के रूप में।

एक OpenVPN प्लगइन है ("Openvpn-down-root.so") जो रूट के रूप में चलाने के लिए "--down" विकल्प द्वारा लगाई गई स्क्रिप्ट को सक्षम करता है। एक समतुल्य हो सकता है, जैसे कि "ओपनव्प्न-अप-यूसर. एसो", लेकिन मुझे यह नहीं मिला है।

Edit0

निकोला कोटुर के उत्तर के अनुसार, मैंने इयान मेयर की रनर-आरपीएम स्थापित की है । यद्यपि chpst कमांड टर्मिनल में काम करता है, अप स्क्रिप्ट में यह "कमांड नहीं मिला" के साथ विफल हो जाता है। क्या काम करता है "sudo chpst" प्लस उचित प्रदर्शन और भाषा सेट करता है। कृपया देखें कि मेरा टर्मिनल आउटपुट यूनिकोड वर्णों को ठीक से क्यों प्रदर्शित नहीं करता है? यह देखते हुए कि अप स्क्रिप्ट को इन चार लाइनों की आवश्यकता है:

LANG="en_US.UTF-8"; export LANG
GDM_LANG="en_US.UTF-8"; export GDM_LANG
DISPLAY=:0; export DISPLAY
sudo chpst -u user -U user /home/user/unprivileged.sh &

Edit1

प्रति 0xC0000022L की टिप्पणी के अनुसार, मुझे लगता है कि "sudo -u user" काम करता है और साथ ही "sudo chpst -u user -U user":

LANG="en_US.UTF-8"; export LANG
GDM_LANG="en_US.UTF-8"; export GDM_LANG
DISPLAY=:0; export DISPLAY
sudo -u user /home/user/unprivileged.sh &

मैं मैन सूडर्स का अध्ययन करूंगा और अगर मुझे काम करने के लिए अकेले सूडो मिलेगा तो अपडेट करूंगा।


@ user66229 द्वारा छोड़ी गई टिप्पणी: "क्या मेरा सुझाव है कि आप sourceforge.net/p/openvpn/mailman पर सर्फ करें और उन सूचियों की सदस्यता लें जो आपको सबसे उपयुक्त लगती हैं ।"
SLM

@ user66229 धन्यवाद। लेकिन मुझे विश्वास नहीं है कि यह एक OpenVPN- विशिष्ट प्रश्न है। आप ऐसा क्यों मानते हैं?
मिरिमिर

जवाबों:


7

मैं का उपयोग करें RUNIT के chpstइस तरह के कार्यों के लिए उपकरण। उदाहरण के लिए, अप स्क्रिप्ट से आपकी अप्रकाशित स्क्रिप्ट को कॉल करें:

chpst -u nobody /path/to/script

कूल :) धन्यवाद। क्या github.com/imeyer/runit-rpm रनोस को सेंटोस 6.5 में लाने का सबसे अच्छा तरीका है? Red Hat रेपो के साथ भी, मुझे पैकेज नहीं मिल रहा है।
मिरिमिर

@mirimir, हां, मैं उस रेपो का उपयोग करता हूं, जब मुझे CentOS के लिए रनिट पैकेज बनाने की आवश्यकता होती है।
निकोला कोटुर

11

केवल रनिट और सुडो को कवर करने से बहुत याद आती है। वहाँ वास्तव में runit जैसे टूलसेट का एक पूरा परिवार है, और वास्तव में ऐसा करने के लिए उपकरणों की एक विस्तृत पसंद है, बहुत ही काम जो उन्हें डिजाइन किया गया था:

  • डैनियल जे। बर्नस्टीन के डेमोंटोल्स, में है setuidgid:

    setuidgid user /home/user/unprivileged.sh
  • एडम सैम्पसन की स्वतंत्रता setuidgid:

    setuidgid user /home/user/unprivileged.sh
  • ब्रूस Guenter के डेमोंटोल्स-एनकोर में है setuidgid:

    setuidgid user /home/user/unprivileged.sh
  • गेरिट पपी के रनरेट हैं chpst:

    chpst -u user /home/user/unprivileged.sh
  • वेन मार्शल की प्रति है runuid:

    runuid user /home/user/unprivileged.sh
  • लॉरेंट बर्कोट का s6 है s6-setuidgid:

    s6-setuidgid user /home/user/unprivileged.sh
  • मेरी नोश है setuidgid:

    setuidgid user /home/user/unprivileged.sh

वे विशेषाधिकारों को जोड़ने के अलग-अलग कार्य में मिश्रण नहीं करते हैं , और कभी भी एक इंटरैक्टिव मोड में नहीं आते हैं।

आपकी समस्याओं का सामना करने के तरीके आपके sbinसाथ-साथ आपके भूलने की तुलना में बहुत कम हैं ।binPATH

आगे की पढाई


3

स्क्रिप्ट जो विशेषाधिकार को छोड़ देती है और अन्य स्क्रिप्ट को चलाती है (लेकिन यहां मैंने इसे केवल स्वयं चलाने के लिए बनाया है):

#!/bin/sh

id=`id -u`
safeuser="nobody"

if [ $id = "0" ]
then
         # we're root. dangerous!
        sudo -u $safeuser $0
else
    echo "I'm not root"
    id
fi

उदाहरण:

root@n3:/tmp/x# id
uid=0(root) gid=0(root) группы=0(root)
root@n3:/tmp/x# ./drop.sh
I'm not root
uid=65534(nobody) gid=65534(nogroup) группы=65534(nogroup)

कुछ कमांड के लिए "sudo -u उपयोगकर्ता" का उपयोग करते समय, यह मेरे उद्देश्यों के लिए पर्याप्त उपयोगकर्ता वातावरण प्रदान नहीं करता है। और जबकि "सु-उपयोगकर्ता" टर्मिनल में ठीक काम करता है, यह स्क्रिप्ट में कुछ भी नहीं करता है। मुझे लगता है कि यह एक सुरक्षा सुविधा है। तो ऐसा लगता है कि मैं रनिंग स्थापित करने के साथ बचा हुआ हूं।
मिरिमिर

1
@ संस्मरण: क्यों? बहुत विशिष्ट /etc/sudoersहोने की अनुमति देता है जो पर्यावरण चर को कार्यक्रम द्वारा चलाए जा सकते हैं और इसी तरह। । ईमानदारी से, जो भी उपयोग करता है या उपयोगकर्ता के संदर्भ को स्विच करने के लिए इस भयानक कार्यक्रम के पीछे कोई सुराग नहीं है और आप व्यक्तिगत कार्यक्रमों, उपयोगकर्ताओं, मेजबानों आदि के लिए चीजों को कैसे बंद कर सकते हैं ...sudoman sudoerssudosudo su -
0xC0000022L

@ 0xC0000022L धन्यवाद। मैंने सुदो पर एक और नज़र डाली। और हाँ, "sudo -u user" प्लस डिस्प्ले और भाषा भी काम करती है।
मिरिमिर

1
खतरनाक बोलना - आप भरोसा नहीं कर सकते $0; फोन करने वाला एक स्क्रिप्ट $0को शाब्दिक रूप से कुछ भी सेट कर सकता है। और अधिक उद्धरण का उपयोग करें।
चार्ल्स डफी

2
... अपनी स्क्रिप्ट का है, तो $0है /directory/name with spaces/script(और याद है, उन, स्थानों वे खुद में मनमाने ढंग से सिमलिंक बना सकते हैं, भले ही वे नहीं है का उपयोग exec -a somename yourscriptकॉल करने के लिए yourscriptएक साथ $0की somename), तो आप प्राप्त होता sudo -u nobody /directory/name with spacesके साथ, withऔर spacesअपने आदेश के लिए अलग तर्क के रूप में पारित ।
चार्ल्स डफी

1

व्हाट अबाउट:

sudo -Eu <user> <command>

आपने पिछली टिप्पणी में पर्यावरण के बारे में शिकायत की थी, इसलिए आप आउटपुट के बीच अंतर की तुलना भी कर सकते हैं:

sudo -u <user> printenv
sudo -Eu <user> printenv

1

लिनक्स पर आप उपयोग कर सकते हैं runuserया setprivयदि PAM सत्र की आवश्यकता नहीं है (दोनों से util-linux):

runuser -u USER [--] COMMAND [ARGUMENTS...]

setpriv --reuid=1000 --regid=1000 --init-groups COMMAND [ARGUMENTS...]  # Like su/runuser/sudo
setpriv --reuid=1000 --regid=1000 --clear-groups COMMAND [ARGUMENTS...]  # Like daemontools setuid(8)

से suआदमी पेज:

सु को ज्यादातर अप्रकाशित उपयोगकर्ताओं के लिए डिज़ाइन किया गया है, विशेषाधिकार प्राप्त उपयोगकर्ताओं (जैसे रूट द्वारा निष्पादित स्क्रिप्ट) के लिए अनुशंसित समाधान गैर-सेट-उपयोगकर्ता-आईडी कमांड रनर (1) का उपयोग करना है जिसे प्रमाणीकरण की आवश्यकता नहीं है और अलग-अलग पीएएम कॉन्फ़िगरेशन प्रदान करते हैं। यदि PAM सत्र की आवश्यकता नहीं है, तो कमांड सेटप्रीव (1) का उपयोग करने के लिए अनुशंसित समाधान है ।

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