我在 Windows Server 2003 机器上有一组私有 Subversion 存储库,开发人员可以通过 svn:// 协议通过 SVNServe 访问这些存储库。目前我们一直在使用授权和密码为每个存储库创建文件以控制访问,但是随着存储库和开发人员数量的增加,我正在考虑切换到使用 ActiveDirectory 中的凭据。我们在一家全 Microsoft 商店中运营,并且在所有 Web 服务器上都使用 IIS 而不是 Apache,因此如果可能的话,我更愿意继续使用 SVNServe。
除了可能之外,我还关心如何迁移我们的存储库,以便现有用户的历史记录映射到正确的 ActiveDirectory 帐户。还请记住,我不是网络管理员,对 ActiveDirectory 也不是很熟悉,因此如果需要,我可能需要通过其他人来获取 ActiveDirectory 中的更改。
我有什么选择?
更新 1:从SVN 文档通过使用 SASL,我应该能够让 SVNServe 使用 ActiveDirectory 进行身份验证。澄清一下,我正在寻找的答案是如何配置 SVNServe(如果可能)以使用 ActiveDirectory 进行身份验证,然后如何修改现有存储库以将现有 svn 用户重新映射到他们的 ActiveDirectory 域登录帐户。
更新 2:SVNServe 中的 SASL 支持似乎是基于插件模型的,文档仅作为示例显示。查看Cyrus SASL 库它看起来像支持多种身份验证“机制”,但我不确定哪一种用于 ActiveDirectory 支持,也找不到有关此类问题的任何文档。
更新 3:好的,看起来为了与 ActiveDirectory 进行通信,我希望使用萨斯劳德代替数据库为了auxprop_插件属性。不幸的是,根据一些帖子(可能已过时且不准确)萨斯劳德不基于 Windows 构建,此类尝试被视为工作正在进行中。
更新 4:我在这个主题上找到的最新帖子听起来好像可以通过以下方式获得正确的二进制文件()麻省理工学院 Kerberos 图书馆但听起来像Nabble.com 上的这篇文章仍存在无法正常运作的问题。
更新 5:看起来TortoiseSVN 讨论并且svn.haxx.se 上的这篇文章即使 saslgssapi.dll 或任何必要的二进制文件在 Windows 服务器上可用并配置,客户端也需要相同的自定义才能使用这些存储库。如果这是真的,我们将只能在这些客户端中进行更改(例如 TortoiseSVN 和 CollabNet 构建客户端二进制文件以支持此类身份验证方案)才能从 Windows 客户端获得 ActiveDirectory 支持。虽然这些帖子就是这么建议的,但这与我最初从其他阅读中得出的假设相矛盾,因为 SASL 兼容不需要对客户端进行任何更改,而只需要设置服务器来处理身份验证机制。在仔细阅读了Subversion 中有关 Cyrus SASL 的文档第 5 节指出“具有 Cyrus SASL 支持的 1.5+ 客户端将能够针对启用了 SASL 的 1.5+ 服务器进行身份验证,前提是服务器支持的机制中至少一种也受客户端支持。”因此,显然客户端和服务器中必须提供 GSSAPI 支持(我理解这是 Active Directory 所必需的)。
我不得不说,我对 Subversion 处理身份验证的内部原理的了解比我想要的要多得多。不幸的是,我只是在寻找一个答案,即在 Windows 服务器上使用 SVNServe 并从 Windows 客户端访问它时是否可以获得 Active Directory 身份验证支持。根据官方文档,这似乎是可能的,但是您可以看到,即使可能,配置也并非易事。
更新:6:由于 Subversion 1.7 的开发即将结束,有人可以补充一下 Subversion 1.7 是否会改善 SVNServe 使用 Active Directory 进行身份验证的情况吗?
答案1
正如前面提到的,VisualSVN Server 就是您想要的工具。它是适用于 Windows 的一体化软件包,恰好在其中使用了 Apache - 除非您仔细研究它安装的 dll,否则您永远不会知道,但对于所有人来说,它都是一个 Windows 服务,有一个 mmc 管理单元来管理它。如果端口 80 已被占用,您可以更改它运行的端口。
据我了解,目前正在通过 svnserve 开发 sasl 支持。
答案2
我正在使用在 Debian Linux 上运行的带有 svn 的 apache 来授权活动目录服务器。客户端通过 http 协议连接到存储库。如果您可以接受此设置 - 请继续阅读。
这也应该可以在 Windows 的 Apache 下工作,但我从未尝试过。接下来是 Debian 特有的,但在 Windows/其他发行版下应该可以类似地工作;迁移时您不会丢失 svn 历史记录...
安装所需软件:
apt-get install libapache2-svn subversion apache2
在 apache 的 vhost 配置中 [ 可以在 /etc/apache2/sites-enabled 中找到它们的符号链接 ]。在 VirtualHost 内添加:
<Location /svn>
DAV svn
#change this to actual path
SVNPath /full/path/to/your/current/svn/directory
AuthType Basic
AuthName "SVN Server"
AuthBasicProvider ldap
AuthzLDAPAuthoritative Off
# provide here credentials for existing domain user.
# in my case domain is called domainName and user - user
AuthLDAPBindDN "domainName\user"
AuthLDAPBindPassword usersPassword
# put here ip of the domain controler and full path to OU containing accounts
AuthLDAPURL ldap://10.11.22.33:389/ou=Users,dc=domainName,dc=companyName,dc=whatever?sAMAccountName?sub?(objectClass=*)
Require valid-user
SVNAutoversioning on
AuthzSVNAccessFile /etc/apache2/svn_authz
</Location>
确保 apache 加载 ldap 模块:
cd /etc/apache2/mods-enabled
ln -s ../mods-available/authnz_ldap.load
ln -s ../mods-available/ldap.load
/etc/init.d/apache2 reload
确保 apache 可以修改 svn 存储库中的文件:
chown www-data:www-data -R /full/path/to/your/current/svn/directory
你的 svn_authz 应该包含规则告诉谁可以访问什么。就我而言:
[groups]
ops=jack.brown,john.smith
[/]
* = rw
[/priv]
* =
@ops = rw
您可以找到有关该文件的语法的更多信息这里。
如果你已经到达了这一点 - 你的用户可以从http://服务器.地址/svn/使用任何 svn 客户端 [ tortoise/cmdline/visual svn ],他们都会看到所有历史记录并继续读取/写入。
答案3
您可以使用 saslNTML 而不是 GSSAPI。默认情况下,saslNTML dll 随 TSVN 一起安装,我认为它也包含在 collab.net 的 svn 客户端中。
那里有两个选项您必须在 sasl 配置文件中设置:
ntml_server
和可选
ntml_v2
当然,您必须在配置文件中设置 mech 列表以包含 NTML。
当我实施整个过程时,我只用 TSVN 尝试过一次。但我让别人为我设置了一个测试服务器,所以我不知道确切的配置选项是什么。