terça-feira, 21 de dezembro de 2010

Como Acessar o SVN via HTTP

Este artigo apresenta, de forma resumida, como configurar seu repositório do Subversion para ser acessado usando o protocolo HTTP. Esta configuração é apenas um dos três modos de operação do SVN (mais sobre os outros modos e uma ampla discussão sobre as características, vantagens e desvantagens de cada um encontra-se em nosso outro artigo, aqui. Se o seu caso for aprender a instalar o SVN tunelado por SSH, então veja também este outro artigo aqui). Supõe-se, neste artigo, que o SVN já esteja propriamente instalado e configurado na máquina servidora. Supõe-se que você já tenha um cliente instalado em máquina local, para fins de testes. Caso não saiba instalar um, sugiro consultar nosso outro artigo, aqui.


  • Instalação do Apache

Fazer o SVN ser acessado por HTTP necessita de um servidor Web, já que este protocolo não é o padrão para o SVN. A sua função é colocar-se como intermediário entre o usuário e o repositório versionado, executando, em linhas gerais, as seguintes tarefas:

- Receber as requisições HTTP do cliente;
- Validar o usuário do cliente com base de dados de usuário própria;
- Traduzí-las para o SVN, usando usuário próprio do sistema operacional;
- Coletar as respostas do SVN;
- Traduzí-las de volta para o protocolo HTTP;
- Enviá-las para o cliente.

O servidor web utilizado para tunelar o SVN através do protocolo HTTP é o Apache Web Server 2; o diálogo entre o Apache 2 e o SVN é possível graças a um módulo especial do Apache, o WebDAV. O comando a seguir instala o servidor HTTP e o módulo do webDAV:

apt-get install apache2 libapache2-svn

Após este comando, o Apache 2 será instalado e inicializado, bem como todos os módulos padrão. Após a instalação do módulo do webDAV, ele será automaticamente inicializado. Caso queira se certificar a respeito desta instalação, verifique se surgem as seguintes linhas:

Módulos padrão:
Enabling site default.
Enabling module alias.
Enabling module autoindex.
Enabling module dir.
Enabling module env.
Enabling module mime.
Enabling module negotiation.
Enabling module setenvif.
Enabling module status.
Enabling module auth_basic.
Enabling module deflate.
Enabling module authz_default.
Enabling module authz_user.
Enabling module authz_groupfile.
Enabling module authn_file.
Enabling module authz_host.
Enabling module reqtimeout.

Módulos do webDAV:
Enabling module dav.
Enabling module dav_svn.

Para confirmar quais os módulos estão ativos, basta ler o diretório onde os links simbólicos para os módulos ativos ficam:

# links para os módulos ativos
ls /etc/apache2/mods-enabled/

# todos os módulos instalados
ls /etc/apache2/mods-available/

# onde os arquivos executáveis realmente ficam...
ls /usr/lib/apache2/modules/


  • Configuração do Apache 2

Criação do Arquivo de Senhas

Para que o seu repositório seja acessado com validação de usuário, é preciso que os usuários sejam previamente criados com suas senhas. Caso o seu repositório seja sempre público, este passo se tornará desnecessário.
Os usuários aqui referidos são usuários HTTP, e não usuários do sistema da sua máquina. Estes usuários ficam em um arquivo específico, onde se encontram com suas senhas. Felizmente, o Apache nos fornece uma ferramenta para a criação (e inserção) destes usuários, o htpasswd.
A criação de um arquivo novo, contendo seu primeiro usuário e senha, pode ser feita com o seguinte comando:

htpasswd -c /opt/svnrepos/repo1passwd admin
ou
htpasswd -c /opt/svnrepos/repo1passwd admin [senha]

