คุณสามารถระบุ git-shell ใน. ssh / authorized_keys เพื่อ จำกัด การเข้าถึงคำสั่ง git ผ่าน ssh ได้หรือไม่?


37

ฉันต้องการที่จะสามารถใช้คีย์ ssh สำหรับการตรวจสอบ แต่ยังคง จำกัด คำสั่งที่สามารถดำเนินการผ่านอุโมงค์ ssh

ด้วยการโค่นล้มฉันทำได้โดยใช้ไฟล์. ssh / authorized_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


บิงโก! มันใช้งานได้เหมือนกับที่ฉันหวังว่าจะบรรลุ! ขอบคุณ
Matt Connolly

ในโพสต์ที่เกี่ยวข้องใน SO stackoverflow.com/questions/5871652/…พวกเขาชี้ไปที่โซลูชันอื่นที่นี่: joey.kitenet.net/blog/entry/locking_down_ssh_authorized_keys
Tim

1
@Tim นี่เป็นวิธีแก้ปัญหาเดียวกัน แต่บีบเนื้อหาของสคริปต์ ~ / gitserve ของฉันลงในคีย์ที่ได้รับอนุญาตโดยใช้ perl โดยส่วนตัวฉันชอบเก็บไว้ในสคริปต์แยกต่างหาก
Neil Mayhew

1
ฉันเข้าใจฉันแค่เพิ่มมันเป็นข้อมูลอ้างอิง
ทิม

คุณมีเชลล์ใดที่ผู้ใช้ตั้งค่าไว้ในการกำหนดค่านี้ /bin/bash?
M-Pixel

33

ฉันสามารถใช้ git-shell ได้โดยตรงในไฟล์ authorizedKeys โดยตรงโดยไม่ต้องใช้สคริปต์เพิ่มเติม

กุญแจสำคัญคือการเพิ่ม\"รอบตัวแปร env

ทดสอบใน rhel6 openssh-server-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ทั้งหมด แต่นั่นอาจจะเป็นความหวาดระแวง
Ulrich Schwarz

มีใครพบวิธีการ จำกัด ไดเรกทอรีที่เข้าถึงได้หรือไม่ ฉันพบว่าฉันสามารถ cd ลงในไดเรกทอรีก่อนรัน git-shell แต่ git-shell อนุญาตให้ ".. " และพา ธ สัมบูรณ์
yokto

5

วิธีแก้ปัญหาของGrawityสามารถแก้ไขได้อย่างง่ายดายเพื่อให้ทำงานได้โดยเปลี่ยนสาย

        exec $SSH_ORIGINAL_COMMAND

กับสาย

        git-shell -c "$SSH_ORIGINAL_COMMAND"

เครื่องหมายคำพูดจะดูแลปัญหาที่รายงานข้างต้นและการแทนที่ exec ด้วย git-shell ดูเหมือนจะปลอดภัยกว่าเล็กน้อย


4

git-shellถูกออกแบบมาเพื่อใช้เป็นเปลือกเข้าสู่ระบบเพื่อที่จะได้รับ-c "originalcommand"เป็นข้อโต้แย้ง สิ่งนี้จะไม่เกิดขึ้นกับ "คำสั่งบังคับ" ใน OpenSSH; แต่คำสั่งบังคับจะถูกส่งผ่านไปยังเชลล์ที่ตั้งค่าไว้

สิ่งที่คุณสามารถทำได้คือเขียนสคริปต์ที่ตรวจสอบ$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

@ Matt: คอมไพล์เปลือก (1)กล่าวว่าคำสั่งจะgit <cmd>ไม่git-<cmd>?
grawity

อืม ... ฉันทำการเปลี่ยนแปลงตามสิ่งที่ฉันเห็นเมื่อฉันวิ่ง ทั้งสคริปต์ทุบตีและสคริปต์ทับทิมฉันเห็นคำสั่ง "git-accept-pack" เป็นคำสั่ง อ้างจากของฉันman git-shell(git 1.7.3.4): ปัจจุบันมีเพียงสี่คำสั่งที่ได้รับอนุญาตให้เรียก git-receive-pack git-upload-pack และ git-upload-archive ด้วยอาร์กิวเมนต์ที่จำเป็นเดียวหรือเซิร์ฟเวอร์ cvs (เพื่อเรียก git -cvsserver)
Matt Connolly

การจัดรูปแบบไม่ทำงานในความคิดเห็น :(
แมตต์คอนนอลลี่

1
สิ่งนี้ไม่ได้ผลสำหรับฉันเพราะไคลเอนต์ git ของฉัน (1.7.5.4) ส่งชื่อ repo ด้วยเครื่องหมายคำพูดเดี่ยวน่าจะเป็นเพราะมันคาดว่าจะมีบรรทัดคำสั่งทั้งหมดตีความโดยเชลล์ exec $ SSH_ORIGINAL_COMMAND จากนั้นส่งราคาเดียวไปยัง git-receive-pack ฯลฯ ซึ่งไม่พบที่เก็บ
Neil Mayhew

ขอขอบคุณสำหรับการแก้ปัญหา grawity แต่มันไม่ได้ผลสำหรับเราเพราะเหตุผลเดียวกันกับที่ถูกรายงานโดยนีลเมย์ฮิว ... เวอร์ชั่น 1.7.x ฉันของคอมไพล์ยังส่งชื่อ repo ในราคาเดียวในท้ายที่สุดที่ก่อให้เกิด$SSH_ORIGINAL_COMMANDการเป็น ไม่ถูกต้องและเป็นสาเหตุgit-shellให้กุ๊ย :-(
pvandenberk

1

ฉันไม่สามารถแก้ปัญหาgrawityเพื่อทำงานด้วยเหตุผลเดียวกันกับที่รายงานโดยNeil Mayhew (เช่น. คำพูดเดียวที่ส่งโดยลูกค้า git ทำให้ไม่ถูกต้อง$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 เท่านั้น
  • เมื่อเชื่อมต่อกับการตรวจสอบรหัสผ่านหรือใช้กุญแจส่วนตัวที่แตกต่างกันให้เปลือกเต็ม

... ดังนั้นคำตอบอื่น ๆ ในหัวข้อนี้จึงถูกนำมาใช้ แต่ถ้าคุณสามารถจัดสรรผู้ใช้แยกเป็น git ได้การตั้งค่า shell ให้git-shellเป็นวิธีที่ง่ายที่สุดในการ จำกัด มันและมีความปลอดภัยมากกว่าเล็กน้อยเนื่องจากไม่ต้องใช้เชลล์สคริปต์เพิ่มเติม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.