>场景:AD域中的Windows服务器仅使用SVNSERVE(没有Apache(,而不是VisualSVN,托管Subversion存储库。
目标: 通过 GSSAPI 通过 SASL 对 Subversion 存储库的用户进行身份验证,并通过 Kerberos 对 Windows 域进行身份验证。
在多个站点中频繁发布表明用户在此配置中经常死胡同,并显示"无法获取 SASL 机制列表"。我还没有看到任何实际运行的实例。有人运行这个吗?
我问这个问题是因为2011年在Gentoo论坛上的一篇文章,其中有人正是在这种情况下审查了相关的源代码压缩包,并得出结论,虽然这样的配置可能曾经有效,但它所需的文件不再在源代码中。
GEntoo 论坛讨论,其中海报声称 svnserve+gssapi+sasl 曾经工作过,但现在不再有效。
现在,我不断言这种说法是准确的,但我知道我被困在完全相同的点上,而且我还没有看到任何声称"胜利"这样的设置的帖子。如果您有,请告知详细信息!
提前非常感谢。
我刚刚设法(经过近 30 个小时的挠头、编译和无源代码调试以获得体面的错误代码(让 svnserve+SASL+GSSAPI 工作! 我的设置如下:
- AD 服务器是 Debian 7.2 上的 Samba 4.1.0(从源代码构建(。
- Subversion server 是 Solaris Express 上的 Subversion 1.8.5(SunOS 5.11 snv_151a i86pc i386 i86pc(。 使用本机 (Sun( SASL 从源代码为 x64 构建。
- 客户端是带有TortoiseSVN 1.8.2(x64二进制版本(和Heimdal 1.5.1(来自安全端点的x64二进制文件(的Windows 7 x64 。
- 与涉及 Kerberos 的任何内容一样,您需要让正向和反向 DNS 顺利工作,时钟同步等。
带有域信誉的 Windows 框上的步骤:
- 为 Subversion 服务器创建一个 "svnserve" 用户帐户(不是计算机帐户(。
- 运行 "ktpass -princ svn/server.domain.local@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 user@DOMAIN.LOCAL, the realm appears to get lost. user = rw
-
设置/etc/sasl/svn.conf:
mech_list: GSSAPI
-
将 svnserve.keytab 放入/etc/krb5/krb5.keytab(sasl 配置中的键表似乎没有任何作用(。
- 启动 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,这也有点错误,因为 nOutStringLen 需要除以 2 才能调用 ANSIToUnicode 的方式(。 mslsa_cc.dll上的二进制补丁是:
- 偏移0xB46:从 FF 15 04 69 00 更改为 D1 EE 0F 1F 40。
- 偏移0xB5E:从 77 更改为 EB。
这个悬而未决的问题获得"风滚草"徽章以及我自己的大量额外研究之后,我得出的结论是,在当前的代码库下,Windows 下的 Subversion 主题组合实际上是不可能的。我相信 SASL 身份验证层中的某些内容是这里的问题,删除或显着更改了一些源以"破坏"我相信在某一点上起作用的东西。
我的解决方案是将 Apache 添加到与mod_auth_sspi的组合中,虽然它确实会降低存储库的速度,但身份验证效果很好。这似乎是身份验证要求的"修复"。
用SASL+LDAP对AD进行了身份验证,但没有SASL+GSSAPI,还有一个小警告:我必须在Windows中使用和运行来自Cygwin的svnserve。
1(在Linux中通过SASL + LDAP/AD获得svnserve身份验证用户非常容易(我知道问题是关于Windows中的svnserve,但请耐心等待(。使身份验证针对LDAP/AD工作的重要部分是saslauthd,并使用testaslauthd测试身份验证。
以 Ubuntu 为例:
1a(/etc/sasl2/svn.conf
pwcheck_method: saslauthd
mech_list: PLAIN
这告诉 Subversion/svnserve 使用 saslauthd 代表它进行身份验证。
1b(/etc/saslauthd.conf
ldap_servers: ldap://yourADserver.dept.org
ldap_search_base: DC=dept,DC=org
ldap_bind_dn: cn=bindaccount,dc=dept,dc=org
ldap_bind_pw: passwordOfbindaccount
ldap_deref: never
ldap_restart: yes
ldap_scope: sub
ldap_use_sasl: no
ldap_start_tls: no
ldap_version: 3
ldap_auth_method: bind
ldap_filter: sAMAccountName=%u
ldap_password_attr: userPassword
ldap_timeout: 10
ldap_cache_ttl: 5
ldap_cache_mem: 32768
1c( 通过测试进行测试
testsaslauthd -u myusername -p mypassword
1d( 如果成功,则运行 saslauthd,然后启动 svnserve。并使用任何 SVN 客户端来测试身份验证。
2(问题是,Cyrus的saslauthd没有本地移植到Windows,而且可能永远不会。答案是使用Cygwin,它有svnserve,testsaslauthd和saslauthd。
只需重复上述步骤..但svn.conf的位置可能不同。