Apache + SVN + DAV + pwauth + authz = 403

Apache + SVN + DAV + pwauth + authz = 403

我使用 mod_svn_dav 在 Apache2 后面维护一组 SVN 存储库,并使用 pwauth 来验证用户(使用 mod_authnz_external)。我为有效用户和组 svn 设置了 Require 指令。这对我来说非常有效,但现在有必要引入更细粒度的权限 - 即仅允许特定用户访问特定存储库。据我所知,实现此目的的最佳(最简单)方法是使用内置的 authz 功能,通过将 AuthzSVNAccessFile 设置为列出谁可以访问什么的文件。这就是我打算做的事情。我当前的站点配置如下所示(为清晰起见,删除了日志配置等):

<VirtualHost *:81>
    <Location />
            allow from 127.0.0.1
            DAV svn
            SVNParentPath /var/svn
            SVNListParentPath On
            AuthType Basic
            AuthName "SVN repository"
            AuthBasicProvider external
            AuthExternal pwauth
            AuthzSVNAccessFile /var/svn/dav_authz
            Require valid-user
            Require group svn
    </Location>
    <IfModule mod_authnz_external.c>
            AddExternalAuth pwauth /usr/sbin/pwauth
            SetExternalAuthMethod pwauth pipe
    </IfModule>
</VirtualHost>

旁注:是的,*:81 - 我实际上已经在 nginx 和 svn.mydomain.com 代理后面运行它,并通过它在端口 81 上运行。

dav_authz 如下所示:

[/]
myuser = rw
* =

[RepoOne:/]
myuser = rw
* =

[RepoTwo:/]
mysuser = rw
someone = rw
* =

我期望这将使“myuser”拥有对所有内容的读/写访问权限,“someone”仅拥有对 RepoTwo 的读/写访问权限,而其他所有人都会被礼貌地告知滚开(即使他们是有效用户并属于 svn 组)。但事实并非如此。无论我怎么尝试,除了服务器给出一个糟糕的 403 错误之外,我什么也得不到。如果我恢复为不使用 AuthzSVNAccessFile,该错误就会消失,我可以再次正常登录(如果用户有效并属于 svn 组)。我尝试了不同顺序的指令(例如,将 [/] 放在最后)、不同格式的用户名(someuser、someuser@system、someuser/system、someuser\system)、删除 repo 配置并只保留 [/] 规则、将 [/] 规则设置为 * = rw、甚至完全清空文件、将 dav_authz 的所有权授予 www-data 等等,等等,等等 - 每次在更改之间重新启动 Apache - 每次都得到相同的 403。Apache 日志显示 myuser 正在访问该网站,而 403 响应、错误日志除了我的 Apache 重新启动之外没有显示任何其他内容。

我没什么主意,需要帮助!你能帮我吗?

JS

答案1

一些注释(来自基于路径的授权SVNBook章节):

  • 限制从父母继承到孩子
  • 没有提及用户意味着“无权访问”

即,您只能在根目录中添加用户,并在其中重新定义访问级别。这样,我将尝试类似

[/]
myuser = rw

[RepoTwo:/]
someone = rw

无关:出于可读性和可管理性方面的考虑,我更喜欢按 AuthzSVNAccessFile 部分内的组进行操作,而不是按用户进行操作,即使组在某些时候是单个用户

相关内容