Mostrando postagens com marcador apache. Mostrar todas as postagens
Mostrando postagens com marcador apache. Mostrar todas as postagens

sábado, 5 de março de 2011

Como Remover um Commit Errado no SVN? Ou: Como Desfazer um Commit no Subversion?

Este artigo é dedicado a todos aqueles que já enviaram um commit equivocado para o SVN e quebraram ou estragaram alguma coisa no sistema onde trabalham. Quem nunca fez isso antes, que atire a primeira pedra!!
Bom, mas vamos lá.... A reposta para a pergunta acima é bem simples: não há como. Meu Deus, então agora estou perdido?? Calma, não se preocupe!! Existe uma técnica que lhe permite reverter o seu repositório para um estado anterior, se for realmente preciso. Acompanhe nosso artigo.


  • Por Que não há uma Forma Direta de Desfazer Commits??

Se desejar, você pode ir imediatamente para a solução do problema, lá embaixo. Entretanto, eu resolvi incluir esta seção aqui para lhe ajudar a pensar mais sobre como funciona o SVN e quais as suas premissas, aumentando seu conhecimento sobre o mesmo.
O SVN armazena seus dados em um banco de dados interno (ou em BDB - Berkeley Data Base, ou em FSFS). Evidentemente, seria possível fazer operações comuns a bancos de dados, como delete ou roll back. Contudo, o Subversion não permite qualquer tipo de remoção de entradas (inserts) de dados que foram efetivadas, sob risco de comprometer a segurança do repositório. Observe o risco a que os desenvolvedores estariam sujeitos e a falta de confiança que se geraria sobre os repositórios se isso fosse possível, considerando cenários como:

  1. Um desenvolvedor ou administrador de sistemas é demitido. Num acesso de raiva e considerando-se injustiçado, ele remove grande parte dos commits dos repositórios da empresa, deixando-os em estados muito primitivos e perdendo grande parte dos códigos gerados durante anos.
  2. Um desenvolvedor mal intencionado pratica sabotagem industrial: elimina ou deturpa parte do código do sistema antes do mesmo ser compilado e o envia para produção. Após a implantação do sistema danificado, o desenvolvedor remove o trecho defeituoso que criou, eliminando a única prova concreta de sua ação.
  3. Imagine que ninguém será demitido e não há qualquer pessoa mal intencionada. Ao contrário: todos trabalham felizes e freneticamente. Contudo, a equipe tem o hábito de, vez por outra, remover um commit mal feito. A uma certa altura, descobre-se um erro grave no sistema que está há mais de 1 mês em produção. A correção parece simples e poderia ser feita em cerca de um dia. Contudo, a quantidade de commits removidos impede que se consiga restaurar o código exato da versão que está em produção. Resultado: o erro vai persistir lá até que a versão seguinte seja totalmente finalizada e implantada...

Por motivos como estes, a remoção direta de commits não é possível. No entanto, existe a solução paliativa, um pouco mais agressiva, porém que funciona e é razoavelmente fácil e segura. Acompanhe-a na próxima seção!!


  • Removendo um Commit Indesejado

Se é realmente necessário remover um ou mais commits do SVN, e espero que tenham sido os últimos, então a única solução é fazem um dump do repositório filtrado pelo número de revisão, eliminá-lo, recriá-lo e restaurar o dump com um load, de forma a carregar no repositório recém-criado todas as revisões até a última antes das indesejadas. Todas estas ações devem ser feitas como root!! Vamos fazer isso passo a passo...

