我在 Linux 服务器上设置 Subversion 存储库的访问权限时遇到了一些问题。问题是我似乎只能实现全有或全无的结构。要么每个人都拥有对所有内容的读取权限,要么没有人拥有对任何内容的读取或写入权限。
设置:
SVN 存储库位于 /www/svn/repoA,repoB,repoC...
存储库由 Apache 提供服务,其位置在 etc/httpd/conf.d/subversion.conf 中定义为:
<Location /svn/repoA>
DAV svn
SVNPath /var/www/svn/repoA
AuthType Basic
AuthName "svn repo"
AuthUserFile /var/www/svn/svn-auth.conf
AuthzSVNAccessFile /var/www/svn/svn-access.conf
Require valid-user
</Location>
<Location /svn/repoB>
DAV svn
SVNPath /var/www/svn/repoB
AuthType Basic
AuthName "svn repo"
AuthUserFile /var/www/svn/svn-auth.conf
AuthzSVNAccessFile /var/www/svn/svn-access.conf
Require valid-user
</Location>
...
svn-access.conf 设置为:
[/]
* =
[/repoA]
* =
userA = rw
[/repoB]
* =
userB = rw
但是以用户 A 的身份检出 URL/svn/repoA 会导致禁止访问。
将其更改为
[/]
* =
userA = r
[/repoA]
* =
userA = rw
[/repoB]
* =
userB = rw
授予用户 A 对所有存储库(包括 repoB)的读取权限,但仅授予对 repoA 的读取权限!
因此为了让用户 A 获得对 repoB 的读写权限,我需要添加
[/]
userA = rw
这是精神上的。
我也尝试过改变
Require valid-user
到
Require user userA
对于 subversion.conf 中的 repoA,但这只给了我对它的读取权限。
我需要一种方法来默认拒绝每个人访问每个存储库,只有在明确定义时才授予读/写访问权限。
有人能告诉我我做错了什么吗?我花了几个小时测试和谷歌搜索,但一无所获,所以现在我发了这篇令人羞耻的帖子。
编辑
我采用了 Shane 的第一个解决方案并最终得到以下工作配置:
/etc/httpd/conf.d/subversion.conf:
<Location /svn>
DAV svn
SVNParentPath /var/www/svn
AuthType Basic
AuthName "Subversion repo"
AuthUserFile /var/svn-auth.conf
Require valid-user
</Location>
/var/svn-access.conf:
[/]
* =
[repoA:/]
* =
userA = rw
[repoB:/]
* =
userB = rw
答案1
您所遇到的问题的共同点是您的[/repoA]
和[/repoB]
部分根本没有执行任何操作,对吗?这是有原因的。
您授权的路径是不是相对于 authz 访问文件的位置;它们相对于处理访问控制的 SVN 存储库。
那么,您的[/]
部分?它授予对/svn/repoA/
和的访问权限/svn/repoB/
;它确实不是授予 的访问权限/svn/
。类似地,您的[/repoA]
部分授予/svn/repoA/repoA
和 的访问权限/svn/repoB/repoA
; 的规则将授予和 的[/trunk]
访问权限。/svn/repoA/trunk
/svn/repoB/trunk
您已SVNPath
为每个存储库设置了指令,但您为每个存储库指向相同的授权文件 - 因此每个存储库具有相同的访问规则。有一种语法可以为不同的存储库设置不同的授权,但那是在您使用时使用的SVNParentPath
。
因此,有两个选择:
切换到使用
SVNParentPath /var/www/svn
而不是在 Apache 配置中硬定义每个 repo,并更改 authz 文件以具有 repo 目标权限:[/] * = userA = r [repoA:/] * = userA = rw [repoB:/] * = userB = rw
对每个存储库使用不同的 authz 文件,记住授予访问权限的路径是相对于存储库的根目录的。
答案2
哇哦。首先,我会将 svn-auth.conf(和 svn-access.conf)从 apache 明确提供 http 请求的目录中删除。一些恶意的人会来请求该文件,并且他已经知道了你的一半安全问题,而无需尝试。
https://stackoverflow.com/questions/81361/how-to-setup-access-control-in-svn我认为这个答案似乎涵盖了您正在寻找的内容。