सुडो के बिना गैर-रूट उपयोगकर्ता के लिए कमांड के एक सेट का उपयोग करना


13

मैं अपने मशीन पर एक गैर-रूट उपयोगकर्ता को गैर-सूडो एक्सेस देना चाहता हूं, एक उपयोगकर्ता डीएनएस-मैनेजर है, उसकी एकमात्र भूमिका सभी बाइंड कमांड (rndc, dnssec-keygen) आदि को चलाने के लिए है।

अब हर बार उसे कमांड चलाना पड़ता है, वह टाइप करता है,

sudo rndc reload

क्या कोई ऐसा तरीका है जिससे मैं इस सूडो से छुटकारा पा सकता हूं, लेकिन केवल कमांड के एक विशेष सेट पर (और केवल डीएनएस-मैनेजर के लिए)?


5
इस तरह से विवेकाधीन अभिगम नियंत्रण बहुत अधिक sudoहै। इसके लिए उसका उपयोग करने के sudoलिए आपकी व्यावसायिक आपत्तियां क्या हैं ?
मदहैर्ट

1
@peterh मैं अपना प्रश्न दोहराता हूं: विवेकाधीन अभिगम नियंत्रण (यानी, आंशिक sysadm प्रतिनिधिमंडल) की भूमिका है sudo। आपत्तियाँ क्या हैं?
मदहैर्ट

3
पासवर्ड के बारे में कैसे sudo, फिर? या DNS प्रबंधन टूल को चलाने के लिए sudo को पासवर्ड दिया गया , जो तब आवश्यकतानुसार namedसमूह या उपयोगकर्ता विशेषाधिकार, या रूट विशेषाधिकार के साथ काम कर सकता है ।
मदहैर्ट

4
@peterh "इसे इस तरह से करने का एक अच्छा कारण" लापता बिट होगा। आम तौर पर इस तरह के सवाल भेस में XY समस्याएं बनते हैं, और मुझे लगता है कि अंतर्निहित मुद्दे को समझना उन्हें पूरी तरह से और पेशेवर रूप से जवाब देने के लिए महत्वपूर्ण है।
मदहैर्ट

2
@peterh मुझे लगता है कि हम एक दूसरे के साथ सहमत हैं। मैं भी, ओपी को अपने प्रश्न में सुधार करते देखना चाहता हूं; यह नीचे ड्रिलिंग मेरे लिए अच्छी तरह से काम करता है एक तरह से लेखक को बॉक्स के बाहर सोचने में मदद करने के लिए जो वह खुद के आसपास बनाया गया है। वह अच्छी तरह से बचने के लिए इच्छा के लिए एक अच्छा कारण हो सकता है sudo। हमें इसे व्यक्त करने की कोशिश में, वह या तो हमारे भ्रम को दूर कर सकता है, या अपनी - या दोनों को!
मेडहैटर

जवाबों:


31

यदि मैं आपकी टिप्पणियों को सही ढंग से समझता हूं, तो यहां मुद्दा यह है कि कमांड एक कनेक्शन के माध्यम से जारी किया जाएगा जिसमें उस पासवर्ड को दर्ज करने की कोई क्षमता नहीं है जो सूडो अनुरोध करने के लिए चूकता है। इसके अलावा, कई OS वितरणों में, sudo को TTY की आवश्यकता के लिए डिफ़ॉल्ट होगा - जो कि यह कार्यक्रम नहीं हो सकता है।

हालाँकि, sudo एक बहुत ही बारीक अनुमत अनुमतियाँ संरचना रखने में सक्षम है, जिससे एक या एक से अधिक उपयोगकर्ताओं को पासवर्ड और TTY के बिना एक विशेष कमांड जारी करने की अनुमति मिल सकती है। नीचे, मैं आपकी आवश्यकताओं के लिए इसे कॉन्फ़िगर करने के तीन तरीके दिखाऊंगा। जो भी आप चुनते हैं, उपयोगकर्ता अब sudo rndc reloadपासवर्ड दर्ज किए बिना कमांड जारी कर सकेगा ।

