Configurando um repositório git remoto compartilhado sem privilégios de root (resolvidos) usando chaves ssh para gerenciar o acesso por usuário?

3

Primeiro explicarei minha configuração. Eu estou trabalhando em um sistema não auto-gerenciado em que eu tenho uma conta sem root / privilégios elevados. Neste sistema eu quero compartilhar vários repositórios git para diferentes grupos de pessoas. As ações tomadas para realizar um repositório git compartilhado seguem abaixo. Eu os dividi em comandos executados em um terminal bash no sistema REMOTE e LOCAL. ps: substitua quaisquer variáveis envolvidas por delimitadores < e > com valores apropriados.

----------- REMOTE (meu sistema): -----------

bash-4.2> mkdir -p <path>/<to>/project.git
bash-4.2> cd <path>/<to>/project.git
bash-4.2> git init --bare
bash-4.2> ssh-keygen -t rsa -f ~/.ssh/gitkey_rsa -N <password>
bash-4.2> echo "command=\"git-shell -c \\"\$SSH_ORIGINAL_COMMAND\\"\",
    no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-pty \
    $(cat ~/.ssh/gitkey_rsa.pub)" >> ~/.ssh/authorized_keys

Estes comandos fazem o seguinte:

  1. crie um repositório git
  2. gerar uma chave ssh
  3. adicione a chave a authorized_keys com restrições pré-definidas

----------- LOCAL (outros usuários) -----------

bash-4.2> mv <path>/<to>/gitkey_rsa ~/.ssh
bash-4.2> echo -e "Host gitserver\n\
    \tHostName <remote server>\n\
    \tUser <remote user>\n\
    \tIdentityFile ~/.ssh/gitkey_rsa" >> ~/.ssh/config
bash-4.2> git clone gitserver:/home/<remote user>/<path>/<to>/project.git

Estes comandos fazem o seguinte:

  1. coloque a chave rsa no diretório ~ / .ssh
  2. adicione uma regra ao ~ / .ssh / config especificando o nome do host 'gitserver' com chave
  3. recuperar o conteúdo do repositório

Os comandos usados são baseados em restringe o acesso somente ao git . Usando a chave restrita, um usuário só tem permissão para executar comandos git. O problema é que o usuário também tem permissão para acessar todos os repositórios git no sistema remoto. Gostaria de restringir o acesso a apenas um repositório por chave ssh. Em outras palavras, gostaria de restringir o acesso a uma pasta, contendo o repositório git, através de restrições de chave ssh.

As soluções que encontrei até agora são: acessa apenas determinados diretórios através do ssh e Restringe o usuário do SSH a uma pasta . Eles também querem que você instale um servidor (S) FTP, WebDAV ou crie um novo usuário com privilégios restritos. Isso não é o que estou procurando, pois requer privilégios de root. Devido ao fato de que os comandos podem ser restritos com restrições de chave ssh, não há uma maneira de restringir os privilégios de acesso também?

Cumprimentos

    
por gospes 25.10.2013 / 15:28

1 resposta

1

Solução possível :

Como eu estava digitando a pergunta, eu encontrei uma solução. Mas parece-me que deve haver uma solução mais simples e mais segura para esse problema. O que eu fiz foi alterar o valor de 'command' no arquivo authorized_keys para:

command="~/somescript.sh" 

E 'somescript.sh' contém:

#!/bin/bash
ALLOW=(
    '/home/<user>/repository1.git'
    '/home/<user>/repository2.git'
)

case $SSH_ORIGINAL_COMMAND in
    "git-receive-pack"*|"git-upload-pack"*|"git-upload-archive"*)
        GITPATH=$(echo $SSH_ORIGINAL_COMMAND | sed -r "s:.*'([^']*)'.*::g")
        ALLOWED="false"
        for ((i=0; i < ${#ALLOW[@]}; i++)); do
            if [ "${ALLOW[$i]}" == "$GITPATH" ]; then
                ALLOWED="true"; break;
            fi
        done

        if [ "$ALLOWED" == "true" ]; then
            eval "git-shell -c \"$SSH_ORIGINAL_COMMAND\""
        else
            echo "[ERROR] ACCESS DENIED" >&2
            exit 1
        fi
        ;;
    *)
        echo "[ERROR] Only git commands are allowed!" >&2
        exit 1
        ;;
esac

No script, estou aproveitando o fato de que os comandos git clone, git push e git pull produzem no lado REMOTE:

git-upload-pack '<path>/<to>/<repository>', or
git-receive-pack '<path>/<to>/<repository>'

Eu especifico repositórios na variável ALLOW que podem ser acessados através da chave ssh que usa o script, e simplesmente os compara com o caminho especificado no comando git emitido (variável GITPATH). Há um risco de segurança, quando vários comandos git são emitidos em uma linha. Se o comando contiver pelo menos uma menção de um repositório permitido, ele executará o comando inteiro. Alguma sugestão sobre melhoria?

    
por 25.10.2013 / 16:36