Subversion + LDAP

Esta primeira parte deste manual destina-se a instalações baseadas no protocolo svn:// puro (sem ser por SSH ou por WebDAV) e presume a existência de um serviço LDAP em execução e correctamente configurado.

A integração de autenticação LDAP para controlo de acesso a repositórios Subversion está dependente do uso de SASL. Neste caso, o SASL (mais concretamente o serviço saslauthd) é responsável por fazer a ligação entre o serviço svnserve e o servidor de LDAP.

Como os caminhos podem variar e há inconsistências mesmo na mesma distribuição, há recomendações de certas ligações simbólicas que convém criar-se. De notar que, pelo menos em distribuições baseadas em Ubuntu, o svnserve não tem configurações base para uso com o systemd ou qualquer outro serviço de init alternativo. Assim sendo, também se apresenta aqui a listagem dos ficheiros necessários para que o svnserve possa ser adicionado ao arranque.

Excepto se indicado em contrário, estes comandos devem ser executados como root ou com o sudo.

Em sistemas baseados em Ubuntu (e provavelmente outros baseados em systemd) é necessário criar-se o seguinte ficheiro:

/etc/systemd/system/svnserve.service:

[Unit]
Description=Subversion protocol daemon
After=syslog.target network.target

[Service]
Type=forking
RuntimeDirectory=svnserve
PIDFile=/run/svnserve/svnserve.pid
EnvironmentFile=/safe/etc/default/svnserve
ExecStart=/usr/bin/svnserve $DAEMON_ARGS
User=svn
Group=svn
KillMode=control-group
Restart=on-failure

[Install]
WantedBy=multi-user.target
Alias=svnserve.service


Após criado, e para que o ficheiro seja reconhecido, deve executar-se:

systemctl daemon-reload


No Gentoo, usando OpenRC em vez de systemd, não é necessário criar-se nenhum ficheiro, dado que a distribuição já inclui um ficheiro /etc/init.d/svnserve apropriado.

Na configuração padrão do serviço svnserve em sistemas baseados em Ubuntu, deverá preencher a variável SVNROOT no ficheiro abaixo com o valor correcto. Poderá também alterar o caminho que se segue a "--log-file" para outro destino que lhe seja mais conveniente.

/etc/default/svnserve.conf:

SVNROOT="<caminho base dos seus repositórios>"
DAEMON_ARGS="--daemon --pid-file /run/svnserve/svnserve.pid --root $SVNROOT --log-file /var/log/svnserve/svnserve.log"


Idealmente, o serviço svnserve corre com utilizador e grupo próprios (svn:svn ou svn:svnusers), bem como o serviço saslauthd (sasl:sasl). Caso não existam esses utilizadores, pode criá-los da seguinte forma:

groupadd -r svn
useradd -r -d <caminho base dos seus repositórios> -g svn svn
mkdir <caminho base dos seus repositórios>
chown -R svn:svn <caminho base dos seus repositórios>
chmod g-rwx,o-rwx <caminho base dos seus repositórios>


Explicação dos comandos acima:

  • groupadd -r svn: cria o grupo "svn" como sendo um grupo de sistema (opção -r)
  • useradd -r -d <caminho base dos seus repositórios> -g svn svn: cria um utilizador de sistema (opção -r) com o nome svn, com o seu caminho base a ser na pasta <caminho base dos seus repositórios> (opção -d <caminho base dos seus repositórios>) a pertencer ao grupo svn (opção -g svn) e com o nome "svn".
  • mkdir <caminho base dos seus repositórios>: cria a pasta raíz onde poderá colocar todos os seus repositórios. Este passo é opcional se já tiver uma pasta com os repositórios.
  • chown -R svn:svn <caminho base dos seus repositórios>: torna a pasta dos seus repositórios e todo o seu conteúdo como propriedade do utilizador svn e do grupo svn
  • chmod g-rwx,o-rwx <caminho base dos seus repositórios>: define permissões de acesso à pasta dos repositórios, determinando que apenas o utilizador svn tem acesso.

É preciso ter em consideração que, em alguns sistemas, para que o svnserve possa contactar o serviço saslauthd é preciso que o utilizador svn também pertença ao grupo sasl. A autenticação é feita através de uma socket Unix e, para que o svnserve possa autenticar-se através do saslauthd, é preciso que tenha acesso à pasta /var/run/saslauthd, onde se encontrará a socket com o nome "mux". Para permitir esse acesso, e considerando os nomes apresentados, basta executar o comando "gpasswd -a <user> <group>", substituindo <user> e <group> pelo nome do utilizador e groupo apropriados, respectivamente, tal como demonstrado a seguir:

