场景:AD域中的Windows服务器仅使用SVNSERVE(而不使用Apache)而不使用VisualSVN托管Subversion存储库。

目标:通过GSSAPI通过SASL通过Kerberos验证用户对Subversion存储库的身份,并在Windows域中进行身份验证。

在多个站点上的频繁发布表明用户在此配置中经常死于“无法获取SASL机制列表”。我还没有看到任何实际正在运行的实例。有人在运行吗?

我问这个问题是由于2011年在Gentoo论坛上发布的,一个人正是在这种情况下审查了相关的源tarball,并得出结论,尽管一次这样的配置可能有效,但不再需要它的文件了在源中。

GEntoo forum discussion where poster claims svnserve+gssapi+sasl worked at one time, but no longer does.

现在,我没有断言该说法是准确的,但是我确实知道我被困在同一点,而且我还没有看到任何这样的设置声称“胜利”的帖子。如果有的话,请告知详细信息!

提前谢谢了。

最佳答案

我已经进行了管理(经过将近30个小时的头部爬取,编译和无源代码调试,以获得了不错的错误代码),才能使svnserve + SASL + GSSAPI正常工作!我的设置如下:

  • AD服务器是Debian 7.2上的Samba 4.1.0(从源构建)。
  • Subversion服务器是Solaris Express(SunOS 5.11 snv_151a i86pc i386 i86pc)上的Subversion 1.8.5。使用 native (Sun)SASL从源代码为x64构建。
  • Client是带有TortoiseSVN 1.8.2(x64二进制发行版)和Heimdal 1.5.1(来自安全端点的x64二进制)的Windows 7 x64。
  • 与涉及Kerberos的所有内容一样,您需要使正向和反向DNS平稳运行,时钟同步等。

  • 在具有域凭据的Windows框中执行的步骤:
  • 为Subversion服务器创建一个“svnserve”用户帐户(不是计算机帐户)。
  • 运行“ktpass -princ svn/[email protected] -mapuser DOMAIN.LOCAL\svnserve -crypto RC4-HMAC-NT -pass password -ptype KRB5_NT_PRINCIPAL -out svnserve.keytab”。您要做而不是想要为此帐户打开DES,否则Windows 7将拒绝对其进行身份验证。我先打开它(遵循食谱),然后又必须关闭它才能正常工作。

  • Subversion服务器的步骤:
  • 设置/etc/krb5/krb5.conf
    [libdefaults]
        default_realm = DOMAIN.LOCAL
    
    [realms]
        DOMAIN.LOCAL = {
            kdc = pdc.domain.local
            admin_server = pdc.domain.local
        }
    
    [domain_realm]
        .domain.local = DOMAIN.LOCAL
        domain.local = DOMAIN.LOCAL
    
    # Other defaults left as-is.
    
  • 设置repo/conf/svnserve.conf:
    [general]
    anon-access = none
    authz-db = authz
    realm = DOMAIN.LOCAL
    
    [sasl]
    use-sasl = true
    min-encryption = 0
    max-encryption = 256
    
  • 设置repo/conf/authz:
    [aliases]
    
    [groups]
    
    [/]
    * =
    # Still investigating whether access to the server can be controlled through an AD group.
    # Below is for [email protected], the realm appears to get lost.
    user = rw
    
  • 设置/etc/sasl/svn.conf:
    mech_list: GSSAPI
    
  • 将svnserve.keytab放到/etc/krb5/krb5.keytab中(sasl配置中的keytab似乎不做任何事情)。
  • 启动svnserve。

  • 针对客户的步骤:
  • 安装TortoiseSVN和Heimdal。
  • 在Subversion服务器上,将C:\ProgramData\Kerberos\krb5.conf编辑为/etc/krb5/krb5.conf。我还有一个其他的默认值,我独自留下。
  • 进行结帐,不需要密码!

  • 此设置的一个问题是svnserve进程必须能够读取/etc/krb5/krb5.keytab,因此需要稍微减少对此的权限。尽管svnserve进入了自己的区域,所以这对我来说不是问题。在测试过程中,我还遇到了mslsa_cc.dll崩溃的情况,但是,当一切都整理好之后,我再也没有看到任何崩溃的情况。

    进行一些争执后,您也许也可以在Windows上将其用于svnserve。我在Windows客户端上尝试了MIT Kerberos,但是每次启动时它都崩溃了,所以我放弃了。您可能会有更好的运气。

    更新:解决了崩溃问题-这是mslsa_cc.dll中的错误(类似于https://github.com/krb5/krb5/commit/7acb524f5aa00274771dbbfac19d2dd779aad409,这也使它略有错误,因为调用ANSIToUnicode的方式需要将nOutStringLen除以2)。 mslsa_cc.dll上的二进制修补程序是:
  • 偏移量0xB46:从FF 15 04 69 00更改为D1 EE 0F 1F40。
  • 偏移量0xB5E:从77更改为EB。
  • 10-04 13:07