Chapters ▾ 2nd Edition

4.4 Git no Servidor - Configurando o Servidor

Configurando o Servidor

Vamos percorrer a configuração do acesso SSH no lado do servidor. Neste exemplo, você usará o método authorized_keys para autenticar os seus usuários. Também presumimos que você esteja executando uma distribuição Linux padrão como o Ubuntu.

Note

Grande parte do que é descrito aqui pode ser automatizado usando o comando ssh-copy-id, em vez de copiar e instalar manualmente chaves públicas.

Primeiro, você cria uma conta de usuário git e um diretório .ssh para esse usuário.

$ sudo adduser git
$ su git
$ cd
$ mkdir .ssh && chmod 700 .ssh
$ touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys

Em seguida, você precisa adicionar algumas chaves públicas SSH de desenvolvedor ao arquivo authorized_keys para o usuário git. Vamos supor que você tenha algumas chaves públicas confiáveis e as tenha salvo em arquivos temporários. Novamente, as chaves públicas se parecem com algo assim:

$ cat /tmp/id_rsa.john.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCB007n/ww+ouN4gSLKssMxXnBOvf9LGt4L
ojG6rs6hPB09j9R/T17/x4lhJA0F3FR1rP6kYBRsWj2aThGw6HXLm9/5zytK6Ztg3RPKK+4k
Yjh6541NYsnEAZuXz0jTTyAUfrtU3Z5E003C4oxOj6H0rfIF1kKI9MAQLMdpGW1GYEIgS9Ez
Sdfd8AcCIicTDWbqLAcU4UpkaX8KyGlLwsNuuGztobF8m72ALC/nLF6JLtPofwFBlgc+myiv
O7TCUSBdLQlgMVOFq1I2uPWQOkOWQAHukEOmfjy2jctxSDBQ220ymjaNsHT4kgtZg2AYYgPq
dAv8JggJICUvax2T9va5 gsg-keypair

Basta anexá-las ao arquivo authorized_keys do usuário git em seu diretório .ssh:

$ cat /tmp/id_rsa.john.pub >> ~/.ssh/authorized_keys
$ cat /tmp/id_rsa.josie.pub >> ~/.ssh/authorized_keys
$ cat /tmp/id_rsa.jessica.pub >> ~/.ssh/authorized_keys

Agora, você pode configurar um repositório vazio para eles executando git init com a opção --bare, que inicializa o repositório sem um diretório de trabalho:

$ cd /srv/git
$ mkdir project.git
$ cd project.git
$ git init --bare
Initialized empty Git repository in /srv/git/project.git/

Então, John, Josie ou Jessica podem fazer o push da primeira versão do projeto deles para esse repositório, adicionando-o como remoto e fazendo o push de um branch. Observe que alguém deve acessar o shell da máquina e criar um repositório nu toda vez que você quiser adicionar um projeto. Vamos usar gitserver como o hostname do servidor no qual você configurou o seu usuário git e repositório. Se você o estiver executando internamente e configurar o DNS do gitserver para apontar para esse servidor, poderá usar os comandos da mesma forma (assumindo que myproject é um projeto existente com arquivos nele):

# on John's computer
$ cd myproject
$ git init
$ git add .
$ git commit -m 'Initial commit'
$ git remote add origin git@gitserver:/srv/git/project.git
$ git push origin master

Neste ponto, os outros podem clonar e fazer o push das alterações de volta com a mesma facilidade:

$ git clone git@gitserver:/srv/git/project.git
$ cd project
$ vim README
$ git commit -am 'Fix for README file'
$ git push origin master

Com este método, você pode colocar um servidor Git de leitura/gravação em funcionamento rapidamente para um punhado de desenvolvedores.

Você deve notar que atualmente todos esses usuários também podem logar no servidor e obter um shell como o usuário git. Se você quiser restringir isso, terá que alterar o shell para outra coisa no arquivo /etc/passwd.

Você pode restringir facilmente a conta de usuário git a apenas atividades relacionadas ao Git com uma ferramenta de shell limitado chamada git-shell que vem com o Git. Se você definir isso como o login shell da conta de usuário git, então essa conta não poderá ter acesso de shell normal ao seu servidor. Para usar isso, especifique git-shell em vez de bash ou csh para o login shell dessa conta. Para fazer isso, você deve primeiro adicionar o nome do caminho completo (pathname) do comando git-shell em /etc/shells, se ele ainda não estiver lá:

$ cat /etc/shells   # see if git-shell is already in there. If not...
$ which git-shell   # make sure git-shell is installed on your system.
$ sudo -e /etc/shells  # and add the path to git-shell from last command

Agora você pode editar o shell para um usuário usando chsh <username> -s <shell>:

$ sudo chsh git -s $(which git-shell)

Agora, o usuário git ainda pode usar a conexão SSH para fazer o push e o pull de repositórios Git, mas não pode usar o shell na máquina. Se você tentar, verá uma rejeição de login como esta:

$ ssh git@gitserver
fatal: Interactive git shell is not enabled.
hint: ~/git-shell-commands should exist and have read and execute access.
Connection to gitserver closed.

Neste ponto, os usuários ainda conseguem usar o encaminhamento de porta SSH para acessar qualquer host que o servidor git consiga alcançar. Se você quiser evitar isso, pode editar o arquivo authorized_keys e adicionar as seguintes opções antes de cada chave que gostaria de restringir:

no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty

O resultado deve ficar assim:

$ cat ~/.ssh/authorized_keys
no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa
AAAAB3NzaC1yc2EAAAADAQABAAABAQCB007n/ww+ouN4gSLKssMxXnBOvf9LGt4LojG6rs6h
PB09j9R/T17/x4lhJA0F3FR1rP6kYBRsWj2aThGw6HXLm9/5zytK6Ztg3RPKK+4kYjh6541N
YsnEAZuXz0jTTyAUfrtU3Z5E003C4oxOj6H0rfIF1kKI9MAQLMdpGW1GYEIgS9EzSdfd8AcC
IicTDWbqLAcU4UpkaX8KyGlLwsNuuGztobF8m72ALC/nLF6JLtPofwFBlgc+myivO7TCUSBd
LQlgMVOFq1I2uPWQOkOWQAHukEOmfjy2jctxSDBQ220ymjaNsHT4kgtZg2AYYgPqdAv8JggJ
ICUvax2T9va5 gsg-keypair

no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa
AAAAB3NzaC1yc2EAAAADAQABAAABAQDEwENNMomTboYI+LJieaAY16qiXiH3wuvENhBG...

Agora, os comandos de rede do Git ainda funcionarão perfeitamente, mas os usuários não conseguirão obter um shell. Como a saída (output) indica, você também pode configurar um diretório no diretório inicial (home) do usuário git que personaliza um pouco o comando git-shell. Por exemplo, você pode restringir os comandos Git que o servidor aceitará ou pode personalizar a mensagem que os usuários veem se tentarem fazer SSH dessa forma. Execute git help shell para obter mais informações sobre a personalização do shell.