Configurando Subversion

O subversion (SVN) é um ótimo controlador de versões, não só para programação, mas para imagens, vídeos, arquivos texto, binários e todo tipo de arquivo digital que for preciso um versionamento.

[ Hits: 186.662 ]

Por: Ricardo Brito do Nascimento em 28/05/2008 | Blog: http://brito.blog.incolume.com.br


Customizando o servidor SVN



4. svnserve, um servidor customizado

O programa svnserve é um servidor leve, capaz de comunicar-se com clientes através de TCP/IP utilizando um protocolo customizado. Clientes podem contatar um servidor svnserve através de URLs iniciadas por svn:// ou svn+ssh://. Neste tópico iremos explorar as diferentes maneiras de executar o svnserve, como os clientes se autenticam com esse servidor e como configurar controles de acessos apropriados para seus repositórios.

4.1. Iniciando o servidor

Há algumas maneiras diferentes de iniciar o programa svnserve. Se iniciado sem opções, somente será mostrado uma mensagem de ajuda. No entanto, se pretendemos que o inetd inicie o processo, então podemos passar a opção -i (--inetd):

$ svnserve -i ( success ( 1 2 ( ANONYMOUS ) ( edit-pipeline ) ) )

Quando iniciado com a opção --inetd, o svnserve espera comunicar-se com um cliente Subversion através da entrada e saída padrão (stdin e stout) utilizando um protocolo customizado, um comportamento padrão para programas executados via inetd. A IANA (Internet Assigned Numbers Authority) reservou a porta 3690 para o protocolo Subversion, então em um sistema UNIX podemos adicionar as seguintes linhas ao arquivo /etc/services (se já não estiverem lá):

svn 3690/tcp # Subversion svn 3690/udp # Subversion

E se o o sistema está usando um daemon inetd UNIX clássico, podemos adicionar esta linha ao /etc/inetd.conf:

svn stream tcp nowait svnowner /usr/bin/svnserve svnserve -i

Certifique que o usuário "svnowner" tem permissões apropriadas para acesso aos repositórios. Agora, quando uma conexão de um cliente chegar ao servidor na porta 3690, o inetd irá iniciar um processo do svnserve para atendê-la.

Uma segunda opção é rodar o svnserve como um "daemon" standalone. Para tal, utilize a opção -d:

$ svnserve -d

(svnserve agora está rodando, escutando a porta 3690)

Ao rodar o svnserve em modo daemon, você pode usar a opção --listen-port e --listen-host para customizar a porta e hostname nos quais o "bind" será efetuado.

Há ainda uma terceira maneira para invocar o svnserve, em modo "tunelamento", com a opção -t. Este modo assume que um programa de serviço remoto como RSH ou SSH autenticou com sucesso um usuário e está invocando um processo svnserve privado como aquele usuário.

O programa svnserve atua de maneira normal, assumindo que o tráfego está sendo automaticamente redirecionado por algum tunelamento para o cliente. Quando o svnserve for invocado por um tunelamento, como descrito, certifique-se de que o usuário autenticado tem permissão total de leitura e escrita no repositório.

É essencialmente o mesmo procedimento de um usuário local acessando o repositório através do método file:///. /> Autenticação e autorização integrada Quando um cliente se conecta a um processo svnserve, as seguintes situações acontecem:
  • O cliente seleciona um repositório específico;
  • O servidor processa o arquivo conf/svnserve.conf e aplica quaisquer políticas de autenticação e autorização lá definidas;
  • Dependendo da situação e das políticas de autorização:
    1. o cliente pode ser autorizado a fazer requisições anonimamente, sem autenticação;
    2. o cliente deverá autenticar-se;
    3. se operando em modo de tunelamento, o cliente irá declarar que já foi autenticado externamente.

Até o momento, o svnserve só é compatível com o método de autenticação CRAM-MD5. Essencialmente, o servidor envia um pacote de dados ao cliente, que usa um algoritmo de hash MD5 para criar uma assinatura dos dados e da senha combinados, e então a envia como resposta. O servidor calcula a assinatura em conjunto com a senha local para verificar que o resultado é idêntico. Em nenhum momento a senha do usuário atravessa a rede.

Obviamente, também é possível que o cliente seja autenticado externamente através de um agente de tunelamento, como o SSH. Neste caso, o servidor simplesmente examina o usuário com o qual está executando e o utiliza para acessar o repositório.

