支持多种仓库访问方法

优质
小牛编辑
119浏览
2023-12-01

读者已经见到了访问仓库的多种方式, 但是否有可能同时以多种方式 (安全地) 访问仓库? 如果你有一点先见之明, 那么答案是肯定的.

在任意时刻, 下面这些进程都可能需要仓库的读写权限:

  • 普通的系统用户使用 Subversion 客户端 (以用户的身份运行), 通过 URL file:// 直接访问仓库

  • 普通的系统用户连接到 SSH 派生的私有 svnserve 进程 (以用户的身份运行), 通过该进程修改仓库

  • 以特定身份运行的 svnserve 进程— 或者是一个守护进程, 或者由 inetd 启动

  • 一个 Apache httpd 进程, 以一个特定的身份 运行

如果仓库要同时支持多种访问方式, 那么管理员最常遇到的问题通常与仓库 的所有权和权限有关. 前面列表中提到的进程 (或用户) 是否应该具有读写仓库 底层数据文件的权限? 假设你有一个类 Unix 系统, 一种比较简单直接的做法是 把所有可能使用仓库的用户都加入到名为 svn 的用户组, 而用户组 svn 对仓库拥有完整的所有权. 但这样做还不足够, 因为进程可能使用了不太友好的文件模式创建屏蔽字—该进程创建的文件 完全禁止了其他进程的访问.

因此, 为仓库用户创建了公共的用户组之后, 下一步是强制每一个访问仓库 的进程使用一个合理的文件模式创建屏蔽字. 对于直接访问仓库的用户, 你可以 把程序 svn 封装成一个脚本, 脚本首先执行 umask 002, 然后再运行真实的 svn 程序. 你也可以为 svnserve 程序写一个类似的封装脚本, 以及在 Apache 的启动脚本 apachectl 内添加一行 umask 002. 例如:

$ cat /usr/bin/svn

#!/bin/sh

umask 002
/usr/bin/svn-real "$@"

在类 Unix 系统上还会遇到另一个常见的问题: 比如说, 如果你的仓库是使用 Berkeley DB 作为后端存储, 那么它很少会去创建新的日志文件来记录自己的 操作. 即使整个仓库都被用户组 svn 所拥有, 这些新创建 的日志文件也不一定属于用户组 svn, 这会导致更多的权限 问题. 一种比较好的解决办法是为仓库的 db 子目录设置 SUID, 这将使得所有新创建的日志文件都具有和父目录相同的用户组.

一旦你克服了这些困难, 此时仓库对于所有必要的进程来说, 应该都是可访问 的了. 虽然看起来可能有点凌乱和复杂, 但是对于如何处理多个用户共享相同文件 的写权限这个问题, 一直都没有一个优雅的解决办法.

幸运的是, 大多数仓库管理员 不必 进行这么复杂 的配置. 如果用户想访问托管在本机上的仓库, 除了 file://, 其实还可以使用 http://svn://, 在填写主机名时需要写成 localhost. 为仓库支持多种访问方法可能比看上去更麻烦, 我们建议你选择一种满足自己需要的访问方式, 然后坚持用它!

svn+ssh:// 服务器检查列表

对于已经有了 SSH 账户的用户, 为了让他们共享仓库而不会产生权限上 的问题, 其中的过程可能会比较麻烦. 如果你 (作为一个管理员) 对需要在类 Unix 系统上完成的工作不太清楚, 这里列出了一个检查列表, 总结了本节 讨论的几个主题:

  • 所有的 SSH 用户都需要仓库的读写权限, 因此要把他们都放到一个 用户组内.

  • 仓库完全被用户组所拥有.

  • 把用户组的权限设置成可读写.

  • 在访问仓库时, 用户需要使用合理的文件模式创建屏蔽字, 因此把 可执行文件 svnserve 包装成一个脚本, 脚本先执行 umask 002, 然后再运行真实的 svnserve 程序.

  • 采取类似的方式处理 svnlooksvnadmin, 例如先设置好文件模式创建屏蔽字再执行 命令, 或者使用和上面一样的包装脚本.