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


60

इसके साथ sysvinit, sudoersइस तरह एक प्रविष्टि पर्याप्त होगी:

%webteam cms051=/sbin/service httpd *

यह इस तरह के आदेश के लिए अनुमति देगा:

  • sudo service httpd status
  • sudo service httpd restart

अब, systemdसेवा नाम के साथ अंतिम तर्क है। यानी, सेवा पुनरारंभ के साथ किया जाएगा:

systemctl restart httpd.service

स्वाभाविक रूप से, मैंने सोचा था कि कमांड को परिभाषित systemctl * httpd.serviceकरना काम करेगा लेकिन यह कुछ ऐसा करने की अनुमति देगा systemctl restart puppet.service httpd.serviceजो वांछित प्रभाव नहीं है।

उस पर विचार करने के साथ, गैर-रूट उपयोगकर्ताओं को किसी system.dसेवा को नियंत्रित करने का सबसे अच्छा तरीका क्या होगा ? यह होने की जरूरत नहीं है sudoers; शायद एक फ़ाइल अनुमति परिवर्तन पर्याप्त हो सकता है?


मैंने sudoथोड़ी देर में एक कॉन्फ़िगरेशन को नहीं छुआ है , लेकिन क्या आप ऐसा कुछ नहीं कर सकते cms051=systemctl * httpd.service?
जॉन डब्ल्यूएच स्मिथ

1
यह आपको किसी भी सेवा को फिर से शुरू करने की अनुमति देगा। मुझे उस tidbit को प्रश्न में शामिल करना चाहिए था। माफ़ करना।
बेलमिन फर्नांडीज

जवाबों:


43

बस सभी आवश्यक आदेशों को sudoersअलग से जोड़ें :

%webteam cms051=/usr/bin/systemctl restart httpd.service
%webteam cms051=/usr/bin/systemctl stop httpd.service
%webteam cms051=/usr/bin/systemctl start httpd.service 
%webteam cms051=/usr/bin/systemctl status httpd.service

मैं सभी यूनिट कमांड को पकड़ने की उम्मीद कर रहा था, लेकिन अगर मुझे उन्हें आइटम करना है, तो मुझे लगता है कि मुझे क्या करना होगा।
बेलमिन फर्नांडीज

9
स्थिति उपयोगी नहीं है, क्योंकि कोई भी उपयोगकर्ता ऐसा कर सकता है
डेरेकसन

5
क्या है cms051?
केविन

1
तो क्या होगा अगर मैं systemctl को पुनः आरंभ करता हूं http.service mariadb.service ;-)? संभवतः मारीदब को भी फिर से शुरू किया जाएगा
मारेक वज्जिक

1
@MarekWajdzik sudo अतिरिक्त तर्कों की अनुमति नहीं देता है यदि कोई स्पष्ट रूप से *या इसी तरह के पैटर्न के साथ अनुमति नहीं देता है ।
जोफेल

31

@ जोफेल का उत्तर ठीक वैसा ही था जैसा मुझे एक काम करने के लिए सेटअप की आवश्यकता थी। इस सवाल पर किसी और को ठोकर मारना। मुझे capistranoअपने स्थानीय मशीन से तैनाती के बाद अपने रूबी आवेदन को पुनः आरंभ करने के लिए एक तरीके की आवश्यकता थी । इसका मतलब है कि मुझे systemdसेवाओं को पुनः आरंभ करने के लिए पासवर्ड रहित पहुंच की आवश्यकता है । यह मेरे पास है और यह अद्भुत काम करता है!

नोट : मेरे उपयोगकर्ता और समूह को deployer
यहां कस्टम फ़ाइल में पुट कोड कहा जाता है: /etc/sudoers.d/deployer
कोड:

%deployer ALL= NOPASSWD: /bin/systemctl start my_app
%deployer ALL= NOPASSWD: /bin/systemctl stop my_app
%deployer ALL= NOPASSWD: /bin/systemctl restart my_app

मुझे यह जोड़ना होगा कि deployerमामले में उपयोगकर्ता के रूप में लॉग इन करने के बाद , आपको systemctlsudo के साथ कमांड चलाना चाहिए ।
मुइवा ओलू

8

उन कमांड के साथ एक कमांड उपनाम बनाएं, जिन्हें आप चाहते हैं कि उन तक पहुंच हो। फिर समूह को उस कमांड उपनाम के लिए असाइन करें:

Cmnd_Alias APACHE-SVC = /usr/bin/systemctl stop httpd, /usr/bin/systemctl start httpd, /usr/bin/systemctl restart httpd

%webteam ALL=APACHE-SVC

किसी भी संपादन को अपने /etc/sudoers.d/filename में सीधे करने के बजाय sudoers फ़ाइल को संपादित करना भी अच्छा अभ्यास है। सूडोर्स में अपने .d / फ़ाइलनाम को इंगित करना सुनिश्चित करें, जो कि अधिकांश नए डिस्ट्रॉर्स वैसे भी करते हैं। अपने सूदखोरों में इन 2 पंक्तियों को रखने से चाल चलनी चाहिए:

## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d

नोट: यह # शामिल करने वाले के सामने कोई टिप्पणी नहीं है। यह रहना ही चाहिए।


पासवर्ड दर्ज करने के लिए स्टॉप / स्टार्ट / रीस्टार्ट करने का मौका कैसे जोड़ें?
निकोले बारानेंको

सबसे अच्छा जवाब IMO। सभी को एक कमांड उपनाम जोड़ना चाहिए और इसके साथ काम करना चाहिए।
DASKAjA

6

यह सबसे सुरक्षित है कि उन्हें जोफेल का सुझाव दिया जाए।

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

" service httpd *" लाइन अपेक्षाकृत सुरक्षित है क्योंकि (इसे सत्यापित करें :) में serviceकेवल एक उपयोगी ध्वज है ( --status-all) जो विशेष रूप से संवेदनशील कुछ भी नहीं करता है, और (यह भी सत्यापित करें :) /etc/init.d/httpdकेवल उस कमांड लाइन को स्वीकार करेगा जिसे आप अनुमति देना चाहते हैं।

यदि बहुत सारे संयोजन हैं जो उन्हें सूचीबद्ध करना अजीब हो जाता है, तो आपको शायद सवाल करना चाहिए कि आप क्या कर रहे हैं। लेकिन आप उन्हें एक सावधानीपूर्वक लिखी गई सहायक स्क्रिप्ट तक पहुंच दे सकते हैं जो उनके लिए कमांड चलाती है (बहुत पसंद है /etc/init.d/http)। यहां तक ​​कि इस मामले में आपको सटीक और स्पष्ट होना चाहिए ताकि यह सुनिश्चित किया जा सके कि वास्तव में क्या कमांड और विकल्प की अनुमति है, और किसी भी उपयोगकर्ता इनपुट को सीधे लक्ष्य कमांड पर न भेजें।

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