ssh
इस प्रकार rsh
पासवर्ड फ़ाइल से उपयोगकर्ता की खोल कार्यक्रम का उपयोग कर आदेश पर अमल करने के लिए से परंपरा।
इसका मतलब है कि हम ssh
किसी भी तरह से कॉन्फ़िगरेशन को शामिल किए बिना इसे हल कर सकते हैं ।
यदि आप नहीं चाहते हैं कि उपयोगकर्ता शेल का उपयोग करने में सक्षम हो, तो बस उस उपयोगकर्ता के शेल को स्क्रिप्ट के साथ बदलें। यदि आप देखते हैं /etc/passwd
तो आप देखेंगे कि एक क्षेत्र है जो प्रत्येक उपयोगकर्ता के लिए शेल कमांड दुभाषिया प्रदान करता है। स्क्रिप्ट का उपयोग उनके इंटरेक्टिव लॉगिन के ssh user@host
साथ-साथ कमांड के लिए शेल दोनों के रूप में किया जाता है ssh user@host command arg ...
।
यहाँ एक उदाहरण है। मैंने एक उपयोगकर्ता बनाया foo
जिसका खोल एक स्क्रिप्ट है। स्क्रिप्ट my arguments are:
अपने तर्कों (प्रत्येक एक अलग लाइन और कोण कोष्ठक में) के बाद संदेश को प्रिंट करती है और समाप्त करती है। लॉग मामले में, कोई तर्क नहीं हैं। यहाँ होता है:
webserver:~
foo@localhost's password:
Linux webserver [ snip ]
[ snip ]
my arguments are:
Connection to localhost closed.
यदि उपयोगकर्ता कमांड चलाने की कोशिश करता है, तो यह इस तरह दिखता है:
webserver:~
foo@localhost's password:
my arguments are:
<-c>
<cat /etc/passwd>
हमारे "शेल" को -c
एक तर्क के रूप में पूरे कमांड के साथ एक स्टाइल इनवोकेशन प्राप्त होता है , बस उसी तरह से जो /bin/sh
इसे प्राप्त करेगा।
तो जैसा कि आप देख सकते हैं, अब हम जो कर सकते हैं वह स्क्रिप्ट को और अधिक विकसित कर रहा है ताकि यह उस मामले को पहचान सके जब इसे एक -c
तर्क के साथ लागू किया गया हो , और फिर स्ट्रिंग (पैटर्न मिलान द्वारा कहें) को पार्स करता है। जिन तारों को अनुमति दी गई है, उन्हें पुन: आक्रमण करके वास्तविक शेल में पारित किया जा सकता है /bin/bash -c <string>
। अस्वीकार करने का मामला एक त्रुटि संदेश प्रिंट कर सकता है और समाप्त कर सकता है ( -c
लापता होने पर मामले सहित )।
आपको सावधान रहना होगा कि आप इसे कैसे लिखते हैं। मैं केवल सकारात्मक मैच लिखने की सलाह देता हूं जो केवल बहुत विशिष्ट चीजों की अनुमति देता है, और बाकी सब कुछ को अस्वीकार करता है।
नोट: यदि आप हैं root
, तो आप su
कमांड में शेल को ओवरराइड करके भी इस तरह लॉग इन कर सकते हैं su -s /bin/bash foo
। (पसंद का खोल)। गैर-रूट ऐसा नहीं कर सकता।
यहाँ एक उदाहरण स्क्रिप्ट है: केवल रिपॉजिटरी तक पहुंच के ssh
लिए git
उपयोग करने वाले उपयोगकर्ता को प्रतिबंधित करें /git
।
#!/bin/sh
if [ $# -ne 2 ] || [ "$1" != "-c" ] ; then
printf "interactive login not permitted\n"
exit 1
fi
set -- $2
if [ $# != 2 ] ; then
printf "wrong number of arguments\n"
exit 1
fi
case "$1" in
( git-upload-pack | git-receive-pack )
;;
( * )
printf "command not allowed\n"
exit 1
;;
esac
gitpath=$(readlink -f "$2")
case "$gitpath" in
( /git/* )
;;
( * )
printf "access denied outside of /git\n"
exit 1
;;
esac
if ! [ -e "$gitpath" ] ; then
printf "that git repo doesn't exist\n"
exit 1
fi
"$1" "$gitpath"
बेशक, हम भरोसा कर रहे हैं कि ये Git प्रोग्राम git-upload-pack
और git-receive-pack
छेद नहीं हैं या हैच से बच नहीं हैं जो उपयोगकर्ताओं को सिस्टम तक पहुंच प्रदान करेंगे।
इस तरह की प्रतिबंध योजना में निहित है। उपयोगकर्ता को एक निश्चित सुरक्षा डोमेन में कोड निष्पादित करने के लिए प्रमाणित किया जाता है, और हम उस डोमेन को एक उपडोमेन तक सीमित करने के लिए प्रतिबंध लगा रहे हैं। उदाहरण के लिए यदि आप किसी उपयोगकर्ता को vim
इसे संपादित करने के लिए किसी विशिष्ट फ़ाइल पर कमांड चलाने की अनुमति देते हैं , तो उपयोगकर्ता केवल एक शेल प्राप्त कर सकता है :!sh[Enter]
।