              Using Cyrus SASL Authentication with Subversion
              ===============================================


Contents
========

  1. Obtaining and Building the Cyrus SASL Library
  2. Building Subversion with Cyrus SASL Support
  3. Theory
  4. Configuration
  5. Compatibility
  6. Encryption
  7. Known Issues
  8. GSSAPI


1. Obtaining and Building the Cyrus SASL Library
================================================

  Subversion 1.5 introduces support for the Cyrus SASL (Simple Authentication
  and Security Layer) library for the svn:// protocol and svnserve server.
  
  Only version 2.1.x is supported.  You can get the latest version of the
  library from:
  
    ftp://ftp.andrew.cmu.edu/pub/cyrus-mail/
  
  To build Cyrus SASL on Unix-like systems, follow the usual ./configure
  && make && make install process.  Cyrus SASL has many ./configure options
  to control which authentication mechanisms and password-checking methods
  should be built.  On Windows, follow the instructions in the
  doc/windows.html file in the Cyrus SASL sources.


2. Building Subversion with Cyrus SASL Support
==============================================

  On Unix, if you have Cyrus SASL installed in one of the standard locations
  (/usr or /usr/local), the configure script should automatically detect it.
  If the library is installed elsewhere you can use the --with-sasl=PATH
  switch to the configure script.
  
  On Windows, once you have built the library, pass --with-sasl=PATH to the
  gen-make.py script, where PATH is the directory where Cyrus SASL was built.


3. Theory
=========

  From Wikipedia: "SASL is a framework for authentication and data security in
  Internet protocols.  It decouples authentication mechanisms from application
  protocols, in theory allowing any authentication mechanism supported by SASL
  to be used in any application protocol that uses SASL."
  
  In practice, the server sends a list of authentication mechanisms that it
  supports.  The client then selects one of these mechanisms based on what the
  client supports, and informs the server of its decision.  After that, a
  number of messages are exchanged until either authentication succeeds or an
  error occurs.  In the latter case, the client is allowed to restart
  authentication.
  
  The svn:// protocol has always supported this type of negotiation.  However,
  only the CRAM-MD5 and ANONYMOUS mechanisms were implemented.  Cyrus SASL
  supports all these, and, in addition, provides a host of other mechanisms
  such as DIGEST-MD5, OTP (One-Time Passwords), GSSAPI (used for Kerberos
  authentication), NTLM (NT LAN Manager), SRP (Secure Remote Password), and
  others.  The exact list of available mechanisms depends on how SASL was
  compiled, as many of them either have external dependencies, or are not
  built by default.  Also, because each mechanism is actually a shared library
  that is dynamically loaded at runtime, many distributions package these
  mechanisms separately from the core library.


4. Configuration
================

  On the client side, you don't have to do anything special to enable Cyrus
  SASL, it will always be used if you built Subversion with SASL support.  On
  the server side, Cyrus SASL will not be used by default because some extra
  configuration steps are required.
  
  First, you need to configure how the Cyrus SASL library should authenticate
  a client's username and password.  These options are not stored in
  svnserve.conf, but in a special configuration file read by Cyrus SASL.  This
  file must be named svn.conf, and must be readable by the svnserve process.
  Cyrus SASL will look for this file in a known location, usually the same
  directory where its plugins are located, i.e. /usr/lib/sasl2.  Some SASL
  distributions will look for the file in a different directory, e.g.
  /etc/sasl2.
  
  The list of possible options can be found in the doc/options.html file in the
  Cyrus SASL sources.  A simple svn.conf might look like this:
  
    pwcheck_method: auxprop
    auxprop_plugin: sasldb
    mech_list: ANONYMOUS DIGEST-MD5
  
  This tells SASL to use its own password database (usually stored in
  /etc/sasldb2) to check user passwords, and restricts the list of
  authentication mechanisms to just ANONYMOUS and DIGEST-MD5.
  
  To add usernames and passwords to Cyrus SASL's database, use the saslpasswd2
  command, like this:
  
    saslpasswd2 -c -u realm username
    
  For this to work, you need to be root (or a member of the "sasl" group).
  Check that you have created the user correctly with sasldblistusers2.
  
  IMPORTANT: The "realm" argument to the saslpasswd2 command must be the same
  realm that you specify in the svnserve.conf file.  svnserve will tell SASL
  to use that realm when authenticating, and if they do not match,
  authentication will fail.  You should avoid realms with spaces in them,
  because SASL doesn't like them.
  
  IMPORTANT: If you are using sasldb, svnserve must have read access to the
  /etc/sasldb2 file.  If you are going to use the OTP mechanism, you also need
  write access.

  There are many other ways to configure SASL.  Instead of storing passwords
  in a local database, you can use Kerberos, LDAP, you can store passwords in
  a SQL database, etc.  Read the SASL documentation for details.
  
  After creating the svn.conf file, you need to tell svnserve to start
  using Cyrus SASL for authentication.  To do this, just set "use-sasl" to
  "true" in the [sasl] section of the svnserve.conf file.  You should now be
  able to authenticate.
  
  On Windows, some additional steps are required.  To tell SASL where to find
  its plugins and configuration files, you need to create the following
  registry key (using a registry editing tool such as regedit):
  
    [HKEY_LOCAL_MACHINE\SOFTWARE\Carnegie Mellon\Project Cyrus\SASL Library]
  
  and add two keys to it:
  
    "SearchPath": set this to the path where SASL's plugins (the *.dll files)
                  are located
    "ConfFile":   set this to the path where Cyrus SASL should look for the
                  svn.conf file

