我们曾经在具有 LDAP 身份验证的 Windows 服务器上使用 Collabnet SVN/Apache 组合,虽然性能不是很好,但运行起来非常完美。
切换到全新安装的 Ubuntu 10 并设置 Apache/SVN/LDAP 配置后,我们可以通过 LDAP 进行 Active Directory 身份验证,以 HTTPS 方式访问我们的存储库。
我们现在遇到了一个非常奇怪的问题。每当新用户访问存储库时,我们的 SVN 客户端(我们有几个客户端,具体取决于工具,但为了论证的缘故,我们坚持使用 Tortoise SVN)都会报告“错误 500 - 未知响应”。为了解决这个问题,我们必须使用 Web 浏览器登录存储库并“向后”导航,直到它正常工作
例如:
- SVN 签出
https://svn.example.local/SVN/MyRepo/MyModule/
-错误 500(坏的) - Web浏览至
https://svn.example.local/SVN/MyRepo/MyModule/
- 错误 500 (坏的) - Web浏览至
https://svn.example.local/SVN/MyRepo/
- 错误 500 (坏的) - 网页浏览
https://svn.example.local/SVN/
- 禁止 403 (正确的) - 网页浏览至
https://svn.example.local/SVN/MyRepo/
- OK 200 (正确的) - SVN 签出
https://svn.example.local/SVN/MyRepo/MyModule/
-错误 500(坏的) - 网页浏览至
https://svn.example.local/SVN/MyRepo/MyModule/
- OK 200 (正确的) - SVN 结帐
https://svn.example.local/SVN/MyRepo/MyModule/
-OK 200(正确的)
它似乎需要对树进行身份验证,从上到下svnparentpath
直到所需的模块。
以前有人见过这样的事情吗?在我将其放回 Collabnet 的 SVN 服务器之前,有什么想法可以从哪里开始吗?
更新
使用 Apache2,这是/svn
我的 httpd.conf 的位置:
<Location /svn>
DAV svn
SVNParentPath /var/lib/svn
AuthName "Subversion Repositories"
AuthType Basic
AuthBasicProvider ldap
AuthzLDAPAuthoritative off
AuthLDAPURL "ldap://dc1.domain.local:389/DC=domain,DC=local?sAMAccountName?sub?(objectClass=*)" NONE
AuthLDAPBindDN "domain\apacheaccount"
AuthLDAPBindPassword superawesomepassword
require valid-user
</Location>
中唯一的错误/var/logs/apache2/error.log
是当我使用错误密码时出现的合法身份验证错误。在 中access.log
,错误 500 行如下所示:
192.168.161.101 - fname.sname [11/May/2010:08:39:08 +1000] "OPTIONS /svn/MyRepo HTTP/1.1" 500 634 "-" "SVN/1.6.6 (r40053) neon/0.28.6"
答案1
我使用的是 Debian“Lenny”设置,运行 Apache2/SVN,LDAP 通过 Apache 直接向 AD 进行身份验证,同时在同一台机器上托管 Trac 站点。我会尝试一下,但我需要更多信息...
SVN 访问是通过 Apache 的内置模块,所以我的第一个问题是 - 您是将其作为 SVN 独立进程运行,还是通过 Apache 运行(它似乎是 Apache,但我只是想确定一下)?第二个问题是,您使用的是 Apache2 还是 Apache (1.x)?第三个问题是,您是通过 PAM 使用 LDAP 身份验证,还是通过 Apache 的内置支持?
仅供参考,这是 Trac 的配置的一个(净化)版本,以及通过 AD 进行身份验证的 LDAP 设置(是的,它对任何人开放,因为 Trac 有自己的权限系统,在我的设置中,它对经过身份验证的用户默认为只读):
#Rudimentary Apache2 authentication for Active Directory (without group controls)
<Location /trac>
SetHandler mod_python
PythonInterpreter main_interpreter
PythonHandler trac.web.modpython_frontend
PythonOption TracEnvParentDir /srv/trac
PythonDebug on
Order deny,allow
Deny from all
Allow from 10.0.0.0/8
AuthType Basic
AuthName "Trac Projects"
AuthBasicProvider "ldap"
AuthLDAPURL "ldap://enterprise-dc.mycompany.com:3268/DC=localsite,DC=mycompany,DC=com?sAMAccountName?sub?(objectClass=user)"
AuthLDAPBindDN [email protected]
AuthLDAPBindPassword "supersecretpasswordthatnoonewillguess"
authzldapauthoritative On
require valid-user
# require ldap-group "CN=Users,DC=local-site,DC=mycompany,DC=com"
</Location>
对于您的目的而言更重要的是,使用该形式的身份验证作为模板,我们可以获取设置/etc/apache2/mods-enabled/dav_svn.conf
,这将控制您的 SVN 访问:
<Location /svn>
DAV svn
SVNParentPath /srv/svn
SVNAutoversioning on
Order deny,allow
Deny from all
Allow from 10.0.0.0/8
AuthType Basic
AuthName "Subversion Repository"
AuthBasicProvider "ldap"
AuthLDAPURL "ldap://enterprise-dc.mycompany.com:3268/DC=local-site,DC=mycompany,DC=com?sAMAccountName?sub?(objectClass=user)"
AuthLDAPBindDN [email protected]
AuthLDAPBindPassword "supersecretpasswordthatnoonewillguess"
authzldapauthoritative On
require valid-user
</Location>
我们的桌面对程序安装的控制相当严格,所以我并不担心有人 (a) 安装 SVN 客户端 (b) 找出要连接的确切服务器名称 (c) 进入存储库并搞乱一切,这就是安全性如此低的原因。但是,只需稍加调整,您就应该能够通过强制执行 AD 组(请注意第一个示例中注释掉的垃圾内容)重新使用此安排,并获得更严格的访问控制。
希望这对你有帮助。
更新(基于新信息)
我认为问题在于您没有针对全局目录进行身份验证。将端口号更改为我示例中的端口号,并确保将其指向“企业”级别(即不是子域的成员)的域控制器。因此,不要使用 site.enterprise.com,而是将其指向新端口号处的 enterprise.com。请注意,您可能不需要在设置中为用户名指定域名,因此如果它拒绝身份验证,请务必尝试不指定域名(请参阅我发布的示例);并使用“电子邮件样式”帐户名,而不是“域样式”布局。
我的怀疑是:全局目录“扁平化”了用户的搜索空间;但是通过在子域控制器上进行标准 LDAP 查询,我认为最初的失败是因为最初没有“答案”,直到子域中的域控制器可以找到答案。在第二次尝试时,答案被缓存,您就成功了。
答案2
我还不能发表评论,但我只想问一下,为什么不在只安装了 Core OS 的 Windows 2008 机器上运行 VisualSVN 服务器呢。我敢打赌,安装平台和 Ubuntu 一样小,你可以将整个 VisualSVN 目录树复制到新机器上。
显然,它无助于解决您当前的问题,但只是好奇您是否考虑过这个选项,以及您将它们全部切换在一起的理由是什么?