पासवर्ड के बिना user1 को "su - user2" की अनुमति दें


51

मुझे martinउपयोगकर्ता martin-testको पासवर्ड के बिना उपयोगकर्ता पर स्विच करने की अनुमति देने की आवश्यकता है

su - martin-test

मुझे लगता है कि इसे कॉन्फ़िगर किया जा सकता है /etc/pam.d/su। उस फ़ाइल में कुछ पंक्तियाँ पहले से ही हैं जो अनकम्प्रेस्ड हो सकती हैं। हालाँकि, मुझे उपयोगकर्ता martinको समूह में जोड़ने का विचार पसंद नहीं है wheel। मैं martinस्विच करने में सक्षम होने की तुलना में किसी भी अधिक विशेषाधिकार नहीं देना चाहता martin-test। मैं भी उपयोग नहीं करना चाहता sudo

उपयोगकर्ता के विशेषाधिकारों को martinन्यूनतम रखते हुए, इसे करने का सबसे अच्छा तरीका क्या होगा ?


2
sudoउदाहरण के लिए ऐसा करना आसान है sudo -u martin-test -i। क्या कोई कारण है जिसके बारे में आप विशेष रूप से पूछ रहे हैं su?
जोर्डन

मैं sudoसिर्फ इस वजह से स्थापित नहीं करना चाहता (मैं आम तौर पर उपयोग sudoनहीं करता हूं और मुझे विशेष रूप से पसंद नहीं है)। और मुझे लगता है कि इसका उपयोग pamकरना क्लीनर और अधिक पारदर्शी तरीका है।
मार्टिन वेगाटर

3
@MartinVegter जैसा कि आप स्क्रिप्ट के उत्तर से देख सकते हैं, कुछ प्रकार के पैम तंत्र के माध्यम से ऐसा करना बहुत बदसूरत है। वास्तव में यह वही है जो sudoइसके लिए था। इसके अलावा सामान्य रूप से इसका उपयोग नहीं करने पर, आपत्तियां क्या हैं?
पैट्रिक

1
यदि एक स्वच्छ समाधान संभव है pam, तो मैं उस पर प्राथमिकता दूंगा sudo। यदि sudoएकमात्र संभावना है, तो इससे भी ठीक है। मेरी आपत्तियां sudoज्यादातर वैचारिक हैं: मुझे प्रशासन के साथ उपयोगकर्ता का विचार पसंद नहीं है sudo foo। जब मुझे प्रशासन करने की आवश्यकता होती है, मैं रूट के रूप में लॉग इन करता हूं। अन्यथा मैं उपयोगकर्ता के रूप में लॉग इन करता हूं, इन दो अलग-अलग भूमिकाओं को मिश्रित नहीं किया जाना चाहिए। इसके अलावा, मेरे पास पहले से ही pamबुनियादी ढांचा स्थापित है। मैं एक और setuidकार्यक्रम स्थापित नहीं करना चाहता, जो संभवतः सुरक्षा बग का परिचय दे सके।
मार्टिन वेगाटर

5
@MartinVegter आपको sudo fooविशिष्ट आदेशों के लिए नहीं करना है । सूडो के पास sudo -sएक शेल लॉन्च होगा। सुडो एक बहुत ही सामान्य उपयोगिता है जिसका अर्थ है कि सुरक्षा को पूरी तरह से वीटो किया गया है, कुछ पैम चालबाजी की तुलना में कहीं अधिक होगा। मैं यह भी तर्क दूंगा कि विशिष्ट कमांड लॉन्च करने की तुलना में कार्यों के लिए एक रूट शेल प्राप्त करना अधिक असुरक्षित है। जब आप एक शेल लॉन्च करते हैं, तो आप सब कुछ रूट के रूप में चलाते हैं । यदि उन चीजों में से किसी एक (जैसे एक साधारण ls) में सुरक्षा भेद्यता है, तो आपने अभी-अभी एक सुरक्षा छेद खोला है।
पैट्रिक

जवाबों:


61

pam_rootok.soअपने में लाइन के ठीक नीचे निम्नलिखित पंक्तियाँ जोड़ें /etc/pam.d/su:

