Subversion 对 repo 子文件夹的访问控制

Subversion 对 repo 子文件夹的访问控制

平台/版本:
Windows Server 2008 R2 Std SP1(64 位)
CollabNet Subversion Apache 2.2.23(win32)
CollabNet Subversion Client Svnserve V1.7.8
使用 SSPI(活动目录)进行身份验证
用户在 Windows 7 Pro 上运行 Tortoise SVN Client V1.8.11(64 位)或更高版本

我们使用访问控制文件来限制谁有权访问 Subversion 顶级存储库。我们现在想要限制对顶级下某些文件夹的访问。我们参考了以下示例,但它们似乎对我们不起作用:

https://nithint.wordpress.com/2009/12/17/format-of-svn-access-file-for-path-based-authorization/
https://www.open.collab.net/community/subversion/svnbook/svn.serverconfig.pathbasedauthz.html

我们发现,如果您拥有顶层的访问权限,那么您就可以访问所有下层文件夹,包括那些应该被拒绝访问的文件夹。此外,如果您没有顶层的访问权限,但被授予了下层访问权限,您仍然无法访问下层。(我们对后者表示满意,但觉得很奇怪,因为它似乎与网站关于权限的说法相矛盾,即下层的权限应该覆盖上层的权限。)下层的访问控制似乎被忽略了。

我们想要的是:

Junk_repo – 顶级,授予 Beth、Eric 和 Joe 访问权限
Junk_repo/Commercial – 授予 Beth、Eric 和 Joe 访问权限
Junk_repo/Military – 授予 Beth 和 Eric 访问权限。拒绝 Joe 访问

我们尝试使用组并按组设置权限。(我们使用域\用户 ID 活动目录身份验证,因此我们的访问控制文件也使用域\用户 ID 格式。)

团体:

Junk_repo_team = domain\beth, domain\eric, domain\joe
Junk_repo_comm_team = domain\beth, domain\eric, domain\joe
Junk_repo_mil_team = domain\beth, domain\eric (没有 Joe)

访问方式:

[Junk_repo:/]
@Junk_repo_team = rw   //Beth, Eric Joe have access 

[Junk_repo:/Commercial]  
@Junk_repo_comm_team = rw   // commercial team (Beth, Eric, Joe) has access  

[Junk_repo:/Military]  
@Junk_repo_mil_team = rw    // military team (Beth, Eric) has access. No access for Joe

上述操作失败了,因此我们尝试通过列出每个级别的用户 ID 来设置权限:

[Junk_repo:/]  
domain\beth = rw   //Beth, Eric and Joe have access  
domain\eric = rw   
domain\joe = rw

[Junk_repo:/Commercial]  
domain\beth = rw   //Beth, Eric and Joe have access  
domain\eric = rw   
domain\joe = rw  

[Junk_repo:/Military]  
//Beth and Eric have access.  Joe does not have access. 
domain\beth = rw
domain\eric = rw   
domain\joe=
//We even tried  specifically denying Joe access to the Military folder by listing his id without anything after the equal sign. 

在这两种情况下,Joe 都能够访问 Junk_repo/Military 文件夹,而我们明确地不希望他访问该文件夹。

您是否有过在存储库的各个层级阻止访问的经验?如果有,您是否发现我们做错了什么?

SVN 位置

<Location /Junk_repo>
DAV svn
SVNPath E:/svn_repository/Junk_repo
AuthType Basic
AuthName "Subversion Junk_repo repository"
Require valid-user
ErrorDocument 404 default
</Location>

答案1

你忘记了一些显而易见的事情(在第一次尝试中,必须失败)

  • ACL 是从父母那里继承到孩子的
  • 如果你想改变规则,你必须写一个规则,修改访问权限
  • 如果你使用 authz-file 与 Apache 提供的存储库,你必须拥有
    • SVN-Location 中的相关指令
    • LoadModule 用于基于路径的授权

(最后一点可能是主要原因——您没有基于路径的授权,而且我无法检查 CollabNet 的默认设置)

因此,对于以群体为中心的游戏,你有:

  1. @Junk_repo_team 有权访问 Junk_repo 的根目录
  2. @Junk_repo_team@Junk_repo_comm_team 有权访问/Commercial节点(直接规则和继承)
  3. @Junk_repo_team@Junk_repo_mil_team 有权访问/Military节点(直接规则和继承)-因此,Joe作为@Junk_repo_team 的成员有权访问节点

第二条具有个人访问权限的规则集是差不多了乍一看,只有一些缩短(由于规则继承)可以立即应用,例如:

[Junk_repo:/]
domain\beth = rw
domain\eric = rw
domain\joe = rw

[Junk_repo:/Military]
domain\joe=

(可以跳过从根规则继承的规则,只需使用重新定义规则)并且在这个表单中我希望看到 Joe 的“无权访问”。

但是,因为你使用了相当老版本的 SVN Book(它没有注意别名),我不记得了,domain\joeauth-file 中的用户名是否适用无法测试您的设置(您没有显示任何用户的任何修订的日志输出,但基于 LDAP 的名称可以有不同的形式)我会建议稍微完善的设置(最小的差异:两者都有别名,一个是基于组的,接下来有仅限组的规则),基于原始SVN 1.8 版 SVN 手册

某些身份验证系统需要并携带相对较短的用户名,如我们在此描述的那种 - harry、sally、joe 等等。但其他身份验证系统(例如使用 LDAP 存储或 SSL 客户端证书的系统)可能携带更复杂的用户名。例如,在受 LDAP 保护的系统中,Harry 的用户名可能是 CN=Harold Hacker,OU=Engineers,DC=red-bean,DC=com。使用这样的用户名,访问文件可能会变得非常臃肿,因为用户名太长或晦涩难懂,容易输入错误。幸运的是,Subversion 1.5 在访问文件语法中引入了用户名别名。用户名别名允许您只需在语句中输入一次正确的复杂用户名,该语句会为其分配一个更容易理解的别名。

基于 AD 的用户名正是这种情况,因此我们将在定义规则和组之前为所有用户设置别名(针对第 1 次配置)

基于组的配置

[aliases]
beth = full and tested username of beth
eric = full and tested username of eric
joe = full and tested username of joe
[groups]
Junk_repo_team = &beth, &eric, &joe
Junk_repo_comm_team = &beth, &eric, &joe
Junk_repo_mil_team = &beth, &eric

[Junk_repo:/]
@Junk_repo_team = rw

[Junk_repo:/Commercial]
@Junk_repo_team = // no inheritance mess!!! only direct-rules
@Junk_repo_comm_team = rw

[Junk_repo:/Military]
@Junk_repo_team = // no inheritance mess!!! only direct-rules
@Junk_repo_mil_team = rw

(我可以忽略抑制商业的继承规则,但不能忽略抑制军事的继承规则,并且不能为两个节点选择相同性)

基于用户的配置

[aliases]
beth = full and tested username of beth
eric = full and tested username of eric
joe = full and tested username of joe

[Junk_repo:/]
&beth = rw
&eric = rw
&joe = rw

[Junk_repo:/Military]
&joe =

PS:Collabnet 的 SVN 堆栈很好在 CollabNet Edge 时代,当今首选的解决方案(从我的角度来看)是可视化 SVN 服务器具有所有最新功能、GUI 管理控制台(用于所有任务)、远程管理......

答案2

我们发现子文件夹 repo 权限必须输入为
[Junk_repo:/trunk/Military],
而不是 [Junk_repo:/Military]。(设置中缺少 Trunk。)Military 不是路径中的实际文件夹,而是 Junk_repo 主干颠覆区域外的一个文件夹。

相关内容