我正在开展一个项目,其中我有一个包含所有用户及其组成员身份的 ApacheDS。组成员身份存储为每个组的成员属性,并且我进行了架构修改,因此每个用户都有一个 memberOf 属性,这使得在进行授权时检查组成员身份变得非常简单。我需要根据用户的组成员身份授予他们访问 Subversion 存储库的权限,并立即启动并运行它。
然而,我的客户刚刚告诉我,他在指定要求时忘记提到一个“小”细节。他们显然也有几个存储库,其中需要对某些子文件夹有更严格的要求。因此,为了想出一个简单的解决方案,我认为我可以简单地将我的 LDAP 要求指令与 AuthzSVNAccessFile 指令结合起来。
这是我的配置:
<Location /TestClosedProject>
SVNPath /repos/TestClosedProject
SVNListParentPath on
# Include shared LDAP settings, binddn, passwords, ldapurl etc.
Include /svn/conf/ldapCommonSettings
# LDAP Authentication & Authorization is final; do not check other databases
AuthzLDAPAuthoritative on
AuthName "TestClosedProject"
# Admin group has full access
Require ldap-attribute memberOf=cn=TestProject-admins,ou=groups,dc=somedomain,dc=somecountry
# Members group has read-only access
<Limit GET PROPFIND OPTIONS REPORT>
Require ldap-attribute memberOf=cn=TestProject-members,ou=groups,dc=somedomain,dc=somecountry
</Limit>
</Location>
这允许 TestProject 成员中的任何人读取 /TestProject 中的代码,并且测试管理员拥有完全访问权限。
但是,当我插入AuthzSVNAccessFile /svn/conf/TestClosedProject.svnAuth
上述配置时,可以通过指定 LDAP 中存在但不是 -admins 或 -members 组成员的用户来覆盖 svnAuth 文件中所需的 ldap-attribute 指令。/svn/conf/TestClosedProject.svnAuth 的内容:
[groups]
supporters = jrf,agata
admins = fj,jrf
members = fj,jrf
[/]
* =
@members = r
@admins = rw
[TestClosedProject:/support]
@supporters = rw
@members = r
有问题的情况是
- 他们的 LDAP 更新非常频繁/自动
- 而 svnAuth 文件是手动维护的
- 因此,如果某位员工被解雇/离职,他将自动从 TestProject-members/TestProject-admins 组中删除 - 但由于其他一些内部系统,他将继续是 LDAP 中的用户,但没有“项目组”成员资格。只要没有 svnAuth 文件授予他访问项目文件夹的权限,这就可以正常工作。
- 由于 svnAuth 文件是手动维护的,因此它们通常不会像 LDAP 组成员身份那样定期更新 - 因此被解雇的员工实际上仍会在 svnAuth 文件中被提及,从而可以访问存储库,即使他不再是任何所需组的成员。
有没有办法设置它,以便只有成员或管理员 LDAP 组中的用户才能使用 svnAuth 文件获得访问权限?基本上,我只想在委托给 svnAuth 文件之前拒绝任何不属于这两个组的人的访问权限 - 这可能吗 - 如果可以,我该如何指定?
答案1
以下是我管理存储库访问的方法:
- 每个存储库都有一个“admin”目录,其中包含 authz 文件
- 我设置了 authz 文件来将“admin”目录的访问权限限制为存储库的“所有者”。
- 我有一个 cron 作业检查“admin”目录中的变化,并将 authz 文件复制到存储库中。
除了“需要有效用户”之外,我没有在 Apache 配置中执行任何其他操作(这样,仅在添加新的存储库时才需要重新启动 Apache)。
这样,我就将所有存储库权限的维护工作都交给了存储库的所有者。这可能无法直接解决您的问题,因为它不包含任何 LDAP 组,但这种解决方案已经为我服务了数年,涉及数百个存储库。
答案2
不确定这是否可以通过纯开源实现,但我知道 WANdisco 的商业产品 Subversion Access Control 可以处理这个问题。该产品没有 authz 文件,而是有自己的适用于用户的组和规则列表。组的成员资格来自轮询活动目录服务器,因此这应该可以满足要求。