Secure remote access to subversion repository

I was dealing with problem how to remotely access subversion server in secure way. There are (as far i know) two basic ways to do this and I was not satisfied with neither of them, due to some security and hard-to-setup-or-maintain problems. So I have created my own way how to remotely access subversion repository in secure and easy way.

First, I’ll try to describe existing ways to do this and what problems they have. I’m not mentioning use of svnserve listening on widely open Internet port, because this is so insecure that I’m not going to talk about it.

Apache DAV Subversion module

Pros:

  • You can use Apache modules  for user authentication (ie. via LDAP)
  • Use PKI certificates to secure network communication channel
  • Access rights managed by subversion configuration (svnserve.conf)

Cons:

  • Apache ? What is it some dummy alternative to nginx or lighttpd ?
  • You have to use Apache and its modules – this means one more layer with possible security problems and bugs (proper use PKI certificates will prevent most of this problems, but not all of them)
  • iI you run single instance of Apache, it will have read-write permission to your subversion repositorories, so will all possibly buggy web apps running under Apache – thats huge security problem – one bug in your web CMS can give attacker full access to all your repositories – thats nothing I’m dreaming off
  • Of course, you can run second instance of Apache to prevent previously mentioned problems, but this is second instance of Apache you have to take care of, configure it, maintain it and another point of possibly security problems.

So this points me to decision not to use Apache as server for SVN repositories (and also, I don’t want Apache on my system).

Subversion in tunnel mode (ie. ssh)

Pros:

  • You have to setup almost nothing, works out of the box (the tunnel, repository access rights needs a little work)
  • Secured by ssh

Cons:

  • All repository users must have access rights to repository (ie. single group with group read-write access on repository files)
  • Multiple repositories, means you should have separate group for each and manage access rights by adding/removing users from groups
  • Must setup users umask and possibly run svnserve with setgid set to have consistent filesystem rights
  • Again, each user needs read-write access to whole repository – this means each user can copy your whole repository, modify or even delete it – very secure 😉
  • Users must have system account (either local or ldap based, for ldap you have to carrefully limit which ldap users to import to system and what they can do (ie. only 10 from 1000 of employees work with svn)
  • Each user should have shell access to system (but ok, i think it is posible to limit shell access only to use svnserve, but who does it ?)

Again nothing to think about, too many possible problems for me, I don’t trust my users and no one should! So I’ve created simple solution that I think solves most (maybe all) mentioned problems previous solutions have.

Subversion in tunnel mode via svnserve

It is important that this mode works exactly the same way as standard subversion tunnel mode works, there is nothing to hack on client side and client doesn’t even notices that it is not using standard tunnel mode – there is only one exception, subversion client will not cache users repository password. It’s a bit disturbing and uncomfortable but it gives you a bit more security, so right now I think it is another positive side effect of this solution.

How it works:

  1. setup svnserve as usual (with all user accounts ans security permissions), under special user account (without shell access) on top of some repository, listening on some port on localhost (ie. 3690)
  2. setup another account for ssh access with shell pointing to our tunnel script (see bellow).
  3. for this account you can setup ssh key or certificate of anything your ssh allows you – this ssh can be distributed to svn users – I think you can event make it avaible on some internal site from where everyone can download it, because ssh is here used only for securing communication channel and not for authentication and authorization – this will do svnserve itself
  4. and thats all. You can integrate subversion server with your LDAP Directory Server using eldap SASL extension, to make user management easier.
  5. users can now access repository as usual using  svn+ssh://<server>/<directory> URL

Sample tunnel script:

#!/bin/bash -l

exec /bin/nc -q 1 -w 3 localhost 3690

For multiple repositories you should setup multiple subversion servers and have multiple access accounts, and modify tunnel script accordingly.

Pros:

  • works out of the box and very easy to setup, easier than two previously mentioned usage scenarios)
  • repository access fully managed by svnserve
  • all things configured on place – svnserve.conf, here you can limit user access to certain repository tries and so on
  • access secured by ssh (imho, very good piece of software)
  • command line svn (and possibly also other clients) doesn’t caches users passwords

Cons:

  • command line svn doesn’t caches users passwords
  • maybe compared to HTTP access to subversion, problems on some LANs where only HTTP/HTTPS port is allowed to use. But this problem has also standard subversion tunnel mode and this can be bypassed by use of OpenVPN, which will be surely helpful also for other purposes.