gpasswd -a svn sasl


Para cada serviço que utilize o saslauthd é necessário criar o ficheiro de configuração respectivo. Tenha em atenção que o caminho para colocação deste ficheiro varia entre as várias distribuições

/usr/lib/sasl2/svn.conf (Ubuntu e derivados) ou /etc/sasl2/svn.conf (Gentoo):

pwcheck_method: saslauthd
mech_list: LDAP


Em sistemas baseados em Ubuntu, recomenda-se que crie um link simbólico da pasta /usr/lib/sasl2 em /etc:

ln -s /usr/lib/sasl2 /etc


De seguida, cria-se ou edita-se o ficheiro que permite ao serviço saslauthd consultar a base de dados LDAP. O modelo abaixo pode ser usado, devendo ser adaptado conforme necessário:

/etc/saslauthd.conf:

ldap_servers: ldap://localhost
ldap_port: 389
ldap_version: 3
ldap_password_attr: userPassword
ldap_auth_method: bind
ldap_filter: (uid=%u)
ldap_search_base: ou=Users,dc=dominio,dc=pt
ldap_bind_pw: <password do utilizador LDAP>
ldap_bind_dn: cn=admin,dc=dominio,dc=pt


Agora só falta editar o ficheiro de configuração de cada repositório. Dentro de um repositório Subversion já criado, há um ficheiro chamado svnserve.conf na pasta conf do respositório. Eis um modelo base

<repositório>/conf/svnserve.conf:

[general]

anon-access = none
auth-access = write

[sasl]
use-sasl = true
min-encryption = 0
max-encryption = 256


Autenticação ao repositório

A configuração apresentada acima apenas permite decidir que os utilizadores devidamente registados no directório LDAP tenham acesso. No entanto, não executa qualquer tipo de verificação de permissões de acesso aos repositórios específicos, aceitando qualquer utilizador devidamente autenticado.

Para que possa fazer limitação do acesso por repositório, é necessário efectuar algumas alterações na configuração do saslauthd, no conteúdo do directório LDAP e nos ficheiros de configuração dos repositórios.

Em primeiro lugar, no ficheiro de configuração do saslauthd deverá acrescentar, no fim, as seguintes linhas:

ldap_default_realm: %r
ldap_restart: yes
ldap_scope: one

ldap_group_dn: %r
ldap_group_match_method: attr
ldap_group_filter: (uniqueMember=%D)
ldap_group_attr:  uniqueMember


Em segundo lugar, é preciso acrescentar ao directório LDAP a informação de pertença aos projectos. Caso essa informação já exista com outra estrutura, os dados deverão ser adaptados e este passo é opcional. Neste caso, criou-se uma estrutura de projectos dentro de uma unidade organizacional Projects. Recomenda-se o uso do comando shelldap para manipular a árvore de directório. Imaginando que tenha um projecto Teste, eis a estrutura que recomendamos:

cn=members,ou=Teste,ou=Projects,dc=dominio,dc=pt


Neste caso, cn=members é um objecto da classe groupOfUniqueNames quer ou=Teste, quer ou=Projects são organizationalUnit.

Dentro do objecto cn=members, pode-se criar entradas a descrever os membros, da seguinte forma:

dn: cn=members,ou=pkd,ou=Internal,ou=Projects,dc=tecporto,dc=pt
objectClass: groupOfUniqueNames
cn: members
uniqueMember: uid=utilizador1,ou=Users,dc=dominio,dc=pt
uniqueMember: uid=utilizador2,ou=Users,dc=dominio,dc=pt
uniqueMember: uid=utilizador3,ou=Users,dc=dominio,dc=pt
...
...


Por último, deverá alterar o ficheiro de configuração do repositório para incluir o "Realm" que identifica o projecto no directório LDAP. Para tal, na secção [general] do ficheiro svnserve.conf dentro da pasta conf do repositório, deverá acrescentar a seguinte linha:

realm = cn=members,ou=Teste,ou=Projects,dc=dominio,dc=pt


Com esta linha, em conjugação com a configuração do saslauthd, o "ream" é usado como forma de determinar se um utilizador pode ou não interagir com o repositório.


TODO:

  • aplicação de encriptação.
  • ACLs