如何通过WebSVN限制存储库访问?

时间:2009-06-02 11:57:31

标签: svn apache access-control websvn

注意:我最初在serverfault.com上问了这个问题,但到目前为止只得到了一个回复,我想的越多,我越觉得堆栈溢出可能更好。

我有多个subversion存储库,通过Apache 2.2和WebDAV提供服务。它们都位于中心位置,我使用这篇debian-administration.org文章作为基础(虽然我放弃了对简单的htpasswd文件使用数据库身份验证)。

从那时起,我也开始使用WebSVN。我的问题是并非系统上的所有用户都应该能够访问不同的存储库,而WebSVN的默认设置是允许任何可以进行身份​​验证的用户。

根据WebSVN文档,解决此问题的最佳方法是使用subversion的路径访问系统,因此我希望使用AuthzSVNAccessFile指令创建它。

当我这样做时,我不断收到“403 Forbidden”消息。

我的文件如下所示:

我在文件中有默认策略设置:

<Location /svn/>
  DAV svn
  SVNParentPath  /var/lib/svn/repository

  Order deny,allow
  Deny from all
</Location>

每个存储库都会获得如下所示的策略文件:

<Location /svn/sysadmin/>
    Include  /var/lib/svn/conf/default_auth.conf
    AuthName "Repository for sysadmin"
    require user joebloggs jimsmith mickmurphy
</Location>

default_auth.conf文件包含:

SVNParentPath      /var/lib/svn/repository
AuthType           basic
AuthUserFile       /var/lib/svn/conf/.dav_svn.passwd
AuthzSVNAccessFile /var/lib/svn/conf/svnaccess.conf

我不完全确定为什么我需要default_auth.conf中的第二个SVNParentPath,但是我今天刚刚添加了,因为我在添加AuthzSVNAccessFile指令时收到了错误消息。

使用完全宽松的访问文件

[/]
joebloggs = rw

系统工作正常(并且基本上没有变化),但是当我开始尝试添加任何类型的限制时,例如

[sysadmin:/]
joebloggs = rw

相反,我再次收到“权限被拒绝”错误。日志文件条目是:

[Thu May 28 10:40:17 2009] [error] [client 89.100.219.180] Access denied: 'joebloggs' GET websvn:/
[Thu May 28 10:40:20 2009] [error] [client 89.100.219.180] Access denied: 'joebloggs' GET svn:/sysadmin

我需要做些什么才能让它发挥作用?配置apache是​​错误的,还是我对svnaccess.conf文件的理解不正确?

如果我以错误的方式解决这个问题,我对我的整体方法没有特别的依恋,所以也可以随意提供替代方案。

更新(20090528-1600):

我尝试实施this answer,但我仍然无法让它正常工作。

我知道大部分配置都是正确的,因为我添加了

[/]
joebloggs = rw

一开始,'joebloggs'就可以获得所有正确的访问权限。

当我尝试使用特定于存储库时,执行类似

的操作
[/]
joebloggs = rw

[sysadmin:/]
mickmurphy = rw

然后我得到mickmurphy的许可被拒绝错误(joebloggs仍然有效),错误类似于我以前的错误

[Thu May 28 10:40:20 2009] [error] [client 89.100.219.180] Access denied: 'mickmurphy' GET svn:/sysadmin

另外,我之前忘记解释所有我的存储库都在

下面
/var/lib/svn/repository

更新(20090529-1245):

仍然没有运气让这个工作,但所有迹象似乎都指向了颠覆中的路径访问控制不能正常工作的问题。我的假设是我没有配置apache或svn来正确识别我的存储库结构。

这是因为'[/]'条目似乎完美无缺。

在我看来,这个问题可能更适合StackOverflow?

2 个答案:

答案 0 :(得分:1)

您可以使用apache的htpasswd实用程序(位于bin目录中)生成md5密码文件。

然后,在你的httpd.conf中:

<Location /svn>
     DAV svn
     SVNParentPath "repo path"
     AuthType Basic
     AuthName "Repository"
     AuthUserFile "password file path"
     Require valid-user
     SVNListParentPath on #if you want a repository listing for the whole svn directory
</Location>

这将需要用户身份验证,并且只接受位于密码文件(来自htpasswd)的用户名/密码组合以进行访问。

此外,您还可以指定对每个人的只读访问权限,但通过以下(位置标记内)使用密码文件进行提交等:

<LimitExcept GET PROPFIND OPTIONS REPORT>
     Require valid-user
</LimitExcept>

如果我理解你需要什么,这应该解决它用于用户级访问。

编辑:

我忘了提及,如果您使用密码文件,请确保无法通过网络访问(即,在存储它的apache中没有分配别名或目录。)

答案 1 :(得分:0)

您必须为每个人提供对root用户的读取权限。然后根据需要从特定存储库中删除读取访问。使用用户组可能有助于保持较小的配置。

您可以尝试这样:

[/]
* = r

[sysadmin:/]
mickmurphy =
joebloggs = rw