1. Fazendo o dump:
Considere que seu repositórios se chame "repo" e você está no diretório onde ele se encontra. Primeiramente, pare todos os acessos ao repositório, para congelá-lo (ou seja, pare o Apache, se você usa o WebDAV, ou impeça o login via SSH de usuários comuns, se você usa o protocolo svn+ssh://). Descubra o número da última revisão boa (desejada), a partir da qual todas serão eliminadas (suponhamos: revisão 200), para que façamos o dump de tudo até ela. Agora, considerando esta revisão, faça o dump:

svnadmin dump repo --revision 0:200 > repo.dump

É criado o arquivo repo.dump, que contém todas as revisões deste o tenro início de seu repositório até a revisão informada, de número 200.

2. Remova o repositório e crie outro idêntico:
Se você quiser, por segurança, pode mover o repositório para outro nome ao invés de apagá-lo, de forma a manter uma cópia de segurança do mesmo, caso alguma operação falhe. Você pode também fazer um backup do diretório completo do repositório ou armazená-lo em um arquivo .tar.gz, para economizar espaço, caso o repositório seja muito grande.

rm -rf repo
svnadmin create --fs-type bdb repo

Isto recria o repositório com mesmo nome, só que agora completamente vazio.

3. Agora sim, subindo tudo!!
Rode o comando, considerando o arquivo de dump gerado e o repositório novo recém-criado. Observe que, evidentemente, convém utilizar o mesmo nome do repositório antigo, para que outras configurações de seu sistema permaneçam válidas:

svnadmin load repo < repo.dump

Se tudo deu certo até aqui, você terá seu repositório recuperado até a revisão que você informou no dump, de forma que as posteriores foram ignoradas e serão perdidas.

4. Para finalizar, não esqueça deste procedimento!! Atribua as mesmas permissões de arquivos, dono e grupo originais às pastas do repositório, especialmente ao diretório "db" e seus arquivos. Se você usa o WebDAV, por exemplo, terá de tornar os arquivos pertencentes ao usuário "www-data" (ou o nome que tem seu usuário do Apache), e não "root", como é inicialmente criado. Não esqueça de verificar se os diretórios estão marcados como executáveis, se for o caso, para permitir a criação de novos arquivos de log no diretório "db".

5. Teste tudo bem detidamente, para evitar surpresas. Em tudo funcionando, finalmente, faça a faxina: elimine ou faça backup do repositório antigo e dos arquivos de dump que ainda estão no disco.

Bom, pessoal, testei realmente todos estes comandos, embora eu mesmo já tenha me visto em situações de utilizar este mecanismo para eliminar commits errados. Torço que tudo dê certo com vocês!!

Mais detalhes sobre administração de repositórios, consultem o manual do SVN (SVN Red Book), Capítulo 5. Veja também nosso artigo completo sobre Como Fazer Backup de Repositórios SVN. E, claro, COMENTEM!!!

segunda-feira, 21 de fevereiro de 2011

Como Configurar Vários Domínios no Apache 2

Este artigo ensina como fazer para que seu Apache aceite requisições com um ou mais domínios diferentes. Antes de mais nada, lembre-se de que é preciso que você registre o domínio que você deseja usar e que exista um servidor de DNS, como o Bind, configurado e rodando em seu servidor, de forma que ele intercepte as requisições e as envie para o Apache. O escopo deste artigo é apenas a configuração do Apache, e não a do Bind ou como fazer para pagar e registrar um domínio na internet.
Com a técnica ensinada aqui, você poderá receber em seu servidor requisições para vários domínios (ex: www.dominio1.com.br, www.dominio2.com.br, www.dominio3.com.br, etc.) e processá-las pelo Apache para que as chamadas sejam redirecionadas para a pasta virtual correta (ex: /var/www/site1, /var/www/site2, /var/www/site3). Se não é exatamente isto que você deseja, mas é próximo, ou se é isso e mais um pouco, você pode tentar vasculhar a documentação do Apache 2 sobre a criação de Virtual Hosts, clicando aqui.


  • Pré-Requisitos para a Configuração dos Domínios no Apache

Vamos partir de um exemplo... imagine que desejemos configurar os seguintes domínios:

www.dominio1.com.br para /var/www/site1
www.dominio2.com.br para /var/www/site2
www.dominio3.com.br para /var/www/site2

Consideremos que:

1- Os sites existem e já respondem perfeitamente com os endereços:

[nome de seu servidor]/site1/
[nome de seu servidor]/site2/
[nome de seu servidor]/site3/

2- Os três domínios foram comprados em um serviço de registro de domínios, a fatura está paga e todos já se encontram devidamente registrados;

3- O Bind (ou outro servidor DNS) de seu servidor está funcionando e está configurado para redirecionar as chamadas a estes domínios para seu inocente Apachezinho...

4- No serviço de registro de domínios, você já configurou o uso de seu DNS (nome e IP dos DNS primário e secundário) e já esperou o tempo necessário para a replicação desta informação pela rede.

É claro que estas condições podem ser ligeiramente modificadas de acordo com sua situação, mas, em geral, é isso de que precisamos para começar a trabalhar...


  • Criando o Virtual Host

Para o Apache 2, as diversas configurações a respeito do acesso às pastas virtuais ficam em contêineres <VirtualHost>. Estes contêineres normalmente ficam no arquivo /etc/apache2/apache2.conf. Evidentemente, modificar este arquivo é permitido apenas ao root e as modificações exigem que se reinicie o Apache para tomar efeito.
Cada domínio novo supõe uma nova configuração do VirtualHost, ou seja, um novo contêiner. Assim, para a realização do exemplo, precisaremos de 3 contêineres, um para cada domínio, conforme segue:

<VirtualHost *:80>
ServerName www.dominio1.com.br
ServerAlias dominio1.com.br *.dominio1.com.br
DocumentRoot /var/www/site1
</VirtualHost>

<VirtualHost *:80>
ServerName www.dominio2.com.br
ServerAlias dominio2.com.br *.dominio2.com.br
DocumentRoot /var/www/site2
</VirtualHost>

<VirtualHost *:80>
ServerName www.dominio3.com.br
ServerAlias dominio3.com.br *.dominio3.com.br
DocumentRoot /var/www/site3
</VirtualHost>


O que isso tudo significa?? Vamos por partes...

VirtualHost *:80 - Inicia a tag do contêiner, informando que estamos interessados na porta 80 (protocolo http). Se você, por algum motivo qualquer, usa outra porta, substitua o "80" pela porta desejada. O "*" pode ser substituído pelo IP interno de seu servidor.

ServerName www.dominio1.com.br - Indica o nome do domínio que você deseja configurar. Evidentemente, coloque o domínio que você registrou e que está configurado no Bind.

ServerAlias dominio1.com.br *.dominio1.com.br - Isto garante que quaisquer chamadas a este domínio vão ser redirecionadas para a pasta virtual que está sendo configurada.

DocumentRoot /var/www/site1 - Enfim, a referência no sistema de arquivos para a pasta virtual!! Ou seja, em que canto do disco está o seu portal. Note que, aqui, você só pode especificar uma pasta por VirtualHost. Por isso que necessitamos de três contêineres VirtualHost configurados!!

Se, por algum motivo, esta configuração não funcionar, então experimente acrescentar a linha:

NameVirtualHost *:80

Antes da declaração do primeiro VirtualHost.

Bom, pessoal, esta configuração é razoavelmente simples e indolor. É claro que você pode tornar a sua configuração do VirtualHost muito mais complexa, acrescentando as diversas diretivas suportadas pelo mesmo. Mas isto já seria tema para um novo artigo...
Se gostaram, detestaram, ajudou ou atrapalhou, então COMENTEM!!!

sábado, 22 de janeiro de 2011

Configurando o Apache para Ler Páginas Pessoais dos Usuários

Esta dica é bem simples: se você usa o Apache 2 e quer permitir que cada usuário do sistema tenha sua página pessoal, residindo dentro de sua própria pasta, onde a página possa ser criada, modificada e atualizada pelo próprio usuário, sem interferência do administrador do sistema, então a solução que você procura está neste artigo!!


  • Criando as Pastas Pessoais dos Usuários

Em cada diretório de usuário (o famoso /home/usuario), você deve criar uma pasta chamada "public_html", que deve ter permissão de acesso e escrita para o próprio usuário; Assim, suponhamos que temos um usuário genérico chamado "usuario". Façamos, como root:

mkdir /home/usuario/public_html
chown usuario /home/usuario/public_html
chgrp usuario /home/usuario/public_html

Estes comandos não só criam a pasta pública onde será armazenada a página pessoal do usuário como também concede ao usuário em questão as permissões de acesso à mesma. É preciso fazer isto para cada usuário!! Claro que fica mais fácil se estes comandos estiverem dentro de um script. Se você quer saber como descobrir todos os usuários do sistema para criar este script, consulte nosso outro artigo aqui!!


  • Configurando o Apache 2 Para Ler o public_html dos Usuários

Este passo é simples: basta ativar o módulo correto!! Verifique se o módulo userdir existe (se você instalou o Apache por um gerenciador de pacotes, certamente ele existirá):

ls /etc/apache2/mods-available/userdir*
/etc/apache2/mods-available/userdir.conf /etc/apache2/mods-available/userdir.load

É preciso que apareçam estes dois arquivos. Agora, verifique se eles estão ativados:

ls /etc/apache2/mods-enabled/userdir*

Caso não haja saída para o comando acima, então precisamos habilitá-los:

cd /etc/apache2/mods-enabled
ln -s ../mods-available/userdir.conf
ln -s ../mods-available/userdir.load

Isto cria os links simbólicos que vão ativar o módulo. A rigor, basta isto (e, claro, reiniciar o Apache) para que tudo funcione, mas várias configurações extras podem ser feitas, editando o arquivo "userdir.conf". Em especial, verifique se a linha "UserDir public_html" está presente. Esta linha define o nome do diretório que será vasculhado na área do usuário para buscar a sua página pessoal.
É possível também ativar e desativar a leitura da pasta pública de usuários específicos, usando a diretiva UserDir, conforme o exemplo:

UserDir enabled usuario1 usuario2
UserDir disabled usuario3 usuario4

Para mais detalhes sobre como configurar este módulo e as diretivas específicas que ele usa, verifique a página do manual oficial.


  • Habilitando o PHP nas Páginas Pessoais dos Usuários

Como esta configuração é muito flexível, é possível que você queira usar este artifício para permitir que vários usuários se tornem verdadeiros desenvolvedores web. Assim, o Apache permite que o PHP instalado no servidor seja habilitado em páginas pessoais dos usuários. Primeiramente, verifique se o seu PHP está instalado. Caso não esteja, é preciso instalá-lo. Não se preocupe: para tanto, consulte detalhadamente este nosso artigo. Agora, para ativar esta opção, vá em:

vi /etc/apache2/mods-enabled/php5.conf

e comente as seguintes linhas (comentar significa iniciá-las com o caracter "#", conforme já está feito no exemplo abaixo):

# [IfModule mod_userdir.c]
# [Directory /home/*/public_html]
# php_admin_value engine Off
# [/Directory]
# [/IfModule]
#[/IfModule]

OBS: substitua os colchetes por sinais de maior e menor que.


  • Concluindo as Configurações!!

Agora, finalmente, reinicie o Apache:

/etc/init.d/apache2 restart

Pronto, tudo está configurado e as pastas já deverão estar respondendo. O endereço de acesso será: http://[domínio ou host]/~[usuario], onde [usuario] é o nome de cada usuário e [domínio ou host] pode ser o nome da máquina com o domínio ou o seu IP. Opcionalmente, você poderá, conforme a necessidade, atrelar algumas páginas pessoais a VirtualHosts, de forma a criar endereços de acesso diferenciados.
Bom, espero que tenha ajudado!! Qualquer coisa, COMENTEM!!

sexta-feira, 21 de janeiro de 2011

Instalando o Suporte a PHP5 no Apache2 (Ubuntu, Debian, etc.)

O PHP é uma linguagem bastante popular de programação para páginas dinâmicas na web. Vários sistemas importantes utilizam esta linguagem, como o MediaWiki e o WordPress. Este artigo é bem breve e ensina como instalá-lo no Apache Web Server 2.
Como vocês sabem, o Apache é um servidor web muito flexível, baseado em módulos. Inicialmente, ele não tem suporte a PHP, mas você pode instalar gratuitamente o módulo de PHP (e o suporte à linguagem), de forma que ele passe a entender e executar o PHP. Assim, após instalado o Apache 2, é preciso que se instale, como root, os seguintes pacotes:

apt-get install php5 libapache2-mod-php5

O pacote php5 contém a linguagem em si e o interpretador para executar seus comandos. O pacote libapache2-mod-php5 contém o módulo do Apache que é capaz de ligar o código escrito em PHP de cada página web de seu servidor ao interpretador de PHP instalado pelo primeiro pacote, de forma a executar com sucesso o referido código.
Após esta instalação, se o servidor Apache não for reiniciado automaticamente (o que muito provavelmente deve acontecer, devido aos scripts do apt-get), você deverá reiniciá-lo, de sorte a carregar o novo módulo. Para tanto, ainda como root, digite:

/etc/init.d/apache2 restart

Simples, rápido e indolor!! Se você não usa uma distro Linux baseada em Debian, você poderá achar estes mesmos pacotes (ou outros com nomes muito similares) no seu gerenciador de pacotes padrão e poderá instalá-los sem medo.
Não tenha medo se seu servidor tem páginas antigas escritas para PHP4. Instalar o PHP5 em geral não afeta nem prejudica as páginas escritas para PHP4 ou anterior. Claro que vale sempre a pena fazer backup e testes, mas em muitas ocasiões tudo funcionará corretamente.
Se você é teimoso e quer conferir se o módulo foi carregado corretamente após esta operação toda, digite:

ls /etc/apache2/mods-enabled/php5*
/etc/apache2/mods-enabled/php5.conf /etc/apache2/mods-enabled/php5.load

Estes dois arquivos devem aparecer como saída para o comando ls, indicando que o módulo está instalado e ativo.

domingo, 9 de janeiro de 2011

Configurando o WebDAV com SSL no Apache

Este é o artigo final da série sobre WebDAV e Apache, portanto assumimos que todos os passos dos artigos anteriores foram realizados com sucesso. Você poderá encontrá-los seguindo os links:

1- Como Acessar o SVN via HTTP (acesso via porta 80, sem SSL);
2- Criando Certificados SSL com OpenSSL (como criar seu certificado. Caso já o tenha, pode pular este artigo);
3- Configurando o Apache com SSL (como fazer seu Apache usar um certificado digital).

Seguindo estes passos, você deverá ter, em seu arquivo de configuração do Apache (geralmente /etc/apache2/apache2.conf), ao menos um contêiner [Location], onde estará configurado o seu repositório SVN. Claro que você pode ter mais de um [Location], caso seu Apache precise servir vários repositórios ao mesmo tempo. Você também deve ter criado seu arquivos de senhas HTTP, onde a autenticação do usuário será feita.
Você notará que, mesmo com autenticação do usuário (no modo basic authentication, usando a diretiva AuthType Basic), ainda há risco de segurança, pois a senha e os dados não são encriptados, de forma que a senha é enviada em texto puro (plain text) e pode, com certa habilidade, ser capturada por pessoas mal-intencionadas. O outro modo de autenticação (digest), onde a senha é passada como uma soma MD5, ainda tem algumas falhas em seus processos. Sendo assim, a segurança somente estará garantida se seu acesso ao repositório for feito integralmente em conexão segura, via SSL.
Este artigo ensina rapidamente como configurar o SSL que seu Apache já tem (vide artigos anteriores) com o seu repositório SVN.


  • Acessando o WebDAV com Conexão Segura no Apache

Suponhamos então que você tenha um contêiner [Location] como este, no seu /etc/apache2/apache.conf:

[Location /repositorio1]
DAV svn
SVNPath /opt/svn/repositorio1
AuthType Basic
AuthName "repo1"
AuthUserFile /opt/svn/passwd
[Limit PUT POST DELETE PROPFIND PROPPATCH MKCOL COPY MOVE LOCK UNLOCK]
Require valid-user
[/Limit]
[LimitExcept GET]
Require valid-user
[/LimitExcept]
[/Location]

OBS: Substitua os colchetes por sinais de maior e menor que!!

Este [Location] funciona, mas responde apenas via HTTP, na porta 80. Para ele passar a responder na porta 443, com conexão segura, precisamos de duas coisas (assumindo que as chaves já estão instaladas e configuradas no Apache, conforme mostrado nos artigos anteriores):

1- Proibir o acesso ao contêiner pelo protocolo HTTP (porta 80). Ou seja: forçar o acesso ao WebDAV via SSL. Para tanto, basta acrescentar a linha em negrito:

[Location /repositorio1]
SSLRequireSSL
DAV svn
SVNPath /opt/svn/repositorio1
AuthType Basic
AuthName "repo1"
AuthUserFile /opt/svn/passwd
[Limit PUT POST DELETE PROPFIND PROPPATCH MKCOL COPY MOVE LOCK UNLOCK]
Require valid-user
[/Limit]
[LimitExcept GET]
Require valid-user
[/LimitExcept]
[/Location]

OBS: Substitua os colchetes por sinais de maior e menor que!!

A diretiva SSLRequireSSL impede que o acesso a este [Location] seja feita por qualquer outro meio que não via SSL. Existem outras diretivas que podem controlar este acesso, como a SSLVerifyDepth 1, que indica a profundidade (níveis de sub-diretórios) em que o acesso forçado em SSL deve ser aplicado. Evidentemente, informar o número zero "0" irá sugerir toda a árvore de diretórios. Para o nosso caso, esta diretiva não é necessária, pois, sem ela, o SSL já é forçado em todo o repositório, que é o que queremos.
Agora seu repositório está inacessível: não responde mais na porta 80 (o Apache vai informar a mensagem "Forbidden", ou seja, acesso negado), mas ainda não responde na porta 443. Para completar a operação, execute o passo 2, abaixo.

2- Criar um VirtualHost para o acesso seguro via SSL.
Um VirtualHost é um super contêiner do Apache que faz diversas coisas: mapeamento de URLs, redirecionamentos, escolha de portas, criação de regras de acesso, configuração de Aliases, dentre outras coisas, e suporta praticamente qualquer contêiner e diretiva dentro dele. Exatamente por isto precisamos criar um VirtualHost para o acesso à porta 443, conforme mostramos no exemplo:

[VirtualHost 127.0.0.1:443]
Servername localhost
DocumentRoot /var/www
[IfModule mod_ssl.c]
SSLEngine on
SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
[/IfModule]
[/VirtualHost]

OBS1: Substitua os colchetes por sinais de maior e menor que!!
OBS2: Substitua o IP 127.0.0.1, que é usado apenas como exemplo, pelo IP de seu servidor!!

O que isto faz?? Bom, vamos aos detalhes:

VirtualHost IP:443 - Significa que você está criando o conjunto de regras específicas para o uso da porta 443, que é a porta configurada para conexão segura por SSL, o chamado protocolo HTTPS.
Servername localhost - É o nome do servidor. Troque o termo "localhost" por um nome válido. Este é usado apenas como exemplo.
DocumentRoot /var/www - É claro que este não é o endereço de seu repositório, mas é um local que vai ser utilizado caso alguém tente ler a URL raíz de seu servidor, por exemplo: https://localhost. Se você informar o endereço físico (diretório no sistema de arquivos) de um de seus repositórios aqui, estará criando uma brecha de segurança para um possível invasor. O local que o DocumentRoot informar não impede que um ou mais [Location] sejam contemplados pelo VirtualHost protegido.
SSLEngine on e demais diretivas do módulo SSL (mod_ssl.c) - responsáveis por ativar efetivamente o SSL nesta porta informada. Por aqui, você nota que é possível, no Apache, servir o SSL em ainda outra porta, diferente da 443. Não sei por que você desejaria isto mas, caso deseje, tenha a certeza de adicionar a diretiva "Listen" com o número da porta desejada. Exemplo: "Listen 400", para a porta 400. Isto não é informado no VirtualHost, mas sim no ports.conf, ou, opcionalmente, no apache2.conf, httpd.conf ou no mods-available/ssl.conf.

Existem outras coisas que você pode pendurar no VirtualHost, como os contêineres [Directory], que poderão ser utilizados especialmente para outros portais e sites que você serve com seu Apache. O fato de existir um contêiner para a porta 443 não impede que exista outro para a porta 80. Desta forma, seu Apache pode servir tanto conexões seguras (SSL/HTTPS) quanto conexões abertas (HTTP na porta 80). Basta configurar direitinho os VirtualHost. Como este artigo é apenas sobre o WebDAV e não um curso de Apache, recomendo que, se este é o seu caso, procure a documentação do Apache para maiores detalhes. Um exemplo mais sofisticado de configuração do VirtualHost pode ser encontrado aqui.


  • Configurando o WebDAV com SSL sem usar Location (Somente o VirtualHost)

Esta não é, inicialmente, a minha recomendação, porém provavelmente será mais útil a quem tem apenas um repositório para servir com o Apache e quer configurar o Apache como um servidor dedicado. Um servidor dedicado é aquele que serve a apenas um portal ou serviço, normalmente um que sofra com muitos acessos e grande carga, de sorte a justificar um servidor só para ele. Pode ser o caso de sua empresa, por exemplo, se todos os projetos estão centrados em um único repositório SVN acessado a partir de um único servidor Apache, vindo a sofrer grande volume de acessos.
Bom, neste caso, você pode fazer a configuração toda diretamente no VirtualHost, eliminando o contêiner [Location]. Isto vai ajudá-lo a configurar o repositório diretamente na URL raíz, ou seja, no caminho virtual "/" de seu servidor. Vide o exemplo abaixo:

[VirtualHost 127.0.0.1:443]
Servername localhost
DocumentRoot /var/www
[IfModule mod_ssl.c]
SSLEngine on
SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
[/IfModule]
[Directory /opt/svn/repositorio1]
DAV svn
SVNPath /opt/svn/repositorio1
AuthType Basic
AuthName "repo1"
AuthUserFile /opt/svn/passwd
[Limit PUT POST DELETE PROPFIND PROPPATCH MKCOL COPY MOVE LOCK UNLOCK]
Require valid-user
[/Limit]
[LimitExcept GET]
Require valid-user
[/LimitExcept]
[/Directory]
[/VirtualHost]

OBS: Substitua os colchetes por sinais de maior e menor que!!

Note que este exemplo é bem semelhante ao primeiro. A diferença é que ele migra praticamente todas as informações que colocamos no contêiner [Location] (referentes à configuração do WebDAV), que ficava diretamente no /etc/apache2/apache.conf, para dentro de um contêiner [Directory]. Este, por sua vez, é disposto dentro do contêiner VirtualHost, em /etc/apache2/apache.conf. Isto provoca que as informações do [Directory] digam respeito ao endereço raíz e poderão ser acessadas pela URL https://localhost/.
Conforme mencionado, é o caso ideal para quem mantém apenas um repositório e tem um Apache exclusivo para o mesmo, embora outros VirtualHost (e contêineres [Directory]) possam ainda ser criados e configurados neste mesmo Apache.


  • Conclusões

Foram apresentadas duas técnicas para a configuração do WebDAV no Apache usando SSL: uma mais própria para configurar um único repositório e outra mais apropriada para múltiplos repositórios do SVN. A sua escolha da técnica, bom como qualquer refinamento a ser incluído, deve levar em conta o uso de seu repositório, a carga que ele recebe e a quantidade de repositórios gerenciados pelo Apache. O uso do WebDAV, mesmo via SSL, não exclui que o Apache sirva outras páginas e sistemas.
Espero que este conjunto de tutoriais tenha sido útil!! Lembre-se de que, sempre que possível, é fundamental que você COMENTE!!!

sexta-feira, 7 de janeiro de 2011

Configurando o Apache com SSL (Certificação Digital)

Este artigo é a continuação do artigo anterior: Criando Certificados SSL com OpenSSL. Aqui vamos aprender a usar o CA (certificate authority - autoridade certificadora) criado anteriormente para criar chaves assinadas digitalmente e implantá-las no Apache Web Server. A criação e assinatura das chaves é um processo que pode ser usado Ipsi literis para qualquer serviço ou aplicativo que necessite de chaves assinadas, diferindo apenas o processo de implantação das mesmas. Como exemplo, vamos implantá-la no Apache Web Server, de forma a que ele venha a suportar conexões seguras (protocolo HTTPS). As conexões seguras do Apache normalmente são servidas na porta 443 (e não na porta 80) e, para que funcionem, dependem de configuração extra: cada pasta virtual interessada em servir via conexão segura deve criar uma entidade VirtualHost para tanto. Este artigo não cobre a criação do VirtualHost (que será tema do próximo artigo, o terceiro desta série), mas somente a implantação e configuração do Apache de sorte a torná-lo apto e pronto para servir páginas via SSL, quando desejado.


  • Criando uma Chave e um Requerimento (Certificate Request)

Antes de tudo, entre como root. Em seguida, volte ao nosso diretório especial que criamos para guardar os arquivos do OpenSSL (se você seguiu nosso primeiro artigo, possivelmente nomeou este diretório de "/var/ssl"):

cd /var/ssl

Agora, vamos utilizar o certificado já criado anteriormente para criar uma chave e um signing request:

openssl req -new -nodes -out name-req.pem -keyout private/name-key.pem -config ./openssl.cnf

O que isto faz??
req -new: significa que vai criar um request novo.
-out name-req.pem: o nome da sua chave pública. Pode ser o nome do host, ou algo assim. Escolha o nome de sua preferência, mas evite usar o termo "key", para não confundir com o arquivo de chave privada.
-keyout private/name-key.pem: o nome de sua chave privada. Pode ser qualquer nome, mas sugiro que você utilize o mesmo nome do arquivo anterior, adicionando o termo "key". Note que este arquivo vai para a pasta private e deve estar protegido, ou seja, inacessível a terceiros, por motivos de segurança.
-config ./openssl.cnf: o mesmo arquivo de configuração do OpenSSL utilizado para criar o seu certificado (realizado no artigo anterior, conforme mencionado no caput deste artigo).

O OpenSSL vai fazer aquelas mesmas perguntas anteriores, a respeito de sua localidade (país, estado, cidade) e do nome da sua organização. Responda às perguntas (ou uso os valores padrões) exatamente conforme foi feito na criação de seu certificado, executado no artigo anterior.
Após esta operação, surgirão dois novos arquivos em ser diretório: name-req.pem (contendo o certificate request) e, dentro do diretório private, name-key.pem (private key - chave privada).


  • Assinando o Certificate Request

Agora vamos propriamente assinar este requerimento do certificado. Isto servirá para garantir que o usuário conectado ao seu servidor por conexão segura realmente recebeu a chave dele através de seu servidor, e não uma chave adulterada por terceiros. Esta verificação é obrigatória para o protocolo SSL, por isso precisa ser feita.
Bom, trocando em miúdos, basta digitar:

openssl ca -out name-cert.pem -config ./openssl.cnf -infiles name-req.pem

O que isso significa??
ca: vamos assinar o request e criar um certificado assinado.
-out name-cert.pem: o nome do novo certificado, agora devidamente assinado.
-config ./openssl.cnf: naturalmente, o mesmo arquivo de configuração utilizado desde o início.
-infiles name-req.pem: o arquivo de request original, gerado no passo anterior, que ainda não está assinado mas já contém a chave em si.

Lembra-se de que, quando geramos, lá no artigo anterior, o seu certificate authority, você foi obrigado a dar uma senha?? Pois é: este é o momento de usá-la. A primeira coisa que o comando faz é pedir aquela mesma senha, que deve ser digitada exatamente conforme o foi na criação do seu CA, no artigo anterior.
Em seguida, o comando exibe todas as informações particulares de seu servidor informadas na criação da chave e faz duas perguntas:

Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

Digite "y" para a primeira pergunta, para que o certificado seja assinado. Isto vai gerar o arquivo name-cert.pem no diretório. Este arquivo nada mais é do que o mesmo request anterior, tendo adicionado um bloco contendo a assinatura, ou seja, os dados informados do servidor e o cálculo MD5SUM destes dados encriptados em RSA com a senha que você digitou. Nunca ninguém no mundo vai ser capaz de abrir esse cálculo RSA e ler o MD5SUM se não possuir a sua bendita senha. Quebrar essa senha certamente dará muito trabalho. Por isso o certificado está assinado e é seguro.
Responda "y" para a segunda pergunta. Isto irá criar uma cópia exata do arquivo no diretório "certs", o seu banco de dados de certificados, porém utilizando o nome dado no arquivo "serial", que criamos no artigo anterior (você achou que ele não serviria para nada, mas aí está a função dele!!). Automaticamente, este arquivo "serial" é sobrescrito com o valor numérico seqüencial imediatamento posterior (antes era 100001, agora é 100002).


  • Vamos Conferir Tudo??

Esta seção foi escrita para quem duvida do que eu digo... não precisa ser realizada, mas vai te ajudar a conferir e entender o que foi feito até o momento.


1- Testando se o seu certificado é igual ao que está no banco de certificados:

diff name-cert.pem certs/100001.pem

Se o comando não mostrou saída de texto, os dois arquivos existem, têm estes nomes e são iguais.


2- Verificando se o arquivo de índice está com o valor imediatamente posterior:

cat serial
100002

De fato, está pronto para o próximo certificado, que será armazenado no banco (pasta certs) com o nome "100002.pem". Se você configurou o atual certificado com data de expiração de 1 ano (365 dias), este certificado novinho provavelmente será gerado no ano que vem...


3- Verificando se as chaves privadas estão geradas:

ls private/
cakey.pem name-key.pem

Sim, ambas as chaves que fazem parte do processo estão lá corretamente.


  • Removendo a Senha da Chave Privada

Alguns serviços tendem a usar a chave privada pedindo a senha a cada vez que se inicializam. Normalmente, desejamos que o serviço inicie com o boot automaticamente e sem pedir nenhuma informação. Para tanto, podemos retirar a senha da chave privada, que não precisa mais dela, pois já estamos com todas as chaves e certificados gerados e prontos. Para tanto, utilize o comando:

openssl rsa -in private/name-key.pem -out private/name-key-nopassword.pem
writing RSA key

Isto vai gerar o arquivo "name-key-nopassword.pem" dentro do diretório private, semelhante ao primeiro, mas sem a senha embutida.


  • Configurando o Apache para Usar o SSL

Agora, finalmente terminamos todas as gerações de chaves, requests e certificados. Precisamos apenas ensinar o Apache a usar essa tecnologia. Então vamos por partes...


1- Ativando o Módulo SSL do Apache

Vamos verificar se seu Apache (que, suponho, já está instalado) está com o módulo de SSL instalado (provavelmente sim) e ativado (talvez não...):

ls /etc/apache2/mods-available/ssl*
/etc/apache2/mods-available/ssl.conf /etc/apache2/mods-available/ssl.load

(substitua "/etc/apache2" pelo local de configuração do seu Apache. Em algumas distribuições, pode ser "/etc/httpd").
Se a listagem acima mostrou os dois arquivos "ssl.conf" e "ssl.load", então o módulo está instalado. Vamos saber se ele está ativado:

ls /etc/apache2/mods-enabled/ssl*
ls: cannot access /etc/apache2/mods-enabled/ssl*: No such file or directory

Se a listagem não retornou os mesmos dois arquivos, conforme o caso aí em cima, então o módulo não está ativo. Para ativá-lo, basta criar, no diretório mods-enabled, um link simbólico para cada arquivo ssl.* presente no mods-available:

ln -s /etc/apache2/mods-available/ssl.conf /etc/apache2/mods-enabled/ssl.conf
ln -s /etc/apache2/mods-available/ssl.load /etc/apache2/mods-enabled/ssl.load

Agora os módulos estão configurados. Mas, calma, não reinicie o Apache ainda... precisamos configurar o módulo e instruí-lo sobre onde estão as chaves que criamos...


2- Importando as Chaves para o Apache

Vamos criar um diretório dentro das configurações do Apache para armazenar as chaves que desejamos utilizar e, em seguida, copiá-las para lá:

mkdir /etc/apache2/ssl
cp private/name-key-nopassword.pem /etc/apache2/ssl/
cp name-cert.pem /etc/apache2/ssl/


3- Configurando o Módulo SSL do Apache

Agora falta pouco!! Vamos editar o arquivo de configuração do módulo SSL do Apache e dizer para ele onde estão as chaves que acabamos de copiar aí em cima:

vi /etc/apache2/mods-available/ssl.conf

Acrescente, possivelmente ao final do arquivo (porém antes de fechar a tal "IfModule"), as seguintes linhas:

# Including certificate authority
SSLCertificateFile /etc/apache2/ssl/name-cert.pem
SSLCertificateKeyFile /etc/apache2/ssl/name-key-nopassword.pem

Vamos ver se o Apache entendeu bem a configuração e achou os arquivos?? Vamos reiniciá-lo e observar o log de erros:

/etc/init.d/apache2 stop
/etc/init.d/apache2 start
less /var/log/apache2/error.log

Agora o seu Apache já está pronto para utilizar SSL. O que falta é apenas configurar quais portais servidos por ele serão tunelados por conexão segura, ou seja, serão servidos via protocolo HTTPS, pela porta 443, e não mais pela porta 80, que é a padrão. Isto é feito na tag VirtualHost. No próximo artigo trataremos deste pormenor... até lá!!

Quem quiser, claro: comente!!

quinta-feira, 6 de janeiro de 2011

Criando Certificados SSL com OpenSSL

Certificados digitais são utilizados vastamente em diversos serviços de rede, como contêineres HTTP (exemplo: Apache Web Server), servidores de e-mail (Exim4 ou Sendmail), servidores de nomes e diretórios (LDAP), e até para assinar arquivos e documentos digitalmente, como o faz o AutoCAD. Este tutorial mostra, passo a passo, como criar um certificado digital, utilizando a ferramenta OpenSSL. O certificado criado poderá ser importado e utilizado em qualquer aplicativo ou serviço que suporte conexão segura ou assinatura digital.
Para executar as instruções deste tutorial, você deve ter o openssl previamente instalado em sua máquina (possivelmente sua distro Linux já vem com ele) e deve ter acesso de root, pois todos os comandos deverão ser executados como root, desde o início.
Este tutorial inspira-se num tutorial bem detalhado que pode ser encontrado aqui.


  • Criando um Diretório para o SSL

Como o procedimento que iremos realizar gera vários arquivos e diretórios, alguns deles sensíveis e cujo acesso deve ser restrito ao root, então convém que se crie no sistema um diretório para se armazenar estas informações. Pode estar em qualquer lugar e possuir qualquer nome, vou sugerir /var/ssl. Após criar o diretório, restrinja todo o acesso de leitura, escrita e execução dele apenas ao root, por motivos de segurança:

mkdir /var/ssl
chmod 700 /var/ssl

Confira a operação:

ls -l /var/

# deve conter uma linha semelhante a esta:
drwx------ 2 root root 4096 2011-01-06 15:41 ssl

Agora acesse o diretório. Todas as demais operações ocorrerão de dentro dele:

cd /var/ssl/


  • Criando Subdiretórios e Banco de Dados dos Certificados

Uma vez dentro do diretório, vamos criar dois subdiretórios, utilizados para armazenar os certificados e as chaves privadas:

mkdir certs private

Agora vamos criar dois pequenos arquivos textos, um contendo um número seqüencial (utilizado para numerar os certificados na seqüência em que sejam criados) e outro vazio, utilizado para indexar o certificado atual:

echo '100001' > serial
touch certindex.txt


  • Criando um Arquivo de Configuração do OpenSSL Personalizado

O OpenSSL utiliza um arquivo de configuração em modo texto que pode ter qualquer nome. Já existe um arquivo pronto que fica em "/etc/ssl/openssl.cnf". Você pode modificá-lo e utilizá-lo, se desejar. Por questões de padronização, eu sugiro que você crie o seu próprio arquivo de configuração, incluindo nele os dados particulares de sua empresa ou instituição que deverão aparecer no certificado.
Um exemplo deste arquivo está a seguir. A minha sugestão é que você o salve como openssl.cnf.sample. Basta digitar "vi openssl.cnf.sample", apertar "i" (de "incluir") e colar o seguinte conteúdo:

-----------------------------------------------------
#
# OpenSSL configuration file.
#

# Establish working directory.

dir = .

[ ca ]
default_ca = CA_default

[ CA_default ]
serial = $dir/serial
database = $dir/certindex.txt
new_certs_dir = $dir/certs
certificate = $dir/cacert.pem
private_key = $dir/private/cakey.pem
default_days = 365
default_md = md5
preserve = no
email_in_dn = no
nameopt = default_ca
certopt = default_ca
policy = policy_match

[ policy_match ]
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional

[ req ]
default_bits = 1024 # Size of keys
default_keyfile = key.pem # name of generated keys
default_md = md5 # message digest algorithm
string_mask = nombstr # permitted characters
distinguished_name = req_distinguished_name
req_extensions = v3_req

[ req_distinguished_name ]
# Variable name Prompt string
#------------------------- ----------------------------------
0.organizationName = Organization Name (company)
organizationalUnitName = Organizational Unit Name (department, division)
emailAddress = Email Address
emailAddress_max = 40
localityName = Locality Name (city, district)
stateOrProvinceName = State or Province Name (full name)
countryName = Country Name (2 letter code)
countryName_min = 2
countryName_max = 2
commonName = Common Name (hostname, IP, or your name)
commonName_max = 64

# Default values for the above, for consistency and less typing.
# Variable name Value
#------------------------ ------------------------------
0.organizationName_default = My Company
localityName_default = My Town
stateOrProvinceName_default = State or Providence
countryName_default = US

[ v3_ca ]
basicConstraints = CA:TRUE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer:always

[ v3_req ]
basicConstraints = CA:FALSE
subjectKeyIdentifier = hash

-----------------------------------------------------

Agora, você já tem um modelo do arquivo de configuração do OpenSSL. Não vamos mexer no modelo, sob pena de perder as informações e dicas contidas nos comentários. Vamos então criar o nosso arquivo personalizado a partir do modelo, e este se chamará simplesmente openssl.cnf:

cp openssl.cnf.sample openssl.cnf


Edite este arquivo e substitua as informações da seção "[ req_distinguished_name ]" por informações em conformidade com as informações que você deseja mostrar no certificado. Lembre-se: evite usar acentos, símbolos, barras, sinais, ou qualquer outro caracter especial fora os símbolos alfanuméricos padrões, pois isto pode criar problemas na codificação da chave!!


  • Criando o Certificado Principal

Antes de criar chaves, você deve criar um certificado principal (root certificate), baseado nas configurações informadas no arquivo de configurações. Todo o resto do trabalho daqui por diante será baseado neste certificado. Assim, para criar este certificado, digite o comando abaixo (sempre de dentro da pasta principal que criamos, e sempre como root!):

openssl req -new -x509 -extensions v3_ca -keyout private/cakey.pem -out cacert.pem -days 365 -config ./openssl.cnf

O que significa tudo isso??
-new: indica que se criará um novo Certificate Authority (autoridade certificadora);
-days 365: a quantidade de dias em que este certificado será válido. Algumas pessoas gostam de deixar o certificado principal válido por 10 anos. Neste caso, informe "3650";
-keyout private/cakey.pem: o local e nome do arquivo de chave que será criado;
-out cacert.pem: o arquivo de certificado que será criado;
-config ./openssl.cnf: o arquivo de configuração que será utilizado como base para a criação deste certificado.

Depois que você der ENTER, o OpenSSL vai pedir alguns dados importantes, iniciando por uma senha (pass phrase). Não perca esta senha!! Ela vai ser necessária mais pra frente!! As outras informações são as mesmas do arquivo de configuração que você já deve ter alterado, ou seja:

- Nome da Organização (ou companhia, empresa, instituto ou órgão);
- Unidade da Organização (ou departamento ou seção);
- Cidade;
- Estado (ou província ou região);
- País (na verdade, apenas as duas letras do código do país. Ex: BR para Brasil);
- O chamado Common Name, geralmente o nome de servidor (hostname) ou IP do mesmo.


  • Instalando o Certificado

Apenas com o exposto você já tem o suficiente para usar o certificado. Foram gerados dois arquivos, a saber:

cacert.pem: é o seu certificado público. Pode ser renomeado e distribuído para outras pessoas ou máquinas, ou mesmo via rede. Pode ser baixado e instalado em navegadores ou clientes de e-mail.
private/cakey.pem: é um arquivo privado e não deve ser distribuído. Ao contrário, deve ficar bem guardado e seguro!! Também pode ser renomeado, no entanto. Este arquivo deve ser utilizado internamente para criar as assinaturas digitais, necessárias para acessos seguros via SSL.


  • Próximos Passos

No artigo seguinte (Configurando o Apache com SSL), vamos aprender a criar duas chaves a partir deste certificado, uma pública e outra privada, assiná-las digitalmente e adicioná-las ao Apache Web Server... continue com a gente!!

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!! ;-)