systemd: एक विशिष्ट सेवा को बदलने के लिए एक अप्रभावी उपयोगकर्ता की अनुमति प्रदान करता है


20

मैं एक हेडलेस बॉक्स बॉक्स पर एक निजी गेम सर्वर चला रहा हूं। क्योंकि मैं बेवकूफ नहीं हूं, इसलिए कहा गया है कि सर्वर अपने स्वयं के अनपेक्षित उपयोगकर्ता के रूप में चल रहा है, जिसके पास नंगे न्यूनतम एक्सेस अधिकारों के साथ अपडेट डाउनलोड करने और विश्व डेटाबेस को संशोधित करने की आवश्यकता है।

मैंने जरूरत पड़ने पर सर्वर को ठीक से शुरू करने, रोकने और फिर से चालू करने के लिए एक सिस्टम यूनिट फाइल भी बनाई (उदाहरण के लिए कहा अपडेट के लिए)।

हालांकि, वास्तव में कॉल करने के लिए systemctlया service <game> start/stop/restartमुझे अभी भी रूट या sudoसक्षम उपयोगकर्ता के रूप में लॉग इन करने की आवश्यकता है ।

क्या सिस्टम को यह बताने का कोई तरीका है कि <game>सेवा के लिए, अनप्रोविलेड यूजर gamesrvको स्टार्ट / स्टॉप / रीस्टार्ट कमांड चलाने की अनुमति है?


जवाबों:


37

मैं ऐसा करने के दो तरीके सोच सकता हूं:


एक सिस्टम सेवा के बजाय सेवा को एक उपयोगकर्ता सेवा बनाकर है।

सिस्टम यूनिट बनाने के बजाय, सिस्टमड यूनिट को सर्विस यूजर के होम डायरेक्टरी में रखा जाएगा $HOME/.config/systemd/user/daemon-name.service। उसी उपयोगकर्ता के साथ सेवा का प्रबंधन कर सकते हैं systemctl --user <action> daemon-name.service

उपयोगकर्ता इकाई को बूट पर शुरू करने की अनुमति देने के लिए , रूट को खाते के लिए सक्षम होना चाहिए, अर्थात sudo loginctl enable-linger username। यूनिट भी होना चाहिए WantedBy=default.target


दूसरा तरीका उपयोगकर्ता को पॉलिसीकीट के माध्यम से सिस्टम यूनिट का प्रबंधन करने की अनुमति देता है। इसके लिए JavaScript 22.d या उच्चतर systemd (और PolicyKit> = 0.106 की आवश्यकता है। फाइल की जाँच करें pkaction --version)।

आप एक नई PolicyKit कॉन्फ़िगरेशन फ़ाइल बनाएंगे, उदाहरण के /etc/polkit-1/rules.d/57-manage-daemon-name.rulesलिए , जो उन विशेषताओं की जांच करता है जिन्हें आप अनुमति देना चाहते हैं। उदाहरण के लिए :

// Allow alice to manage example.service;
// fall back to implicit authorization otherwise.
polkit.addRule(function(action, subject) {
    if (action.id == "org.freedesktop.systemd1.manage-units" &&
        action.lookup("unit") == "example.service" &&
        subject.user == "alice") {
        return polkit.Result.YES;
    }
});

नामित उपयोगकर्ता तब systemctlउपयोग किए बिना और उपयोग किए बिना नामित सेवा का प्रबंधन कर सकता है sudo


उपयोगकर्ता मोड और loginctlकाम किया।
Shadur

1
क्या यह Ubuntu 16.04 पर काम करता है? क्या यह सामान्य है कि rules.d निर्देशिका मौजूद नहीं है? मैं इसे काम नहीं कर सकता। मेरे नियमों की अनदेखी की जाती है।
यज्ञ

3
क्या मुझे पालिसी को सक्षम करने के लिए कुछ पुनः आरंभ करना होगा?
जोसिर

@Michael Hampton सिस्टम के साथ-user बूट पर सर्विस स्टार्टअप को छोड़कर मैं जो भी काम करना चाहता हूं, कर सकता हूं। मुझे लगता है कि यह सामान्य है क्योंकि मैंने इसे कई स्थानों पर पढ़ा है (जैसे कि आर्च्लिनक्स विकी), लेकिन आप कहते हैं कि इसे काम करना चाहिए, क्या आप इसके बारे में सुनिश्चित हैं?
DAKS

@daks हां यह काम करता है। यदि आपको अभी भी इससे कोई समस्या है, तो एक नया प्रश्न पूछें।
माइकल हैम्पटन

12

sudoउसी के लिए बना है। अपनी /etc/sudoersफ़ाइल को उन आदेशों के लिए visudoजोड़ने के लिए संपादित करें Cmd_aliasजिन्हें आप अनपेक्षित उपयोगकर्ता को उपयोग करने में सक्षम बनाना चाहते हैं:

# game server commands
Cmnd_Alias GAME_CMDS = /usr/bin/systemctl start <game service>, /usr/bin/systemctl stop <game service>

और इस तरह के उपनाम के साथ परिभाषित आदेशों का उपयोग करने के लिए अनपेक्षित उपयोगकर्ता को अनुमति देने के लिए एक पंक्ति जोड़ें:

unprivileged_user ALL=(ALL) NOPASSWD: GAME_CMDS

Sudo कमांड के विभिन्न मापदंडों के लिए विषय पर कुछ और प्रलेखन पढ़ें ।

आपको अपने सिस्टम पर उपलब्ध होने के sudoलिए पैकेज स्थापित करने की आवश्यकता हो सकती sudoहै।


मुझे पता है कि कैसे सूडो का उपयोग करना है, हाँ। मैं सोच रहा था कि क्या कोई विकल्प है जो मुझे छोड़ सकता है यहां तक ​​कि इस मामले में पहली बात यह है कि systemdयूनिट फ़ाइल निर्दिष्ट करती है कि इसे चलाने की आवश्यकता है gamesrv
शादुर 28:17

1

आप इसके sudoबराबर पहुँच प्रदान करने के साथ संबद्ध हो सकते हैं root, लेकिन इसका उपयोग विशिष्ट, सीमित आदेशों के लिए एक विशिष्ट उपयोगकर्ता रूट एक्सेस की अनुमति देने के लिए भी किया जा सकता है।

सर्वर फॉल्ट पर इसका उत्तर पहले से ही कैसे दिया गया है, [ बिना कमांड के एक सेट की पहुँच गैर-रूट उपयोगकर्ता तक पहुँच के बिना सूडो के बिना गैर-रूट उपयोक्ता के कमांड के उपयोग के लिए)।

PolicyKit का उपयोग करना अभी भी असामान्य है। एक सिस्टमड "उपयोगकर्ता इकाई" का उपयोग करना ठीक काम करना चाहिए, लेकिन ऐतिहासिक रूप से आपके लक्ष्य को कई बार sudoविशिष्ट उपयोगकर्ता को रूट के रूप में चलाने की अनुमति देने की क्षमता का उपयोग करके पूरा किया गया है ।

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