auth  [success=ignore default=1] pam_succeed_if.so user = martin-test
auth  sufficient                 pam_succeed_if.so use_uid user = martin

ये लाइनें pam_succeed_if.soमॉड्यूल का उपयोग करके जांच करती हैं । लाइनों के बारे में अधिक जानने के लिए लिनक्स-पीएएम कॉन्फ़िगरेशन फ़ाइल सिंटैक्स देखें auth

  • पहली पंक्ति जांचती है कि लक्ष्य उपयोगकर्ता है या नहीं martin-test। यदि ऐसा है, तो कुछ भी नहीं होता है ( success=ignore) और हम वर्तमान उपयोगकर्ता की जांच करने के लिए अगली पंक्ति पर चलते रहते हैं । यदि यह नहीं है, तो अगली पंक्ति को छोड़ दिया जाएगा ( default=1) और हम सामान्य प्रमाणीकरण चरणों के साथ बाद की लाइनों पर जारी रखते हैं।
  • दूसरी पंक्ति यह जांचती है कि क्या वर्तमान उपयोगकर्ता है martin। यदि यह है, तो सिस्टम प्रमाणीकरण प्रक्रिया को सफल मानता है और रिटर्न ( sufficient) देता है । यदि ऐसा नहीं है, तो कुछ भी नहीं होता है और हम बाद की तर्ज पर सामान्य प्रमाणीकरण चरणों के साथ जारी रखते हैं।

आप suएक समूह के लिए भी प्रतिबंधित कर सकते हैं , यहाँ समूह पासवर्ड के बिना allowedpeopleकर सकते suहैं:

auth sufficient pam_succeed_if.so use_uid user ingroup allowedpeople

1
यदि आप अधिकृत करना चाहते हैं यदि वे एक निश्चित समूह में हैं: तो पर्याप्त पर्याप्त pam_succeed_if.so उपयोगकर्ता अंतर्ग्रहण समूह
श्रिम्पवगन

@gnp सुपर धन्यवाद !! Nrpe के साथ iCinga पर काम करना, अलग-अलग उपयोगकर्ता के रूप में कुछ कमांड निष्पादित करना है !! बहुत मदद की !!!!!! धन्यवाद!!!!!
श्रवणकुमार

@ GnP कृपया मेरी मदद करें askubuntu.com/questions/821793/…
Nullpointer

परिवर्तनों को कैसे लागू किया जाए, इस पर जानकारी जोड़ना अच्छा होगा।
Kyslik

@ किसलिक आपका क्या मतलब है? आवश्यक फ़ाइलों को संपादित करने के निर्देश उत्तर में हैं ...
GnP

12

यदि आप समूहों को बदलना या उपयोग नहीं करना चाहते हैं sudo, तो pam_execएक pam मंच में बाहरी स्क्रिप्ट निष्पादित करने के लिए एक pam मॉड्यूल का उपयोग करें ।

लाइन के /etc/pam.d/suबाद अपने में एक लाइन जोड़ें pam_rootok.so:

auth       sufficient pam_exec.so quiet /path/to/script

/path/to/script 755 (rwxr-xr-x) और निम्नलिखित सामग्री की अनुमति है:

#!/bin/bash
if [ "$PAM_TYPE" == "auth" ] && \
[ "$PAM_USER" == "martin-test" ] && \
[ "$PAM_RUSER" == "martin" ]; then
  exit 0
else
  exit 1
fi

तो यह स्क्रिप्ट सफलता के साथ मौजूद है अगर su:

  • प्रमाणीकरण के संदर्भ में कहा जाता है,
  • कॉलिंग उपयोगकर्ता है martinऔर
  • प्रमाणित करने के लिए उपयोगकर्ता है martin-test

देख:

martin@host:~$ su - martin-test
martin-test@host:~$ exit
martin@host:~$ su - otheruser
Password: ****
otheruser@host:~$ 

1
pam_access का उपयोग स्क्रिप्ट पर भरोसा किए बिना, समान कार्यक्षमता प्रदान करने के लिए किया जा सकता है। (यह वही है जो pam_access करने के लिए किया गया था)
jsbillings

