Você pode especificar git-shell em .ssh / authorized_keys para restringir o acesso a somente comandos git via ssh?

36

Eu gostaria de poder usar uma chave ssh para autenticação, mas ainda restringir os comandos que podem ser executados através do túnel ssh.

Com o Subversion, eu consegui isso usando um arquivo .ssh / authorized_keys como:

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

Eu tentei isso com "/ usr / bin / git-shell" no comando, mas acabei de receber a velha mensagem de erro fatal: What do you think I am? A shell? .

    
por Matt Connolly 21.06.2011 / 05:50

6 respostas

30

O seguinte funciona para mim.

Em ~/.ssh/authorized_keys :

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

No script ~/gitserve :

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

Observe que, se você colocar gitserve em outro lugar que não seja o diretório inicial, será necessário ajustar o parâmetro command="./gitserve" em authorized_keys .

    
por 06.10.2011 / 17:55
32

Eu pude usar o git-shell diretamente no arquivo authorizedKeys sem usar um script adicional.

A chave é adicionar \" em torno da variável env.

Testado em 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...
    
por 04.07.2012 / 17:32
5

A solução do Grawity pode ser facilmente modificada para funcionar substituindo a linha

        exec $SSH_ORIGINAL_COMMAND

com a linha

        git-shell -c "$SSH_ORIGINAL_COMMAND"

As citações cuidam dos problemas relatados acima, e substituir exec por git-shell parece um pouco mais seguro.

    
por 05.11.2013 / 00:44
4

git-shell foi projetado para ser usado como um shell de login, de modo que receberia -c "originalcommand" como argumentos. Isso não acontece com "comandos forçados" no OpenSSH; em vez disso, o comando forçado é passado para o shell configurado.

O que você pode fazer é escrever um script que verifique $SSH_ORIGINAL_COMMAND e o execute. Exemplo em 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
    
por 21.06.2011 / 21:47
1

Não consegui que a solução do Grawity funcionasse pelo mesmo motivo que foi relatado por Neil Mayhew (ou seja, as aspas simples enviadas pelo cliente git causando uma $SSH_ORIGINAL_COMMAND inválida - estou usando git v1.7.x )

No entanto, a seguinte solução implementada por @moocode apenas funciona:

link

Ruby FTW! : -)

    
por 14.10.2011 / 01:42
1

Para completar, e desde que a pergunta original não especificou que a mesma conta tinha que ser usada para coisas não-git, a resposta óbvia é usar git-shell como foi projetada para ser usada: configurá-la como shell de login (ou seja, com usermod , em /etc/passwd ) para esse usuário ssh.

Se você tiver uma única conta de usuário que queira usar de duas maneiras:

  • ao se conectar com autenticação de chave, use somente para git
  • ao se conectar com a autenticação por senha ou usando uma chave privada diferente, forneça um shell completo

... então as outras respostas neste tópico se aplicam. Mas se você puder atribuir um usuário separado para git, então configurar seu shell para git-shell é a maneira mais simples de restringi-lo, e é um pouco mais seguro, já que não requer scripts de shell adicionais.

    
por 19.12.2015 / 00:19

Tags