(इसके अलावा, यह अनावश्यक हो सकता है, लेकिन ... कृपया इसे संपादित करने से पहले अपने sudoers फ़ाइल की एक बैकअप प्रतिलिपि बनाने के लिए याद रखें, एक शेल रखने के लिए जहां आप रूट ओपन हैं, यदि आपको बैकअप को वापस करने की आवश्यकता है, और संपादित करने के लिए इसके visudoबजाय इसका उपयोग करना sudo vi /etc/sudoers। उम्मीद है कि ये सावधानियां अनावश्यक होंगी, लेकिन ... उनके पास होने के लिए बेहतर है और रिवर्स की तुलना में उनकी आवश्यकता नहीं है!)

1. यदि आप किसी भी अनुरोध के लिए TTY की आवश्यकता नहीं चाहते हैं

TTY आवश्यकताओं से छुटकारा पाने का सबसे आसान तरीका (यदि कोई मौजूद है) यह सुनिश्चित करना है कि जिस रेखा के साथ शुरुआत होती Defaultsहै /etc/sudoersउसमें शब्द नहीं है requiretty- इसके बजाय, इसमें शामिल होना चाहिए !requiretty। हालाँकि, यदि आप ऐसा करते हैं, तो इसका मतलब है कि किसी भी sudo कमांड को tty की आवश्यकता नहीं होगी!

आपको लाइन जोड़ने की भी आवश्यकता होगी

rndcuser ALL = (root) NOPASSWD: /path/to/rndc reload, /path/to/dnssec-keygen, /path/to/other/program

2. यदि आप इस एक को छोड़कर सभी उपयोगकर्ताओं के लिए TTY की आवश्यकता चाहते हैं

यह इस तरह के एक उपयोगकर्ता के लिए एक डिफ़ॉल्ट सेट करके किया जा सकता है:

Defaults:rndcuser        !requiretty
rndcuser ALL = (root) NOPASSWD: /path/to/rndc reload, /path/to/dnssec-keygen, /path/to/other/program

3. यदि आप इस एक उपयोगकर्ता द्वारा एक कमांड को छोड़कर सभी आदेशों के लिए एक TTY आवश्यक करना चाहते हैं

यह कुछ अधिक जटिल है, जो sudoers फ़ाइल के सिंटैक्स के कारण है। आपको कमांड के लिए कमांड अलियास बनाने की आवश्यकता होगी, और फिर उस कमांड उपनाम के लिए एक डिफ़ॉल्ट सेट करें, जैसे:

Cmnd_Alias RNDC_CMD = /path/to/rndc reload, /path/to/dnssec-keygen, /path/to/other/program
Defaults!RNDC_CMD !requiretty
rndcuser ALL = (root) NOPASSWD: RNDC_CMD

बेशक, इसे एक रैपर स्क्रिप्ट के साथ जोड़ा जा सकता है जो कि sudo का उपयोग करके कमांड को कॉल करता है, अगर किसी कारण से आप पासवर्ड रहित होने पर भी सीधे sudo का उपयोग नहीं कर सकते।
जेनी डी

4

हाँ। सुडो को बहुत लचीले ढंग से कॉन्फ़िगर किया जा सकता है। फिर भी, मुझे उल्लेख करना चाहिए: इन प्रकार के समाधानों को बहुत सुरक्षित नहीं माना जाना चाहिए, और उनका उपयोग केवल सहकारी वातावरण में किया जाना चाहिए, जहां अन्य नियंत्रण स्थान पर हैं (इस प्रकार, आप इन उन्नत विशेषाधिकार अपने वफादार अधीनस्थ को दे सकते हैं, लेकिन एक ग्राहक के लिए ऐसा नहीं करना चाहिए जिसे आप केवल नेट से जानते हैं)।

/etc/sudoersअधिकांश सिस्टम में सुडो कॉन्फिग होता है । आप Googling या एक man sudoकमांड द्वारा इसके सिंटैक्स का पता लगा सकते हैं ।

आपको इस फ़ाइल को सीधे संपादित नहीं करना चाहिए; ऐसा करने से सुरक्षा दौड़ की स्थिति बन सकती है। इसके बजाय, visudoकमांड का उपयोग करें (जो आपके $EDITORपर्यावरण चर के आसपास एक आवरण है )।