Onde "admin" pode ser qualquer nome de usuário, e [senha] pode ser qualquer senha. Caso a primeira opção seja digitada, o comando perguntará a senha e pedirá que a repita antes de concluir a execução. Note que a segunda opção armazena a senha no histórico de comandos do shell, então tome cuidado ao usá-la!!
A opção “-c” cria o arquivo de senhas. Sem esta opção, o usuário informado é adicionado ao arquivo referenciado, que já deve existir.
A opção “-d” remove um usuário.

Após o comando, o arquivo passa a existir, com uma linha, onde o nome e a senha do usuário “admin” são separados com o caracter “:”, exatamente como o Linux faz em /etc/passwd. Observe:

cat /opt/svnrepos/repo1passwd
admin:k3ir2JUfTSAr6

Note que a senha está segura e criptografada. Existem opções no htpasswd para que ela não seja criptografada ou para selecionar qual algoritmo dentre os disponíveis deve ser usado em sua criptografia. Mais detalhes sobre o htpasswd pode ser acessado em sua página man ou com o parâmetro “-h”.


  • Configuração do Repositório no Apache

Neste momento, supõe-se que você já tenha um repositório criado no seu sistema de arquivos (tarefa normalmente feita com a ferramenta svnadmin).
Para informar o seu repositório para o Apache, é preciso editar o seguinte arquivo:

vi /etc/apache2/apache2.conf

Neste arquivo, deve-se incluir (em especial, para o bem do administrador de sistemas, no final do arquivo, com um comentário indicando a que veio o bloco de linhas!!), para cada repositório, um conjunto de linhas como este aí embaixo, capaz de informar a localização do repositório e a configuração de acesso ao mesmo:

[Location /repo1]
DAV svn
SVNPath /opt/svnrepos/repo1
AuthType Basic
AuthName "repo1"
AuthUserFile /opt/svnrepos/repo1passwd
Require valid-user
[/Location]

OBS: Substitua os colchetes por sinais de maior e menor, formando a tag corretamente!!

Bom, o que significa isto?? Bem fácil, acompanhe-me:

- Location: É a localização virtual do repositório (no formato de tag, que, para o Apache, recebe o nome de "Contêiner"). No caso acima, ele será acessível pelo endereço "http://[servidor]/repo1";
- DAV svn: Usar o módulo dav, direcionado para o SVN;
- SVNPath: Caminho real do repositório no sistema de arquivos;
- AuthType Basic: Tipo de autenticação. Sendo Basic, o acesso é permitido apenas a usuário devidamente autenticados. Note que esta autenticação não garante encriptação na hora de fornecer os dados sensíveis de usuário e senha pela rede. Dentro de uma rede local, isto pode não ter o menor problema. Porém, não faça assim se o seu repositório é visível pela internet!! Se este for o caso, então cogite usar uma chave de encriptação e proteger a conexão inteira por SSL, utilizando, na verdade, o protocolo HTTPS. Verifique os links de nossos artigos sobre o assunto deixados na conclusão deste artigo...
- AuthName: Nome de identificação do repositório, que aparecerá na janela de login do usuário e no nome do repositório, após o projeto ser baixado via checkout;
- AuthUserFile: Define qual o arquivo de senhas de usuários HTTP, criado pela ferramenta htpasswd, do Apache, conforme mostrado mais acima.
- Require valid-user: Exige login e senha de um usuário válido, independente da ação requerida.

Concluída a configuração, podemos finalmente reiniciar o Apache:

/etc/init.d/apache2 restart

Note que o Apache faz todo o acesso a disco a partir de seu usuário próprio (em geral, o www-data). Assim, é preciso que o seu repositório do SVN, assim como o diretório “db” e todo o conteúdo deste estejam acessíveis a este usuário. Normalmente, basta digitar os seguintes comandos:

Trocando o usuário nos arquivos e diretórios necessários:
chown www-data /opt/svnrepos/repo1
chown -R www-data /opt/svnrepos/repo1/db

