मैं गैर-रूट उपयोगकर्ताओं को इंस्टेंसेस के साथ एक systemd सेवा को नियंत्रित करने की अनुमति कैसे दूं?


12

मुझे dbaसमूह में उपयोगकर्ताओं को database@सेवाओं को नियंत्रित करने की अनुमति देने की आवश्यकता है । इस संबंधित प्रश्न का उत्तर केवल उन सभी systemctl"क्रियाओं" को सूचीबद्ध करना है जिन्हें मैं sudoersफ़ाइल में अनुमति देना चाहता हूं , हालांकि, यह मेरे मामले पर लागू नहीं होता है क्योंकि मुझे पहले से नहीं पता है कि सिस्टम में क्या डेटाबेस मौजूद हो सकता है। उदाहरण के लिए, अगर मैं सूची देता हूं

%dba = /usr/bin/systemctl start database@awsesomeapp
%dba = /usr/bin/systemctl start database@anotherawsesomeapp
%dba = /usr/bin/systemctl start database@yetanotherawsesomeapp
%dba = /usr/bin/systemctl start database@wowyetanotherawsesomeapp
# ... other "verbs" omitted for brevity

भविष्य में मौजूद ऐसे उदाहरणों को शामिल नहीं किया जा सकता है, और एक dba नहीं कर पाएंगे

$ sudo systemctl start database@omgwowyetanotherawsesomeapp

वैसे भी, मैं एक विशिष्ट प्रणाली के साथ की तुलना में पैकेजिंग के मामले में अधिक सोच रहा हूं।

ध्यान दें कि, जैसा कि किसी अन्य संबंधित प्रश्न के लिए इस अद्भुत उत्तर में दिखाया गया है , इसके लिए sudo ग्लब्स का उपयोग करना अंततः असुरक्षित है:

%dba ALL = /usr/bin/systemctl start database@[a-z]* # UNSAFE!

अनुमति देता है

$ sudo systemctl start database@awsesomeapp unrelatedservice

मुझे संदेह sudoहै कि मेरी समस्या का समाधान नहीं हो रहा है (हालांकि मुझे यकीन है कि मुझे उम्मीद है कि मैं गलत हूं)। क्या गैर-रूट उपयोगकर्ताओं को systemdसेवाओं को नियंत्रित करने की अनुमति देने का कोई अन्य तरीका है ?

इसके लायक होने के लिए, मुझे भविष्य में एक CentOS 7 सिस्टम और RHEL7 सिस्टम में यह करने की आवश्यकता है। मुझे आर्क लिनक्स पर काम करने वाले समाधानों में भी दिलचस्पी होगी।

जवाबों:


1

Sudoers फ़ाइल उस तरह काम नहीं करेगी, या इसलिए यह मुझे लगता है। सूडर्स फ़ाइल का उद्देश्य एक विशिष्ट कमांड एक्सेस देना है, न कि उस कमांड के साथ जाने वाले तर्कों को निर्दिष्ट करना।

एक स्क्रिप्ट बनाएं जो रूट के रूप में चलती है और इसे निष्पादित करती है:

/usr/bin/systemctl start database@

स्क्रिप्ट को एक तर्क दें जैसे कि कोई अन्य सम्‍मिलन

स्क्रिप्ट निष्पादित करता है: / usr / bin / systemctl start डेटाबेस @ otherawsesomeapp

अपने यूजर्स को script.sh फाइल को / etc / sudoers के साथ चलाने की अनुमति दें।

scriptuser ALL=(ALL) NOPASSWD: /path/to/script.sh

उपयोगकर्ता इसे इस तरह चला सकते हैं:

sh script.sh anotherawsesomeapp

उदाहरण:

AppName=$1

/usr/bin/systemctl start database@$AppName;
if [ $? != "0" ] 
then; 
    echo "$AppName could not be started. Are you using the right application name?";
fi

1
जैसा कि यह है sudoers एक के रूप में एक ही मुद्दे हैं। आपको चर को उद्धृत करने की आवश्यकता है या इसे रिक्त स्थान पर विभाजित किया जाएगा।
क्षय

यह काम करने वाला नहीं है; सेयुड शेल स्क्रिप्ट (लिनक्स पर) के लिए सम्मानित नहीं किया जाता है।
मार्टि

यह सब एक स्क्रिप्ट को निष्पादित करने के लिए sudo का उपयोग कर रहा है। यह 'हैलो वर्ल्ड' की पटकथा से अलग नहीं है। यदि रूट स्क्रिप्ट चला सकता है, तो यह काम करेगा।
बाजीगर

0

SUID

आप के आधार पर एक प्रस्तावित समाधान उक्त स्क्रिप्ट बना सकता है जो सुडो के साथ सिस्टमक्टेल कहती है। स्क्रिप्ट को रूट के स्वामित्व में बनाएँ। प्रदान करें SUIDजड़ की अनुमति और डेटाबेस प्रशासकों के समूह (DBA) के लिए पढ़ सकते हैं और अनुमतियाँ निष्पादित।
बस सावधान रहें कि समूह को या दूसरों को लिखित अनुमति प्रदान न करें क्योंकि इस तरह से वे स्क्रिप्ट को बदल सकते हैं और इसे सूडो से पहले कुछ भी निष्पादित कर सकते हैं! यह भी सुनिश्चित करें कि स्क्रिप्ट बुलेट-प्रूफ इनपुट-वार है।

$ बिल्ली >> start_database.sh
sudo / usr / bin / systemctl प्रारंभ डेटाबेस @ $ 1
(Ctrl + डी)

इस स्क्रिप्ट को जांच कर बेहतर बनाया जा सकता है कि क्या तर्क की आपूर्ति की जाती है और एक उपयोग प्रिंट करें: संदेश यदि नहीं ..., भी क्योंकि यह एक स्क्रिप्ट है जिसके लिए SUIDयह जांचना उचित होगा; तर्क के बाद अन्य आदेशों के इंजेक्शन से बचने के लिए। या इससे भी बेहतर है कि इनपुट के रूप में अनुमति देने के लिए केवल एक ही ऐप संबंधित स्ट्रिंग का उल्लेख करें!
फिर आपको यह सुनिश्चित करना चाहिए कि स्क्रिप्ट के लिए अनुमतियाँ सख्ती से निम्नलिखित हैं:

$ sudo chown root: dba start_database.sh
$ sudo chmod ux, gw, o-rwx start_database.sh
$ सुडो चामोद u + s, g + rx start_database.sh

फिर सही अनुमतियों को सत्यापित करने के लिए:

$ एलएस -ला
।
।
।
-rwSr-x --- 1 रूट dba 35 अगस्त 2 19:11 start_database.sh
।
।
।

अतः, पुनर्कथन करने के लिए:

1. owner of the script is root
2. फ़ाइल can be read and executed by the dba group members
3. no-one else will be able to even readयह।
4. SUIDस्क्रिप्ट को निष्पादित करने के लिए स्क्रिप्ट को रूट करने के लिए उपयोगकर्ता को सक्षम करेगा ।
5. तो sudo पासवर्ड के लिए बंद नहीं होगा।

किसी भी मामले में, कई उपयोगकर्ताओं के साथ एक प्रणाली में हो बहुत सावधान साथ SUIDहै क्योंकि यह अनुमति दुरुपयोग के लिए कक्ष छोड़ सकते हैं।


आपको अपनी स्क्रिप्ट में एक शेबंग याद आ रही है और तब भी, SUIDडिफ़ॉल्ट रूप से स्क्रिप्ट के लिए काम नहीं करेगा।
जन तोंजर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.