1
@jsbillings आप (कुछ विवरण के साथ) एक और जवाब देंगे?
हौके लैजिंग

1
मुझे अपनी स्थिति /etc/pam.d/suका उपयोग करने के pam_accessलिए मुझे कैसे संशोधित करना होगा ?
मार्टिन वेगाटर

3
@jsbillings वास्तव में pam_accessऐसा नहीं कर सकते। जब supam स्टैक के माध्यम से जा रहा है, यह ऐसा कर रहा है जैसे कि उपयोगकर्ता आपके लिए बदल रहा है, न कि उस उपयोगकर्ता से जिसे आप बदल रहे हैं। तो अगर आप इस तरह के रूप में एक नियम जोड़ने के + : martin : ALLलिए, यह अनुमति देगा किसी को भी बदल रहा है करने के लिए martin । अगर आप इसमें बदलाव martinकरते हैं martin-test, तो भी यह किसी को भी करने देगा। आपको उस उपयोगकर्ता का विश्लेषण करने की आवश्यकता है जो आप से आ रहे हैं और जिस उपयोगकर्ता को आप बदल रहे हैं। वास्तव में, यह वही है जो sudo...
पैट्रिक

0

यदि आपके पास रूट खाते तक पहुंच नहीं है, लेकिन उस उपयोगकर्ता का पासवर्ड है जिसे आप कमांड चलाने के लिए उपयोग करना चाहते हैं, तो आप निम्न कार्य कर सकते हैं।

  • यह आपसे टोटो का पासवर्ड पूछेगा: su - टोटो -c whoami
  • यह नहीं होगा: ssh toto @ localhost whoami

बस अपनी सार्वजनिक कुंजी को अधिकृतो_के टोटो में स्थापित करें


सुविचारित उत्तर .. हालाँकि, कमांड जिसे कोई चलाना चाहता है वह पहले से ही मशीन पर है। तो एक ही सर्वर के लिए कोई बिंदु ssh'ing नहीं है।
राजा अन्बझगन

-1

मेरा सरल उपाय है:

sudo login -f martin-test

यदि आप हर कीमत पर सूडो से बचना चाहते हैं, तो मुझे लगता है कि इसे एक स्क्रिप्ट में रखना संभव होना चाहिए:

  1. रूट द्वारा और रूट विशेषाधिकारों के साथ ( सेतु ध्वज का उपयोग करके )
  2. सभी के द्वारा निष्पादन योग्य, बिना किसी सूडो के भी।

हालाँकि, मैं वास्तव में काम करने के लिए बिट्स chown rootऔर chmod +s ToTest.shबिट्स का पता नहीं लगा सकता :

#!/usr/bin/env bash
echo howdy, I am $(whoami)
sudo login -f martin-test

मैं अभी भी अपने सामान्य उपयोगकर्ता के रूप में चलाता हूं, जैसा कि इको मुझे बताता है। और इसमें अभी भी sudo पासवर्ड की आवश्यकता होती है। यदि यह रूट के रूप में चल रहा था, तो sudoअंतिम पंक्ति में कोई भी कर सकता है ...


लिनक्स (या किसी अन्य स्क्रिप्ट) स्क्रिप्ट पर सेट्यूड फ्लैग लिनक्स में और अच्छे कारणों से काम नहीं करेगा। ध्यान दें कि एक काम कर रहे झंडे के साथ उपरोक्त स्क्रिप्ट तुरंत एक जाल होगा: यह "env" (काफी आत्म-पराजय के माध्यम से टकराता है, क्योंकि अगर आप मानते हैं कि आप नहीं जानते कि कहां bashहै, तो आप यह क्यों मानते हैं कि आप जानते हैं कि कहां envहै) क्या यह मौजूद है?)। लेकिन अंत में, आप नहीं जानते कि bashयह वास्तव में क्या होगा। यह आने वाले उपयोगकर्ता की निर्देशिका से आ सकता है और उसके स्रोत कोड से एक मिनट पहले संकलित किया गया है। तुम देखो मैं कहाँ जा रहा हूँ? या उपयोगकर्ता ओवरराइड कर सकता है whoami...
डेविड टोनहोफर

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