Como você já deve ter desconfiado, o arquivo svnserve.conf de um repositório é o mecanismo central de controle de autenticação e autorização. O arquivo tem o seguinte formato: seções são identificadas por colchetes - [], comentários são iniciados por cerquilha - #, e cada seção contém variáveis que podem ser ajustadas - variável = valor.

4.2. Criando um arquivo e domínio 'users'

Por ora, a seção [general] do arquivo svnserve.conf contém todas as variáveis de nosso interesse. Defina inicialmente um arquivo contendo usuários e senhas, bem como um domínio de autenticação:

[general]
password-db = userfile
realm = domínio exemplo

O domínio é um nome definido pelo administrador que indica aos clientes o domínio de autenticação ao qual estão se conectando; o cliente Subversion mostra esse domínio no prompt de autenticação, e o utiliza como uma chave (juntamente com o hostname do servidor e a porta) para fazer cache de credenciais no disco. A variável password-db aponta para um arquivo em separado que contém uma lista de usuários e senhas, utilizando o mesmo formato. Por exemplo:

[users]
joao = foopassword
maria = barpassword

O valor de password-db pode ser qualquer caminho absoluto ou relativo de diretórios até o arquivo users. Para muitos administradores, é conveniente manter o arquivo dentro do diretório conf/ do repositório, juntamente com svnserve.conf.

Por outro lado, é possível que você deseje que dois ou mais repositórios compartilhem o mesmo arquivo users, caso em que o arquivo provavelmente deveria ficar em um local de acesso mais irrestrito. Os repositórios compartilhando o arquivo users poderiam ainda ser configurados para ter o mesmo domínio, já que uma lista de usuários define essencialmente um domínio.

Qualquer que seja o diretório onde se encontra o arquivo, certifique-se de que as permissões de leitura e escrita estão ajustadas corretamente.

4.3. Ajuste de controle de acesso

Há ainda duas variáveis interessantes a serem ajustadas em svnserve.conf: elas determinam o que usuários não-autenticados (anônimos) e usuários autenticados poderão fazer no repositório. As variáveis anon-access e auth-access podem ser ajustadas para os valores none, read ou write. Ajustando o valor para none restringe qualquer tipo de acesso; read permite acesso somente de leitura e write permite acesso completo de leitura e escrita ao repositório. Por exemplo:

[general]
password-db = userfile
realm = domínio exemplo

# usuários anônimos podem apenas ler do repositório
anon-access = read

# usuários autenticados podem ler e escrever
auth-access = write

Essas configurações de exemplo são, de fato, os valores padronizados para as variáveis, caso não sejam definidas. Se você deseja ser ainda mais conservativo, você pode bloquear acesso anônimo por completo:

[general]
password-db = userfile
realm = domínio exemplo

# usuários anônimos não são autorizados
anon-access = none

# usuários autenticados podem ler e escrever
auth-access = write

Observe que o svnserve suporta apenas controle de acesso por usuário. Um usuário pode ou ter acesso universal de leitura e escrita, acesso universal de leitura ou nenhum acesso. Não há controle detalhado sobre diretórios específicos do repositório, o que, para muitos projetos, é suficiente e adequado. No entanto, se você necessita de controle de acesso por diretório, será necessário utilizar o mod_authz_svn do Apache (a ser visto no tópico seguinte), ou utilizar um hook pre-commit para controlar acesso de escrita.

O controle de acesso via tunelamento é bastante semelhante ao descrito anteriormente, mas, dada a especificidade do tema, deixamos aqui o link do SVN Book que explica esse tópico em maior detalhe aos alunos interessados nesse tipo de configuração:
Página anterior     Próxima página

Páginas do artigo
   1. Como criar e usar um servidor Subversion (SVN) passo a passo
   2. Customizando o servidor SVN
   3. Configurando o apache para conexões http com svn
   4. Gerenciando projetos e arquivos no svn
   5. Dicas adicionais e bibliografia
Outros artigos deste autor

Instalação Plone 2.5.5 com módulos customizados

Encapsulamento de Apache com chroot

Proteção utilizando fail2ban contra ataques do tipo

Conexão com chaves assimétricas sem uso de senha em servidor sshd

Configurando proxy no shell

Leitura recomendada

Bind – Servidor DNS no OpenSOLARIS

