GIT, SSH e GIT-SHELL

5

Estou tentando configurar um servidor seguro de repositório git usando ssh-keys e git-shell. Como nosso banco de dados de usuários é armazenado em um diretório LDAP central, não posso alterar o shell padrão dos usuários para o git-shell, então tentei colocar o comando git-shell na chave pública no arquivo authorized_users assim:

command="git-shell -c $SSH_ORIGINAL_COMMAND" ssh-dss AAAAB3NzaC1kc3...

No entanto, o git-shell não permite nem mesmo clonar o repositório:

    dhcp202:git-ws frank$ git clone ssh://gitserver/var/repos/git/myrepo/
    Cloning into myrepo...
    fatal: What do you think I am? A shell?
    fatal: The remote end hung up unexpectedly

Qualquer ideia apreciada ...

    
por Frank Brenner 23.03.2011 / 12:05

2 respostas

1

Você encontrará um mecanismo semelhante com o gitolite , baseado em ssh e comando forçado .
(incluindo consultas ldap ).
No entanto, não permite shell interativo, que pode ser o seu problema .

O OP Frank Brenner adiciona:

Ah, I figured it out - the command has to be in single quotes. I suppose $SSH_ORIGINAL_COMMAND was getting expanded before git-shell was started.

Isso é confirmado no script de comando forçado do gitolite é um Perl, terminando com:

# ----------------------------------------------------------------------------
#       over to git now
# ----------------------------------------------------------------------------

if ($ENV{REQUEST_URI}) {
    log_it($ENV{REQUEST_URI});
    exec $ENV{GIT_HTTP_BACKEND};
    # the GIT_HTTP_BACKEND env var should be set either by the rc file, or as
    # a SetEnv in the apache config somewhere
}

log_it();

$repo = "'$REPO_BASE/$repo.git'";
exec("git", "shell", "-c", "$verb $repo") unless $verb eq 'git-init';

Observe que a $repo = "'$REPO_BASE/$repo.git'" line: contém aspas simples.

    
por 23.03.2011 / 13:36
2

Eu fiz uma solução usando LDAP, OpenSSH (> 4.9) e git-shell.

O ForceCommand do OpenSSH é perfeito para o trabalho. Considere a seguinte configuração (todos, exceto os administradores, precisam usar o git-shell):

Match group *,!admin    
    ForceCommand /usr/bin/git-shell -c "$SSH_ORIGINAL_COMMAND"

O controle de acesso é definido usando ACL-s e grupos de acesso de novo nome.

setfacl -bR -m default:group:$REPONAME:rwX -m group:$REPONAME:rwX $GITROOT/$REPONAME
setfacl -R -m default:group:$REPONAME-ro:r-X -m group:$REPONAME-ro:r-X $GITROOT/$REPONAME

Não se esqueça de executar o "nscd -i group" após cada alteração.

Andor

    
por 07.04.2011 / 10:37

Tags