O subversion é um sistema de controle de versão de código fonte aberto criado pela CollabNet.
Nos últimos tempos teve grande adoção por parte da comunidade e do mundo corporativo. Esse documento tem como base o svn-book leitura recomendada para quem quiser se aprofundar nesse sistema.
Esse HOWTO tem como objetivo demostrar como é simples criar um servidor svn com apache sobre o protocolo ssl. Nesse tutorial utilizarei o sistema operacional com base no Red Hat Enterprise Linux o Scientific Linux um Linux de classe Enterprise com uma comunidade crescente e pró-ativa ao invés do CentOS que com sua metodologia de desenvolvimento e manutenção vem perdendo muito espaço. Bom mas não vamos entrar nos méritos de sistema operacional nesse momento.
obs.: Para outras distribuições de Linux o local dos arquivos podem sofrer alteração, porem a configuração será semelhante.
1 - Instalar os softwares necessários (Apache, Subversion, mod_dav_svn, mod_ssl e openssl).
Podemos utilizar o yum (gerenciador de pacotes) para essa instalação, basta acessar o console com o usuário root ou qualquer outro usuário que esteja na lista de sudoers:
[root@server ~]# yum install httpd subversion mod_dav_svn mod_ssl openssl
2 - Criar a estrutura de diretório svn root
Para decidir o local do root do seu servidor svn recomendo a leitura do FHS. No meu servidor svn, criei uma nova pasta em /usr/local. Dessa forma todos os arquivos que serão versionados estarão em /usr/local/svn, a escolha desse diretório deve-se a esse ser um servidor dedicado ao subversion.
[root@server ~]# mkdir /usr/local/svn
[root@server ~]# chown -R apache:apache /usr/local/svn
3 - Criar o seu primeiro repositório
Vamos utilizar o comando svnadmin, para criar um repositório em /usr/local/svn/. Para o propósito deste exemplo, o repositório que estou criando é chamado de "projeto_01".
[root@server ~]# cd /usr/local/svn
[root@server svn]# create --fs-type fsfs projeto_01
[root@server svn]# chown -R apache:apache projeto_01
[root@server svn]# chmod -R g+w projeto_01
[root@server svn]# chmod g+s projeto_01/db
4 - Configure mod_dav_svn
Agora que temos um repositório criado e funcionando, vamos configurar o apache e o módulo mod_dav_svn. Para tal vamos editar o arquivo /etc/httpd/conf.d/subversion.conf para o abaixo.
# Carrega modulos necessários
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
# Preste atenção na / no fim do Location sem ela não será possivel mostrar todos os repositórios do seu servdor svn
<Location /svn/>
DAV svn
# Local onde foi criado o diretório root do seu servidor svn
SVNParentPath /usr/local/svn
# Para listar os diretórios do seu servidor svn
SVNListParentPath on
# Obriga utilizar o protocolo ssl(https)
SSLRequireSSL
# Abilita autenticação básica
AuthType Basic
# Nome que irá aparecer na tela de autenticação
AuthName "Dema SVN Server"
# Arquivo de usuários e senhas
AuthUserFile /usr/local/svn/svn.users
# Arquivo de usuários por projeto
AuthzSVNAccessFile /usr/local/svn/authz.svn.users
# Obriga usuário autenticado
Require valid-user
</Location>
5 - Criar seu arquivo de usuários svn
Para cria um arquivo de usuários svn basta utilizar o comando htpasswd. Este é o arquivo que armazena os nomes de usuário e senhas de quem tem permissão para acessar o servidor svn.
[root@server ~]# htpasswd -c /usr/local/svn/svn.users "NOME DE USUÁRIO"
New password:
Re-type new password:
Adding password for user "NOME DE USUÁRIO"
Substituir "NOME DE USUÁRIO" acima com seu nome de usuário desejado sem "". Repita esse comando sem "-c" para adicionar mais usuários.
6 - Criar seu arquivo de permissões de usuário por projeto.
Crie o arquivo com o editor de texto que você preferir.
[root@server ~]# vi /usr/local/svn/authz.svn.users
# Necessário para que todos os usuários visualizem todos os projetos do servidor svn
[/]
* = r
# Definição de usuários por grupo
[groups]
grupo_01 = user1, user2
grupo_02 = user3
# Projeto 01
# Usuários do grupo_01 tem acesso a leitura e gravação o user3 não tem permissão de acesso
[Projeto_01:/]
@grupo_01 = rw
user3 =
# Projeto 02
# Usuários do grupo_01 tem acesso apenas a leitura e o user3 tem acesso a leitura e gravação
[Projeto_02:/]
@grupo_01 = r
user3 = rw
# Projeto 03
# Nem um dos usuários tem acesso
[Projeto_03:/]
@grupo_01 =
@grupo_02 =
# Projeto 03
# Usuário user1 tem acesso a leitura e gravação user2 não tem acesso e o user3 apenas a leitura
# Apenas na versao1 da tag
[Projeto_03:/tags/versao1]
user1 = rw
user2 =
user3 = r
7 - Configure mod_ssl e configuração https
Para configurar o https devemos editar o arquivo /etc/httpd/conf.d/ssl.conf e criar um certificado autoassinado ssl. Note que o meu servidor svn é nomeado de svn.server.local. O seu provavelmente será diferente. Seja o que for, certifique-se que você digite o nome do servidor correto quando o openssl solicitar um "Common Name" em seu certificado. O "Common Name" em seu certificado ssl deve corresponder ao Fully Qualified Domain Name do seu servidor svn.
Note que se você tiver um certificado ssl assinado por uma CA legítima (Certsign, Verisign,) você não precisa gerar uma nova chave ssl e certificado. Você pode simplesmente usar o emitido pelo seu CA.
Primeiro, crie uma nova chave ssl com o comando openssl:
[root@server ~]# mkdir /etc/httpd/ssl
[root@server ~]# cd /etc/httpd/ssl
[root@server ssl]# openssl genrsa 4096 > svn.server.local.key
Generating RSA private key, 4096 bit long modulus
...............++
............................................................++
e is 65537 (0x10001)
Agora que você tem uma chave privada, vamos criar um certificado auto-assinado:
[root@server ssl]# openssl req -new -key svn.server.local.key -x509 -days 365 -out svn.server.local.crt
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:
Email Address []:
Por fim, edite o arquivo /etc/httpd/conf.d/ssl.conf para apontar para a chave e o certificado ssl recem criados.
Isso envolve a atualização das diretrizes "SSLCertificateFile" e "SSLCertificateKeyFile":
<VirtualHost _default_:443>
...
SSLCertificateFile /etc/httpd/ssl/svn.server.local.crt
SSLCertificateKeyFile /etc/httpd/ssl/svn.server.local.key
...
</ VirtualHost>
Observe que você NÃO deve colocar a sua chave privada e certificado ssl em um local acessível pelo servidor web. Geralmente colocando-os em /etc/httpd é suficiente ou algum outro diretório com apenas permissão de root. Note tambem que o certificado tem uma validade que pode ser ampliada caso necessário, essa validade é passada pelo parâmetro -days.
8 - Iniciar apache e pronto
É isso aí! Iniciar o apache e efetuar o check-out do seu novo repositório.
[root@server ~]# service httpd start
Em outra máquina utilize seu navegador web favorito e acesse https://IP DO SEU SERVIDOR/svn/.
Note que se você tentar acessar via http irá dar erro de permissão negada.
Note tambem que se você não colocar a / no final da url a pagina não será encontrada.
Note que o "Erro ao validar certificado do servidor" é porque utilizamos um certificado ssl auto-assinado.
obs.: Verifique se o firewall não está bloqueando a porta https. Se não foi alterada é a 443.
obs.: Para evitar as paginas de permissão negada e url não encontrada, você pode utilizar o mod_rewrite do apache para redirecionar para o endereço correto.
Bom é isso ai pessoal, qualquer duvida sugestão ou agradecimentos postem ai!
Valeu