Trocando o grupo nos arquivos e diretórios necessários:
chgrp www-data /opt/svnrepos/repo1
chgrp -R www-data /opt/svnrepos/repo1/db


  • WebDAV: Configurando Diferentes Permissões de Acesso (ou: Como acessar anonimamente o repositório?)

O exemplo acima é apenas um exemplo simples. Em alguns casos, porém, é interessante que seu repositório trabalhe com diferentes políticas de permissão de acesso, dependendo da ação (requisição) sendo solicitada. Exemplo: se o seu projeto é de código livre, talvez interesse manter o repositório aberto para leitura (update ou checkout) por toda a comunidade, sem exigir login de usuário e senha, mas, por segurança, manter a exigência de autenticação (usuário e senha) se a ação implicar alguma modificação no repositório (alterar aquivos, modificar propriedades, apagar ou adicionar arquivos, etc.). Assim, você tem seu repositório protegido, ou seja, somente a equipe autorizada é capaz de mexer nele, porém qualquer pessoa, de qualquer lugar do mundo, poderá baixar, a qualquer momento, o último estado (snapshot) do seu sistema.
Para realizar esta proeza, é bem simples. Primeiramente, devemos retirar a linha "Require valid-user", que exige autenticação irrestritamente, sem considerar o tipo de ação. Depois disso, devemos acrescentar as tags "Limit" ou "LimitExcept". A tag "Limit" contendo uma linha "Require valid-user" informa as ações que devem exigir autenticação. A tag "LimitExcept" contendo a mesma linha informa as ações que devem ser excetuadas desta regra, ou seja, que não exigirão autenticação. As duas tags podem ser adicionadas, mas isto será redundante. Em geral, prefira uma das duas. É comum se trabalhar apenas com a LimitExcept, para a configuração ficar menos verbosa.
Em resumo, para a situação proposta, a configuração ficaria:

[Location /repo1]
DAV svn
SVNPath /opt/svnrepos/repo1
AuthType Basic
AuthName "repo1"
AuthUserFile /opt/svnrepos/repo1passwd
# Require valid-user # Retirada esta linha!!
[Limit PUT POST DELETE PROPFIND PROPPATCH MKCOL COPY MOVE LOCK UNLOCK]
Require valid-user
[/Limit]
# Ou então, em lugar do Limit:
[LimitExcept GET PROPFIND, OPTIONS, REPORT]
Require valid-user
[/LimitExcept]

[/Location]

OBS1: Substitua os colchetes por sinais de maior e menor, formando a tag corretamente!!
OBS2: As ações incluídas dentro das tags Limit e LimitExcept são, muitas vezes, métodos HTTP. A listagem completa deles pode ser obtida aqui.
OBS3: Se você incluir no LimitExcept apenas o método GET, seu repositório será acessível anonimamente via HTTP, ou seja, do navegador, mas não poderá ser baixado de um cliente SVN sem nome de usuário e respectiva senha.



  • Conclusões

O acesso via webDAV é muito mais interessante para grandes equipes, pois protege mais o servidor, criando, através do Apache 2, uma camada de abstração entre o usuário e o repositório. Também esconde onde é o local exato em que o repositório está e quem realmente pode acessar a máquina servidora.
Existem, no entanto, muitas outras maneiras de configurar o webDAV, como:

- Forçá-lo a ser acessado apenas por HTTPS (imprescindível se seu repositório está aberto à internet). Se é isto que procura, visite nossos artigos Criando Certificações SSL com OpenSSL e Configurando o Apache com SSL;
- Abandonar o arquivo de senhas do Apache e configurá-lo para usar autenticação a partir de dados de uma tabela do MySQL;
- Dentre muitas outras coisas...

Todos estes tópicos fogem ao escopo deste pequeno artigo, mas espero ter fôlego para abordá-los tão logo, aguardem!!
Claro, como sempre, não devemos nunca nos esquecer do quanto é importante que COMENTEM!! ;-)

Nenhum comentário: