एक उपयोगकर्ता जोड़ना जो केवल स्क्रिप्ट को दूरस्थ रूप से निष्पादित कर सकता है


14

मैं एक उपयोगकर्ता बनाना चाहूंगा जो केवल एक ही काम कर सकता है: ssh के माध्यम से एक स्क्रिप्ट निर्दिष्ट करें (और स्क्रिप्ट पर कमांड लाइन तर्क) जो एक विशेष फ़ोल्डर में रहता है (इस प्रश्न के प्रयोजनों के लिए हमें इसे कॉल करें /local/remote_only_scripts/foo) और उस स्क्रिप्ट को निष्पादित करें और यह आउटपुट है।

चीजों के कुछ उदाहरणों को स्पष्ट करने के लिए मैं नहीं चाहता कि उपयोगकर्ता ऐसा करने में सक्षम हों:

  • स्थानीय रूप से खाते में लॉग इन करें। लॉगिन आवेदन है /bin/login। यह /local/remote_only_scripts/fooफ़ोल्डर में एक स्क्रिप्ट नहीं है , इसलिए उपयोगकर्ता द्वारा नहीं बुलाया जाना चाहिए।
  • खाते में दूरस्थ रूप से प्रवेश करें। फिर से लॉगिन (यह है कि क्या ssh द्वारा कहा जाता है?) संबंधित फ़ोल्डर में एक स्क्रिप्ट नहीं है।
  • निर्देशिका की सामग्री को सूचीबद्ध करें। ls में है /bin/ls। यह उपयुक्त निर्देशिका में एक स्क्रिप्ट नहीं है।
  • उस निर्देशिका में एक फ़ाइल संपादित करें। emacs, vi, gedit अधिकांश अन्य संपादक उस निर्देशन में स्क्रिप्ट नहीं हैं।
  • उस निर्देशिका में एक फ़ाइल की सामग्री देखें।
  • उस निर्देशिका में एक फ़ाइल निष्पादित करें जिसे उसे निष्पादित करने की अनुमति नहीं है।

ध्यान दें कि ये उदाहरण हैं कई अन्य क्रियाएं हैं जो मैं नहीं चाहता कि उपयोगकर्ता करने में सक्षम हो। एक कार्रवाई पर विचार करने में, पूछें "क्या यह एक स्क्रिप्ट द्वारा किया जा रहा है /local/remote_only_scripts/foo?" यदि उत्तर नहीं है तो उपयोगकर्ता को ऐसा करने में सक्षम नहीं होना चाहिए। यदि जवाब हां है तो उपयोगकर्ता को ऐसा करने में सक्षम होना चाहिए।

पुनश्च: मुझे स्पष्ट करें कि "उपयोगकर्ता जोड़ने" से मेरा क्या मतलब है। मेरा मतलब कुछ ssh सबसिस्टम में उपयोगकर्ता जोड़ने से नहीं है। बल्कि मेरा मतलब है कि उपयोगकर्ता को कंप्यूटर सिस्टम में जोड़ना। इसलिए, उदाहरण के लिए, मेरे पास एक सिस्टम है जो डेबियन स्टेबल चल रहा है, इसे इसे एड्रेस, www.hg.bar.com पर कॉल करें। मैं एक उपयोगकर्ता जोड़ना चाहता हूं (कुसेर के माध्यम से, उपयोगकर्ता-व्यवस्थापक या useradd या कुछ इसी तरह) उसे hg_guest कहते हैं। hg_guest स्थानीय रूप से लॉगिन नहीं कर सकता है या उपरोक्त सूची में कोई भी चीज़ नहीं कर सकता है। सभी hg_guest स्क्रिप्ट को "दूरस्थ रूप से" निष्पादित कर सकते हैं। मैंने कहा कि उसे ssh के माध्यम से ऐसा करने में सक्षम होना चाहिए, लेकिन अभी इसके बारे में सोचकर, शायद ssh का उपयोग करने की अनुमति देने से वह स्थानीय स्तर पर लॉगिन कर सकता है, इसलिए कुछ अन्य तंत्र की आवश्यकता हो सकती है।

जवाबों:


12

अधिकृत_की फ़ाइल में एक कमांड विकल्प है। यह विकल्प ठीक वही करना चाहता है जो आप चाहते हैं।

