SVN 权限管理

任何系统,只要涉及多用户使用,首当其冲的要解决的都是用户身份认证 (Authetication) 和用户权限 (Authorization) 问题。认证和鉴权也是信息安全中两大基本问题。

Subversion 作为版本控制系统的代表,是典型的多用户系统,针对不同用户进行适当的权限配置,也是 SVN 安全高效运作的关键。

SVN 的用户权限控制与 SVN 的仓库访问方式(仓库寻址)密切相关,不同的访问方式,其权限控制方式也不尽相同。

SVN 仓库的访问方式

Subversion 是典型的服务端/客户端软件架构。Subversion 仓库作为服务端,其向客户端提供了多种不同的通信方式。换言之,SVN 客户端可以有多种不同的方式访问 SVN 仓库。

仓库访问方式 说明
file:// 仓库在本地硬盘上,直接通过文件系统访问
svn:// 通过自带的 svn 协议访问 svnserve 服务器
svn+ssh:// 类似 svn://,支持通过 SSH 通道
http:// 通过 WebDAV 协议访问可识别 Subversion 的 Apache 服务器
https:// 和 http:// 相同, 但是增加了 SSL 封装

本地的文件仓库直接访问 (file://)

将 SVN 仓库建在本地磁盘上,通过本地磁盘文件系统就可以直接访问仓库。这是 SVN 仓库的所有访问方式中,最为简单粗暴的一种。这种访问方式不需要事先运行任何 SVN 服务

(VSS也是这种访问方式)

其访问语法如下:

$ svn co file://localhost/home/svn/myproject

当 Subversion 直接从文件系统访问存储库时,对仓库的访问权限基于文件系统的权限。也就是说,SVN 使用您的文件系统权限来访问存储库。

  • 如果用户本人创建了存储库,用户是库文件的 owner,则他具有存储库的所有操作权限;
  • 如果存储库由其他用户创建,则使用库的用户对仓库的各种操作权限取决于其对文件系统中库文件的所具有的权限;

  • 如下例,库文件虽然隶属于 root/root,其他用户具备读/写权限,则其他用户也具备 reimbursement 库的所有操作权限;
    Image

  • 如下例,库文件隶属于 root/root,其他用户具备读权限,则其他用户对 reimbursement 库的只能进行读操作(如 checkout),不能进行写入操作 (如 commit);
    Image

使用 svn 网络协议进行访问(svn://)

svn 协议是一种特定设计的协议,所以,当使用 svn 协议进行存储库的访问时,需要特定的服务支持才能使用。Subversion 专门设计了 svnserve 服务,完成基于 svn 协议的服务端(存储库)与客户端通信。

开启 svnserve 服务

首先,服务端要开启 svnserve 网络服务。通过不同的参数,可以用不同的操作模式启动 svnserve。其语法格式如下:

svnserve [option1] [option2] [option3] …

常用的参数(options)如下:

  • -d, –daemon

    svnserve 网络服务作为 deamon 后台运行

  • -r root_pathname –root

    指定 svnserve 服务所使用的根目录,客户端访问的库资源在根目录限定的范围之内。

    (与设置 http 服务的根目录思想一致)

  • — listen-port port_number

    指定 svnserve 服务的监听端口。不加这个参数,svn 服务默认的监听端口为 3690

基于 svnserve 服务的权限设置

Subversion 通过库目录 conf 文件夹下三个主要的配置文件完成基于 svnserve 服务的权限控制。

文件名 用途
svnserve.conf svn 服务的核心配置文件
passwd 用户账号密码配置文件,被 svnserve 引用,完成认证功能的支撑文件
authz 权限配置文件,被 svnserve 引用,完成授权功能的支撑文件
  • passwd 文件

    完成用户账号及其对应密码的设置。

    [users]
    # harry = harryssecret
    # sally = sallyssecret
    
    tojohn = 123456
    guest = 123456
    
  • authz 文件

    对 svn 库中的资源进行访问权限配置。权限配置文件由一个 [group] 配置段和若干个版本库路径权限段组成。

    (1) 完成用户组的创建、划分

    [groups]
    group1 = tojohn
    group2 = guest  
    

    (2) 设置各个组、各用户对 svn 仓库中的各目录的访问权限

    [/]   --- 对 svn "根目录"的访问权限
    @group1 = rw    --- group1 的访问权限
    @group2 = r --- group2 的访问权限
    * =     --- 其它用户 无任何权限
    
    [runoob:/] --- 对 runoob 目录的访问权限
    @group1 = rw
    guest = r
    
    [web.passport:/]   --- 对 web.passport 目录的访问权限
    @group2 = rw
    tojohn = r
    
  • svnserve.conf 文件

    svn 服务真正的配置文件,passwd 文件、authz 文件都是为其提供数据支撑的辅助文件。该文件仅由一个 [general] 配置段组成。

    anon-access = read    
    # 匿名用户总体访问权限
    auth-access = write    
    # 认证用户总体访问权限,write 表示可读可写
    password-db = passwd    
    # 使用哪个文件作为账号文件
    authz-db = authz    
    # 使用哪个文件作为权限设置文件
    realm = Ensk's SvnRep   
    # 版本库认证域, 使用 SVN 客户端访问时, 会出现在提示信息中, 自定义域的标志以方便辨别库
    

    先对匿名用户和认证用户两个大类进行整体设置,后续再通过认证文件和授权文件进行细粒度设置。

Reference

  1. Subversion 的版本控制方法
  2. https://blog.csdn.net/w171066/article/details/70910982
  3. Linux 搭建 SVN 服务器

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注