ssh를 통해 git 명령에만 액세스를 제한하기 위해 .ssh / authorized_keys에 git-shell을 지정할 수 있습니까?


37

인증에 ssh 키를 사용할 수 있기를 원하지만 ssh 터널을 통해 실행할 수있는 명령을 계속 제한하고 싶습니다.

Subversion에서는 다음과 같은 .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.


빙고! 이것은 내가 달성하고자했던 것과 똑같이 작동합니다! 감사.
매트 코놀리

SO stackoverflow.com/questions/5871652/ 에 관한이 관련 게시물에서 그들은 또 다른 해결책을 제시합니다. joey.kitenet.net/blog/entry/locking_down_ssh_authorized_keys
Tim

1
@Tim 이것은 본질적으로 동일한 솔루션이지만 perl을 사용하여 ~ / gitserve 스크립트의 내용을 인증 된 키로 압축합니다. 개인적으로 나는 별도의 스크립트로 유지하는 것을 선호합니다.
Neil Mayhew

1
나는 단지 그것을 참조로 추가했다는 것을 이해합니다.
Tim

이 구성에서 사용자가 어떤 쉘을 설정 했습니까? /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...


2
개인적으로에 대한 전체 경로를 제시 git-shell하지만 그것은 편집증 일 수 있습니다.
Ulrich Schwarz

누구든지 액세스 할 수있는 디렉토리를 제한하는 방법을 찾았습니까? git-shell을 실행하기 전에 디렉토리에 CD를 넣을 수는 있지만 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그것을 확인 하고 실행 하는 스크립트를 작성하는 것입니다. 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) 은 명령이 git <cmd>아니라고 말합니다 git-<cmd>.
grawity

흠 ... 나는 그것을 실행할 때 본 것에 따라 변경했습니다. bash 스크립트와 ruby ​​스크립트를 모두 사용하여 명령으로 "git-receive-pack"을 보았습니다. 내 인용 man git-shell(git 1.7.3.4) : 현재 단일 명령 인수가있는 git-receive-pack git-upload-pack 및 git-upload-archive 또는 cvs 서버 (git를 호출하는)는 네 가지 명령 만 호출 할 수 있습니다 -cvsserver).
매트 코놀리

주석에서 서식이 작동하지 않습니다 :(
Matt Connolly

1
내 자식 클라이언트 (1.7.5.4)가 repo 이름을 작은 따옴표로 보내므로 쉘에서 전체 명령 줄을 해석해야하기 때문에 이것은 작동하지 않습니다. 그런 다음 exec $ SSH_ORIGINAL_COMMAND는 작은 따옴표를 git-receive-pack 등으로 전달하므로 저장소를 찾지 못합니다.
Neil Mayhew

해결책, grawity에 감사드립니다. 그러나 Neil Mayhew 가보고 한 것과 같은 이유로 나를 위해 작동하지 않습니다 ... 내 1.7.x 버전의 git도 repo 이름을 작은 따옴표로 보내 궁극적 $SSH_ORIGINAL_COMMAND으로 git-shell
부적절하고 부딪히는


1

완성도를 위해, 그리고 이후 원래의 질문이 동일한 계정이 아닌 자식 것들에 대한 가능한 수 있다고 지정하지 않은, 명백한 대답은 사용하는 것입니다 git-shell그것을 사용할 수 있도록 설계되었다 같이, 즉와 (로그인 쉘로 설정 usermod, 에서 /etc/passwd) 그 SSH 사용자를위한.

두 가지 방법으로 사용하려는 단일 사용자 계정이있는 경우 :

  • 키 인증으로 연결하는 경우 git에만 사용하십시오.
  • 비밀번호 인증으로 연결하거나 다른 개인 키를 사용하는 경우 전체 쉘을 제공하십시오.

...이 스레드의 다른 답변이 적용됩니다. 그러나 git에 별도의 사용자를 할당 할 수 있다면 쉘을 설정하는 git-shell것이 가장 간단한 방법이며 추가 쉘 스크립트가 필요하지 않으므로 약간 더 안전합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.