5. Compatibility
================

  All 1.x clients, with or without Cyrus SASL support, will be able to
  authenticate against all 1.x servers that do not have Cyrus SASL enabled.
  Note that the CRAM-MD5 and ANONYMOUS mechanisms are actually built into
  Subversion, so you'll be able to use them even if the corresponding Cyrus
  SASL plugins are missing.
  
  1.x clients without Cyrus SASL support will be able to authenticate against
  1.5+ servers with SASL enabled, provided the server allows the CRAM-MD5
  and/or ANONYMOUS mechanisms.
  
  1.5+ clients with Cyrus SASL support will be able to authenticate against
  1.5+ servers with SASL enabled, provided at least one of the mechanisms
  supported by the server is also supported by the client.

  
6. Encryption
=============

  In addition to providing authentication, the Cyrus SASL library can also
  provide data confidentiality (a.k.a. encryption).  Not all SASL mechanisms
  support encryption (e.g. DIGEST-MD5 does, CRAM-MD5 doesn't).  To control the
  level of encryption, you can use two additional svnserve.conf options,
  min-encryption and max-encryption.  A value of 0 for either of these means
  "no encryption", 1 means "protect data integrity, but not confidentiality",
  and values greater than 1 correspond to the desired encryption key length,
  in bits.
  
  For example:
  
    min-encryption    max-encryption                   result
    --------------    --------------      ---------------------------------
          0                 0             encryption is disabled

          1                 1             data will be protected against
                                          tampering, but will not be encrypted

          0                256            allow encryption for those clients
                                          that support it, but don't require
                                          it

         128               256            require at least 128-bit encryption


7. Known Issues
===============

  Cyrus SASL has two authentication mechanisms, PLAIN and LOGIN, that send the
  password over the network in plain text.  This would be fine if the
  transmission medium was already encrypted with TLS (Transport Layer
  Security).  However, the svn:// protocol doesn't support TLS yet, so both
  these mechanisms are currently disabled in both the client and the server.
  
  As a consequence, you won't be able to use the saslauthd daemon to
  authenticate users, because that method only works with plain text passwords.

8. GSSAPI
=========

  The realm in svnserve.conf is your Kerberos authentation realm,
  e.g. "EXAMPLE.COM".  Cyrus's GSSAPI implementation does not support
  encryption, except for very basic 56-bit DES.  If you leave the encrypt
  settings out of your svnserve.conf entirely, you're fine; just don't set
  max-encryption higher than 56.

  You need a Kerberos principal for each svn server, in the form
  "svn/${SERVER_FQDN}@${REALM}", e.g. "svn/svn1.example.com@EXAMPLE.COM".
  If you don't store it in /etc/krb5.keytab, you'll need to set the
  KRB5_KTNAME environment variable when starting svnserve, e.g.

    KRB5_KTNAME=/etc/svn.keytab sudo -u svn svnserve -d -r /svn

  This keytab file must also be readable by the svnserve process.

  All you need in the svn.conf file is:

    mech_list: gssapi