Como utilizar o repositório SlackBuilds

Atualizando o navegador Firefox para a versão 4.0

Nagios - O seu gerenciador de redes

Instalando o X-Money no Linux

  
Comentários
[1] Comentário enviado por joaomc em 29/05/2008 - 09:10h

Uma boa pedida para quem quiser instalar um servidor Subversion no Windows é usar o Collabnet Subversion Server, que já vem empacotado com tudo o que precisa. Funciona muito bem.
Eu gosto muito de usar o Git-SVN para interagir com repositórios SVN. Vale a pena aprender.

[2] Comentário enviado por Bruno Faria em 29/05/2008 - 14:11h

Olá,
muito bom o artigo, ótimo mesmo.
Porém, qual seria a diferença entre CVS e SVN?

[3] Comentário enviado por gjr_rj em 29/05/2008 - 18:57h

Gostei do artigo, bom mesmo !

[4] Comentário enviado por leobragatti em 30/05/2008 - 12:00h

cara, excelente artigo
ja implementei aqui e vou começar a fazer os trabalho de faculdade com os caras da faculdade usando isso :)

Muito obrigado pelo artigo
abraços

[5] Comentário enviado por joaomc em 02/06/2008 - 09:33h

@brunoh,

O SVN foi basicamente construído para substituir o CVS. Entre as vantagens, podemos citar os commits atômicos com changesets (conjuntos de mudanças): As alterações feitas no repositório são enviadas em bloco. No CVS, as alterações são feitas por arquivo. Assim, tem-se um histórico mais claro e limpo das modificações.

[6] Comentário enviado por gokden em 13/10/2008 - 18:36h

pessoal... eu uso o openSUSE 11
e ocorre este erro aqui..

httpd2: Syntax error on line 180 of /etc/apache2/httpd.conf: Syntax error on line 102 of /etc/apache2/default-server.conf: Syntax error on line 2 of /etc/apache2/conf.d/subversion.conf: Cannot load /srv/www/modules/mod_dav_svn.so into server: /srv/www/modules/mod_dav_svn.so: cannot open shared object file: No such file or directory

alguem sabe o pq ??
me parece que ele não encontrou o mod_dav_svn.so =D
alguem jah teve este problema ??

[7] Comentário enviado por guiteodasilva em 15/10/2008 - 16:56h

Fala ai galera,
Seguite instalei o subversion no meu servidor (ubuntu 8.04) e depois o subclipse no eclipse da minha máquina pessoal(ubuntu 8.04).
Conecto tranquilo no repositorio consigo dar commit,update, checkout.

Os aquivos transferidos para o repositorio no servidor pela interface do eclipse aparecem tranquilo tranquilo consigo abrir e tudo mais. So que, quando entro no servidor e entro no repositorio e mando listar os arquivo, os mesmos não se encontram la. executo o locate e nada também. Ja tentei de tudo, me ajudem!!!

Valew.

[8] Comentário enviado por gokden em 04/11/2008 - 15:56h

oi denovo gente...
alguem sabe se tem algum jeito onde eu possa dar privilégios separadas de usuário para usuário ?
exemplo:
o user a pode vizualizar o arquivo a
o user b pode vizualizar o arquivo b
mas o user a nao ve o arquivo b nem o user b ve o arquivo a =D

deu pra intende ??

grato....

[9] Comentário enviado por parrera em 09/11/2009 - 10:45h

Bom demais este tutorial, mas o seguinte, uso o svnserve como meu servidor que roda em uma máquina que usa OpenSUSE 11.1, seguinte, na minha rede interna o svn está funcionando normalmente, mas agora gostaria de compartilhar nosso repositorio com uma outra rede, tem como fazer isso usando o svnserve ou é preciso usar o apache?
Obs: Quero que outra rede passe a comunicar com nosso repositorio, para cliente usamos o tortoiseSVN(windows), tem como isso usando o svnserve? Existe algum tutorial para isso?Alguma dica?Obrigado à todos

[10] Comentário enviado por klebervirgilio em 22/01/2010 - 13:07h

M diga, como fica as trunk/branches/ tags????

[11] Comentário enviado por esardenberg em 16/03/2012 - 15:21h

Amigos

Preciso renomear o nome de um repositorio já em utilização. Somente renomeio a pasta criada?

Obrigado


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts