क्या आप ssh के माध्यम से केवल git कमांड के एक्सेस को प्रतिबंधित करने के लिए .ssh / अधिकृत_keys में git-shell निर्दिष्ट कर सकते हैं?


37

मैं प्रमाणीकरण के लिए एक ssh कुंजी का उपयोग करने में सक्षम होना चाहता हूं, लेकिन अभी भी ssh सुरंग पर निष्पादित की जा सकने वाली कमांड को प्रतिबंधित कर सकता है।

तोड़फोड़ के साथ, मैंने .ssh / अधिकृत_keys फ़ाइल का उपयोग करके इसे प्राप्त किया है:

command="/usr/local/bin/svnserve -t --tunnel-user matt -r /path/to/repository",no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-pty ssh-rsa AAAAB3NzaC1yc2EAAAABIetc...

मैंने इसके लिए कमांड में "/ usr / bin / git-shell" के साथ कोशिश की है, लेकिन मुझे अभी फंकी पुरानी fatal: What do you think I am? A shell?त्रुटि संदेश मिला है।

जवाबों:


30

निम्नलिखित मेरे लिए काम करता है।

इन ~/.ssh/authorized_keys:

command="./gitserve",no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-pty ssh-dss AAAAB…

में ~/gitserveस्क्रिप्ट:

#!/bin/sh
exec git-shell -c "$SSH_ORIGINAL_COMMAND"

ध्यान दें कि यदि आप gitserveघर की निर्देशिका के अलावा कहीं और रखते हैं, तो आपको command="./gitserve"पैरामीटर को समायोजित करना होगा authorized_keys


बिंगो! यह वैसे ही काम करता है जैसा मैं हासिल करने की उम्मीद कर रहा था! धन्यवाद।
मैट कॉनूली

इतने पर इस संबंधित पोस्ट में stackoverflow.com/questions/5871652/... : वे एक और समाधान यहाँ को इंगित joey.kitenet.net/blog/entry/locking_down_ssh_authorized_keys
टिम

1
@ यह अनिवार्य रूप से एक ही समाधान है, लेकिन मेरी ~ / gitserve स्क्रिप्ट की सामग्री को अधिकृत कुंजी में पर्ल का उपयोग करके निचोड़ता है। व्यक्तिगत रूप से, मैं इसे एक अलग स्क्रिप्ट में रखना पसंद करता हूं।
नील मैय्यूज

1
मैं समझता हूं, मैंने इसे केवल संदर्भ के रूप में जोड़ा है।
टिम

इस कॉन्फ़िगरेशन में उपयोगकर्ता के पास कौन सा शेल है? /bin/bash?
एम-पिक्सेल

33

मैं एक अतिरिक्त स्क्रिप्ट का उपयोग किए बिना सीधे अधिकृतके फ़ाइल में गिट-शेल का सफलतापूर्वक उपयोग कर सकता हूं।

कुंजी को \"env चर के चारों ओर जोड़ना है ।

Rhel6 ओपनश-सर्वर-5.3p1-70.el6.x86_64 में परीक्षण किया गया:

no-port-forwarding,no-agent-forwarding,command="git-shell -c \"$SSH_ORIGINAL_COMMAND\"" ssh-dss AAAA...

+1 यह सही उत्तर है, देखें svnweb.freebsd.org/base/head/crypto/openssh/…
Tino

2
व्यक्तिगत रूप से, मैं पूरा रास्ता दे दूँगा git-shell, लेकिन यह सिर्फ व्यामोह हो सकता है।
उलरिच श्वार्ज

क्या किसी ने उस निर्देशिका को प्रतिबंधित करने का एक तरीका पाया है जिसके पास इसकी पहुंच है? मैंने पाया कि मैं git-shell निष्पादित करने से पहले एक निर्देशिका में cd कर सकता हूं, लेकिन git-shell ".." और निरपेक्ष पथ की अनुमति देता है।
योको

5

Grawity 's समाधान को लाइन में बदलकर काम करने के लिए आसानी से संशोधित किया जा सकता है

        exec $SSH_ORIGINAL_COMMAND

रेखा के साथ

        git-shell -c "$SSH_ORIGINAL_COMMAND"

उद्धरण ऊपर बताए गए मुद्दों का ध्यान रखते हैं, और गिट-शेल के साथ निष्पादन को प्रतिस्थापित करना थोड़ा अधिक सुरक्षित लगता है।


4

git-shellको एक लॉगिन शेल के रूप में उपयोग करने के लिए डिज़ाइन किया गया है, ताकि इसे -c "originalcommand"तर्क के रूप में प्राप्त किया जा सके। ओपनएसएसएच में "मजबूर कमांड" के साथ ऐसा नहीं होता है; इसके बजाय, मजबूर कमांड को कॉन्फ़िगर शेल में पास किया गया है।

आप जो भी कर सकते हैं वह एक स्क्रिप्ट लिखता है जो $SSH_ORIGINAL_COMMANDइसे जांचता है और निष्पादित करता है। बाश में उदाहरण :

#!/bin/bash

SSH_ORIGINAL_COMMAND=${SSH_ORIGINAL_COMMAND/#git /git-}

case $SSH_ORIGINAL_COMMAND in
    "git-receive-pack"*|"git-upload-pack"*|"git-upload-archive"*)
        eval exec $SSH_ORIGINAL_COMMAND
        ;;
    *)
        echo "Go away." >&2
        exit 1
        ;;
esac

@ मैट: गिट-शेल (1) का कहना है कि कमांड्स हैं git <cmd>, नहीं git-<cmd>?
विशाल

हम्म ... मैंने जो कुछ देखा था, उसके अनुसार मैंने इसे चलाया जब मैंने इसे चलाया। एक बैश स्क्रिप्ट और एक रूबी स्क्रिप्ट दोनों के साथ, मैंने कमांड के रूप में "गिट-प्राप्त-पैक" देखा। मेरे से उद्धरण man git-shell(git 1.7.3.4): वर्तमान में, केवल चार आदेशों को कॉल करने की अनुमति है, git-Rece-pack git-upload-pack और git-upload-आर्काइव एक ही आवश्यक तर्क के साथ, या cvs सर्वर (रिट आह्वान करने के लिए) -cvsserver)।
मैट कोनोली

स्वरूपण टिप्पणियों में काम नहीं करता है :(
मैट कोनोली

1
यह मेरे लिए काम नहीं करता है, क्योंकि मेरा गिट क्लाइंट (1.7.5.4) रेपो नाम को एकल उद्धरणों में भेजता है, संभवत: क्योंकि यह पूरी कमांड लाइन को शेल द्वारा व्याख्यायित करने की उम्मीद कर रहा है। अमल $ SSH_ORIGINAL_COMMAND फिर एकल उद्धरण को git-receive-pack आदि पर पास करता है, जिससे रिपॉजिटरी नहीं मिलती है।
नील मैय्यू

समाधान के लिए धन्यवाद, विशालता, लेकिन यह मेरे लिए काम नहीं करता है, उसी कारण के लिए जो नील मेव्यू द्वारा रिपोर्ट किया गया था ... मेरे 1.7.x संस्करण git भी एकल उद्धरणों में रेपो नाम भेजता है, अंततः होने का कारण बनता $SSH_ORIGINAL_COMMANDहै अमान्य, और git-shellचूतड़ बाहर करने के लिए कारण :-(
pvandenberk

1

मुझे उसी कारण से काम करने के लिए ग्रेविटी का समाधान नहीं मिल सका है, जो नील मेव्यू द्वारा रिपोर्ट किया गया था (यानी, गिट क्लाइंट द्वारा भेजे गए एकल उद्धरण एक अवैध कारण है $SSH_ORIGINAL_COMMAND- मैं उपयोग कर रहा हूं git v1.7.x)

हालाँकि, @moocode द्वारा लागू किया गया निम्न समाधान सिर्फ काम करता है:

https://moocode.com/posts/6-code-your-own-multi-user-private-git-server-in-5-minutes

रूबी FTW! :-)


1

पूर्णता के लिए, और चूंकि मूल प्रश्न में यह निर्दिष्ट नहीं किया गया था कि एक ही खाते को गैर-जीआईटी चीजों के लिए उपयोग git-shellकरने योग्य होना था , इसलिए इसका उपयोग करने के लिए डिज़ाइन किए गए के रूप में स्पष्ट उत्तर का उपयोग करना है: इसे लॉगिन शेल (यानी usermod, के साथ सेट करें ) में /etc/passwd) है कि ssh उपयोगकर्ता के लिए।

यदि आपके पास एक एकल उपयोगकर्ता खाता है जिसे आप दो तरीकों से उपयोग करना चाहते हैं:

  • कुंजी प्रमाणीकरण के साथ कनेक्ट करते समय, केवल गिट के लिए उपयोग करें
  • पासवर्ड प्रमाणीकरण के साथ कनेक्ट होने पर, या एक अलग निजी कुंजी का उपयोग करके, एक पूर्ण शेल प्रदान करें

... तो इस सूत्र में अन्य उत्तर लागू होते हैं। लेकिन अगर आप एक अलग उपयोगकर्ता को गिट करने के लिए आवंटित करने का जोखिम उठा सकते हैं, तो इसका खोल सेट git-shellकरना इसे प्रतिबंधित करने का सबसे सरल तरीका है, और थोड़ा अधिक सुरक्षित है क्योंकि इसके लिए अतिरिक्त शेल स्क्रिप्ट की आवश्यकता नहीं है।

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