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.
Deve-se instalar, em primeiro lugar, o serviço de SASL. Em Ubuntu pode-se fazer isso com o seguinte comando:
sudo apt install sasl2-bin
Após a instalação deste pacote, deve-se editar o ficheiro /etc/default/saslauthd e a linhas que dizem
START=no MECHANISMS="pam"
Devem ser corrigidas para dizer
START=yes MECHANISMS="ldap"
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=/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 deverá preencher a zona <caminho base dos seus repositórios> 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:
DAEMON_ARGS="--daemon --pid-file /run/svnserve/svnserve.pid --root <caminho base dos seus repositórios> --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:
sudo groupadd -r svn
sudo useradd -r -d <caminho base dos seus repositórios> -g svn svn
sudo mkdir <caminho base dos seus repositórios>
sudo chown -R svn:svn <caminho base dos seus repositórios>
sudo 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:
sudo 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: PLAIN
ldap_group_dn: %r
ldap_group_match_method: filter
ldap_group_filter: (uniqueMember=%D)
ldap_group_attr: uniqueMember
Em sistemas baseados em Ubuntu, recomenda-se que crie um link simbólico da pasta /usr/lib/sasl2 em /etc:
sudo ln -s /usr/lib/sasl2 /etc
Também por causa das diferenças entre distribuições, se recomenda que dentro da pasta sasl2 mencionada se crie os links simbólicos de svn.conf para subversion.conf e svnserve.conf.
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
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
Para segurança, deve-se tornar este ficheiro ilegível excepto pelo utilizador root e o grupo root:
sudo chmod 640 /etc/saslauthd.conf
Por último, falta criar a pasta de logfiles do Subversion:
sudo mkdir /var/log/svnserve sudo chown svn:svn /var/log/svnserve
Pode-se, agora, arrancar os serviços SASLAUTHD e SVNSERVE:
sudo systemctl enable saslauthd sudo systemctl enable svnserve sudo systemctl start saslauthd sudo systemctl start svnserve
criar repositórios para os vários projectos. Para criar o repositório para o projecto, é preciso executar os seguintes comandos
sudo svnadmin create <caminho base dos seus repositórios>/<nome do projecto>
sudo chown -R svn:svn <caminho base dos seus repositórios>/<nome do projecto>
sudo chmod -R g-rwx,o-rwx <caminho base dos seus repositórios>/<nome do projecto>
O último comando é necessário para garantir que o serviço de Subversion consegue gerir na totalidade o repositório.
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 em cada 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 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 e 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=Teste,ou=Projects,dc=dominio,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 (<caminho base dos seus repositórios>/<nome do projecto>/conf/svnserve.conf) 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 "realm" é usado como forma de determinar se um utilizador pode ou não interagir com o repositório.
TODO:
- aplicação de encriptação.
- ACLs