ध्यान दें कि यह चेरोट या प्रतिबंधित शेल नहीं है। यह ssh के माध्यम से केवल उन कमांड को निष्पादित करने की अनुमति देता है। आपके उदाहरण के साथ, यह होगा:

ssh somehost /local/remote_only_scripts/foo

इस अधिकृत_की फ़ाइल के लिए:

command="/local/remote_only_scripts/foo",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ...public key... 

यदि आप चाहते हैं कि आपका उपयोगकर्ता स्थानीय रूप से लॉग इन करने में सक्षम न हो तो बहुत सारे रास्ते हैं। आप या तो यह कर सकते हैं :

  • बस इसके शेल को / bin / false (शायद आपको / बिन / सच की आवश्यकता होगी क्योंकि ssh को एक वैध लॉग की आवश्यकता है)
  • इसका पासवर्ड लॉक करें, देखें passwd -l

संपादित करें : अधिक प्रतिबंध विकल्प जोड़े और स्पष्ट करें कि आप स्थानीय पहुंच कैसे निकालते हैं।


मुझे नहीं लगता कि आपको क्लाइंट की ओर से ssh में उस कमांड को निर्दिष्ट करने की आवश्यकता है, यह 'मजबूर' कमांड है इसलिए इसे हमेशा निष्पादित किया जाएगा;) दूरस्थ साइट पर उपयोगकर्ता को अभी भी / etc / passwd में परिभाषित वैध शेल की आवश्यकता है।
जिरीब

1
इसके अलावा command=, no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-ptyखाते को वास्तव में प्रतिबंधित करने के लिए विकल्पों की आवश्यकता होती है।
जोफेल

ठीक है। मैं आधी रात को उठा और जवाबों की जाँच करने का फैसला किया। जब से मैं सूख रहा हूं मैं पूरे उत्तर को आत्मसात नहीं करूंगा, लेकिन कुछ ऐसा पूछूंगा जो मुझे भ्रमित कर दे। यह hg_quest को ट्टी से लॉग इन करने से कैसे रोकता है?
हैंडीगैंडी

@ हिंडीगंडी यह सबसे सरल हिस्सा है। इसे करने में मुझे के 2 तरीकों को शामिल किया है, लेकिन मुझे लगता है कि अधिक है
कोरेन

0

इसे उपयोगकर्ता के लिए लॉगिन शेल के रूप में आज़माएँ:

#!/bin/sh
basedir=/local/remote_only_scripts
while read -p '$ ' prog args; do
    if [ ! -x "$basedir/$prog" ]; then
        echo "Invalid program: $prog"
    else
        case "$prog $args" in
            *\**|*\?*|*\^*|*\&*|*\<*|*\>*|*\|*|*\;*|*\`*|*\[*|*\]*)
                echo "Invalid character in command";;
            *)
                eval "$prog $args"
                echo;; # force a trailing newline after the program
        esac
    fi
done

आप शायद यह भी authorized_keysस्पष्ट रूप से फ़ाइल में करना चाहते हैं जैसा कि कोरन के उत्तर में है; लेकिन 'की जगह ... / फू; यहां कार्यक्रम के साथ। यही कारण है कि जैसे SSH से आदेश कर पाएगा sftp, scpऔर ssh hostname command


यदि आप केवल यह चाहते हैं कि उपयोगकर्ता आपकी निर्देशिका से आदेशों को निष्पादित करने में सक्षम हो (और बहुत अधिक नहीं हैं), तो आप ऊपर दिए गए पाठ से "ठेला" ले सकते हैं और विकल्पों के पाठ मेनू की पेशकश करने के लिए एक चयन कथन का उपयोग कर सकते हैं। उन कार्यक्रमों की और फिर तर्कों के लिए पढ़ते हैं। यदि आप स्क्रिप्ट में विभिन्न बिंदुओं पर Ctrl-Cs का एक गुच्छा टाइप करते हैं तो क्या होगा यह सुनिश्चित करने के लिए मैं इसका परीक्षण भी करूंगा। तुम वहाँ भी एक जाल आदेश चाहते हो सकता है।
जो

0

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

server1:/ # useradd -s "/local/remote_only_scripts/foo/script.sh" hg_guest

server1:/ # grep hg_guest /etc/passwd

hg_guest: एक्स: 2002: 100 :: / घर / hg_guest: /local/remote_only_scripts/foo/script.sh

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