Subversion 在使用 Web 浏览器进行身份验证之前会显示错误 500

Subversion 在使用 Web 浏览器进行身份验证之前会显示错误 500

我们曾经在具有 LDAP 身份验证的 Windows 服务器上使用 Collabnet SVN/Apache 组合,虽然性能不是很好,但运行起来非常完美。

切换到全新安装的 Ubuntu 10 并设置 Apache/SVN/LDAP 配置后,我们可以通过 LDAP 进行 Active Directory 身份验证,以 HTTPS 方式访问我们的存储库。

我们现在遇到了一个非常奇怪的问题。每当新用户访问存储库时,我们的 SVN 客户端(我们有几个客户端,具体取决于工具,但为了论证的缘故,我们坚持使用 Tortoise SVN)都会报告“错误 500 - 未知响应”。为了解决这个问题,我们必须使用 Web 浏览器登录存储库并“向后”导航,直到它正常工作

例如:

  1. SVN 签出https://svn.example.local/SVN/MyRepo/MyModule/-错误 500(坏的
  2. Web浏览至https://svn.example.local/SVN/MyRepo/MyModule/- 错误 500 (坏的
  3. Web浏览至https://svn.example.local/SVN/MyRepo/- 错误 500 (坏的
  4. 网页浏览https://svn.example.local/SVN/- 禁止 403 (正确的
  5. 网页浏览至https://svn.example.local/SVN/MyRepo/- OK 200 (正确的
  6. SVN 签出https://svn.example.local/SVN/MyRepo/MyModule/-错误 500(坏的
  7. 网页浏览至https://svn.example.local/SVN/MyRepo/MyModule/- OK 200 (正确的
  8. 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 目录树复制到新机器上。

显然,它无助于解决您当前的问题,但只是好奇您是否考虑过这个选项,以及您将它们全部切换在一起的理由是什么?

相关内容