Bạn có thể chỉ định git-shell trong .ssh / ủy quyền để hạn chế quyền truy cập chỉ các lệnh git qua ssh không?


37

Tôi muốn có thể sử dụng khóa ssh để xác thực, nhưng vẫn hạn chế các lệnh có thể được thực thi trên đường hầm ssh.

Với Subversion, tôi đã đạt được điều này bằng cách sử dụng tệp .ssh / ủy quyền như sau:

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...

Tôi đã thử điều này với "/ usr / bin / git-shell" trong lệnh, nhưng tôi nhận được fatal: What do you think I am? A shell?thông báo lỗi cũ .

Câu trả lời:


30

Các công việc sau đây cho tôi.

Trong ~/.ssh/authorized_keys:

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

Trong ~/gitservekịch bản:

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

Lưu ý rằng nếu bạn đặt gitservemột nơi khác ngoài thư mục chính, bạn sẽ phải điều chỉnh command="./gitserve"tham số trong authorized_keys.


Chơi lô tô! Đây là công việc giống như những gì tôi đã hy vọng đạt được! Cảm ơn.
Matt Connolly

Trong bài đăng liên quan này trên SO stackoverflow.com/questions/5871652/, họ chỉ đến một giải pháp khác tại đây: joey.kitenet.net/blog/entry/locking_down_ssh_ trái_keys
Tim

1
@Tim Đây thực chất là cùng một giải pháp, nhưng ép nội dung của tập lệnh ~ / gitserve của tôi vào các khóa được ủy quyền bằng cách sử dụng perl. Cá nhân, tôi thích giữ nó trong một kịch bản riêng biệt.
Neil Mayhew

1
Tôi hiểu, tôi chỉ thêm nó làm tài liệu tham khảo.
Tim

Bạn đã cài đặt shell nào cho người dùng trong cấu hình này? /bin/bash?
M-Pixel

33

Tôi có thể sử dụng thành công git-shell trực tiếp trong tệp ủy quyền mà không cần sử dụng tập lệnh bổ sung.

Điều quan trọng là thêm \"xung quanh biến env.

Đã thử nghiệm trong rrc6 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 đó là câu trả lời đúng, xem svnweb.freebsd.org/base/head/crypto/openssh/ mẹo
Tino

2
Cá nhân, tôi sẽ đưa ra con đường đầy đủ git-shell, nhưng đó có thể chỉ là hoang tưởng.
Ulrich Schwarz

Có ai tìm thấy một cách để hạn chế thư mục mà nó có quyền truy cập không? Tôi thấy rằng tôi có thể cd vào một thư mục trước khi thực hiện git-shell, nhưng git-shell cho phép ".." và các đường dẫn tuyệt đối.
yokto

5

Giải pháp của Grawity có thể dễ dàng được sửa đổi để hoạt động bằng cách thay thế dòng

        exec $SSH_ORIGINAL_COMMAND

với dòng

        git-shell -c "$SSH_ORIGINAL_COMMAND"

Các trích dẫn quan tâm đến các vấn đề được báo cáo ở trên và thay thế exec bằng git-shell có vẻ an toàn hơn một chút.


4

git-shellđược thiết kế để được sử dụng như một vỏ đăng nhập, để nó sẽ nhận -c "originalcommand"làm đối số. Điều này không xảy ra với "các lệnh bắt buộc" trong OpenSSH; thay vào đó, lệnh bắt buộc được truyền cho shell được cấu hình.

Những gì bạn có thể làm là viết một kịch bản kiểm tra $SSH_ORIGINAL_COMMANDvà thực thi nó. Ví dụ trong bash :

#!/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: git-shell (1) cho biết các lệnh là git <cmd>, phải không git-<cmd>?
grawity

Hmm ... Tôi đã thực hiện thay đổi đó theo những gì tôi thấy khi tôi chạy nó. Với cả tập lệnh bash và tập lệnh ruby, tôi thấy "git-receive-pack" là lệnh. Trích dẫn từ man git-shell(git 1.7.3.4) của tôi: Hiện tại, chỉ có bốn lệnh được phép gọi, git-receive-pack git-upload-pack và git-upload-archive với một đối số bắt buộc hoặc máy chủ cvs (để gọi git -cvsserver).
Matt Connolly

định dạng không hoạt động trong các bình luận :(
Matt Connolly

1
Điều này không phù hợp với tôi, bởi vì ứng dụng khách git của tôi (1.7.5.4) gửi tên repo trong các dấu ngoặc đơn, có lẽ vì nó dự kiến ​​sẽ có toàn bộ dòng lệnh được giải thích bởi một trình bao. Người thực hiện $ SSH_ORIGINAL_COMMAND sau đó chuyển các dấu ngoặc đơn trên cho git-receive-pack, v.v ... do đó không tìm thấy kho lưu trữ.
Neil Mayhew

Cảm ơn các giải pháp, grawity, nhưng nó không hoạt động đối với tôi, vì lý do tương tự mà đã được báo cáo bởi Neil Mayhew ... phiên bản 1.7.x của tôi git cũng gửi tên repo trong dấu ngoặc kép duy nhất, cuối cùng gây ra $SSH_ORIGINAL_COMMANDđược không hợp lệ và gây git-shellra lỗi :-(
pvandenberk

1

Tôi không thể làm cho giải pháp của grawity hoạt động với cùng lý do đã được báo cáo bởi Neil Mayhew (tức là các trích dẫn duy nhất được gửi bởi khách hàng git gây ra không hợp lệ $SSH_ORIGINAL_COMMAND- Tôi đang sử dụng git v1.7.x)

Tuy nhiên, giải pháp sau đây được thực hiện bởi @moocode chỉ hoạt động:

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

Ruby FTW! :-)


1

Để đầy đủ và vì câu hỏi ban đầu không xác định rằng cùng một tài khoản phải có thể sử dụng được cho những thứ không phải là git, nên câu trả lời rõ ràng là sử dụng git-shellvì nó được thiết kế để sử dụng: đặt nó làm vỏ đăng nhập (nghĩa là với usermod, trong /etc/passwd) cho người dùng ssh đó.

Nếu bạn có một tài khoản người dùng mà bạn muốn sử dụng hai cách:

  • khi kết nối với xác thực khóa, chỉ sử dụng cho git
  • khi kết nối với xác thực mật khẩu hoặc sử dụng khóa riêng khác, hãy cung cấp toàn bộ vỏ

... Sau đó, các câu trả lời khác trong chủ đề này được áp dụng. Nhưng nếu bạn có đủ khả năng để phân bổ một người dùng riêng cho git, thì đặt shell của nó git-shelllà cách đơn giản nhất để hạn chế nó, và an toàn hơn một chút vì nó không yêu cầu các kịch bản shell bổ sung.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.