आपके द्वारा sudo को कॉन्फ़िगर करने के बाद, आप इसे आसानी से दृश्यमान कमांड के चारों ओर लपेट सकते हैं। यह बहुत ही सरल है:

  1. अपनी sudo आवरण लिपियों (फ़े /usr/local/dnsadmin/bin) की सूची के लिए एक निर्देशिका बनाएँ
  2. उन कमांड के लिए एक रैपर स्क्रिप्ट बनाएं जिन्हें आप बिना सूडो के प्रयोग करने योग्य बनाना चाहते हैं। उदाहरण के लिए, यह एक बहुत ही सरल कमांड /usr/local/dnsadmin/bin/rndcहोगी:

    #!/bin/bash exec /usr/bin/sudo /usr/sbin/rndc "$@"

  3. इस निर्देशिका को उनके PATHपर्यावरण चर में प्राप्त करें (जैसे कि सिस्टम-वाइड या उनके स्थानीय द्वारा .profile)।


जिज्ञासा से बाहर - आप execकेवल कमांड को सीधे कॉल करने के बजाय शेल स्क्रिप्ट में क्यों उपयोग करेंगे ? (मैं यह नहीं कह रहा हूं कि यह गलत है, मुझे यह जानना पसंद है कि आप ऐसा क्यों करेंगे ताकि मैं शायद कुछ सीख सकूं)
जेनी डी

2
मैं पासवर्ड रहित sudo बिट के साथ किया जाता है, आवरण लिपियों विचार महान है।
Anss

2
@ जेनीडी :-) स्थिरता और प्रदर्शन के कारण। के मामले में exec, शेल के स्थान पर निर्दिष्ट कमांड को प्रतिस्थापित किया जाएगा। खोल के चला जाएगा। एक निष्पादन के बिना, शेल उस कमांड को शुरू करेगा, और फिर उसकी समाप्ति की प्रतीक्षा करेगा, और फिर बाहर निकल जाएगा। यह दूसरा, निष्पादन-कम का मतलब है कई सहयोगात्मक प्रक्रियाएं, जो कि अनावश्यक है। लेकिन कोई बड़ा अंतर नहीं है, निष्पादन के बिना यह काम सिर्फ इतना ही होगा।
पीटर - मोनिका

@ जेनीडी मेरी दलील :-)
- मोनिका

@Snowbody बहुत बहुत शुक्रिया! यह बहुत बड़ा सम्मान है।
पीटर - मोनिका

2

हालांकि यह आपके लिए विशिष्ट मामले में एक सामान्य समाधान rndcनहीं है sudo, इसकी आवश्यकता नहीं है ।

rndcnamedखुद को प्रमाणित करने के लिए एक गुप्त कुंजी का उपयोग करके किसी स्थानीय सॉकेट या रिमोट पोर्ट के माध्यम से किसी भी प्रक्रिया के साथ संवाद कर सकते हैं । डिफ़ॉल्ट रूप से (या कम से कम, डेबियन के लिए, जो डिस्ट्रो मैं उपयोग करता है) यह फ़ाइल में पाया जा सकता है /etc/bind/rndc.keyऔर सामान्य रूप से केवल उपयोगकर्ता bindऔर समूह के लिए पठनीय है bind

जिस किसी ने भी उस कुंजी फ़ाइल (या इसकी एक समान प्रतिलिपि) तक पहुंच पढ़ी rndcहै, वह BIND सर्वर को नियंत्रित करने के लिए उपयोग कर सकता है, इसलिए इस विशेष मामले में सबसे आसान समाधान उपयोगकर्ता को bindसमूह में जोड़ना होगा ।

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


-1

आप कुछ कमांड के लिए रूट देने के लिए sudo का उपयोग नहीं करना चाहते हैं। इसके बजाय आप 4750 को एक विशिष्ट प्रोग्राम [जो कि कमांड को लपेट सकते हैं] को चोद सकते हैं, एक सामान्य उपयोगकर्ता के अधिकारों को बढ़ाने के लिए कि इसे रूट के रूप में निष्पादित करें।

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