赵跃 周丽娜 孙永泉
摘要:由于传统SVB版本管理工具没有自身权限设置的功能,目前一些特殊的场合,如涉密环境下,要求对其进行功能封装。该文对SVN命令行进行了深入研究,通过增加管控界面等实现了一个安全版本的SVN管理工具,将仓库管理和仓库权限管理等功能分开管理,实现了三员管理等功能,满足了特殊场合使用的要求。
关键词:SVN;安全版本
中图分类号:TP393 文献标识码:A
文章编号:1009-3044(2020)27-0057-02
开放科学(资源服务)标识码(OSID):
1 概述
由于传统的SVN管理工具(如Visual SVN)本身并没有对自身的权限控制,任何人通过皆可使用它轻松地进行建库,删库等管理操作,且这些操作并没有日志记录,所以不能满足对安全性和保密性有较高要求的SVN管理需求。
基于以上原因,需要开发一个将仓库管理和仓库权限管理等功能分开赋予不同的管理人员,并且能将这些操作记录下来的安全版本SVN管理工具。安全版本SVN管理工具应满足以下几点要求:
1)实现通常SVN管理工具的大多数主要功能,如创建仓库、创建用户、基于目录的权限分配等。
2)除普通开发者账户外,设立三员账户,只有三员账户可以通过此管理工具进行管理。三员账户功能权限各自独立,其权限划分如下:
①系统管理员:系统管理员拥有创建仓库、删除仓库、构建仓库目录结构的能力。
②安全管理员:安全管理员拥有创建、删除、修改用户和组,基于仓库目录进行开发者权限分配的能力。
③审计员:审计员可以查看三员账户的操作日志,也可以查看仓库的提交日志。
3)可对代码仓库进行标密。
2 实现
2.1界面实现
软件界面借助Qt实现,通过信号与槽机制实现对象间通信,皆是Qt的传统实现方式,在此不加以赘述。
整体的界面设计和操作方式仿照常见的VisuaISVN的设计来实现,以便于曾经使用VisuaISVN的人员快速理解使用方式。
主要的操作方式与VisuaISVN基本一致,通过左侧目录树及右键菜单选择操作,右側窗口显示一些相关信息。进行各种操作时的各级子窗口也尽量与VisuaISVN保持一致。
2.2 SVN管理功能实现
SVN在Windows下的服务端搭建方式常见的有两种:
1)Apache+ Subversion
2)VisualSVN
前者通过Apache代理接收SVN客户端的请求,再通过相关插件与Subversion结合,后者据分析.其基于Subversion额外自己实现了一个支持HTTP的服务,不再直接使用Subversion。
本软件直接对Subversion服务进行管理,暂未支持HTTP服务,客户端只能在局域网内用形如svn://IP/repo的形式直接访问Subversion服务。
以下重点说明SVN管理相关功能的实现细节。
1)创建代码仓库
Subversion安装后会获得许多有关的命令行工具,本软件通过执行这些命令并获取其执行结果,实现了可视化的管理。
创建代码仓库可通过svnadmin命令实现,假设仓库所在目录为repoPath,仓库名为repoName完整命令如下:
“cmd lc svnadmin create repoPath repoName"
通过命令完成仓库的创建后,为满足本软件的管理需求,需要额外修改仓库目录下的/conf/svnserve.conf文件。首先需要清空其中原有的内容,然后加入如下的内容:
[general]
anon-access= none
auth-access= write
password-db= ../../Password
authz-db= authz
groups-db= ../../Groups
为使系统管理员具备对此新建的仓库的管理权限,需立即修改仓库目录下的/conf/authz文件,假设系统管理员用户名为sysManager在其中加入如下内容:
[/]
sysManager= rw
审计员需要查看仓库日志,所以也需给予读权限:
[/]
auditManager=r
2)删除代码仓库
通过模仿SVN客户端提交删除请求来删除目录,删除整个代码仓库则直接删除其文件夹即可。完整命令如下:
删除目录:
“cmd/c svn delete -username sysManager -password123456 -m delete svn://127.O.O.1/repoName/dirPath"
删除仓库:
“cmd lc rm -rf /repoPath/repoName”
3)获取代码仓库目录树
需要获取代码仓库的目录结构来初始化界面里的仓库目录树。只能通过svnlook命令的返回值来获取目录结构,因为实际上无法直接看到真正的目录结构,所有的相关信息被Sub-version存储在几个特别的文件中。
完整命令如下:
“cmd lc svnlook tree /repoPath/repoName”
该命令的返回值通过管道的方式在程序中获取到,由于描述目录结构的文本比较复杂,所以采用递归的方式解析文本,生成目录树。
4)创建和删除用户
无法通过命令的方式来创建和删除用户,因为Subversion并没有相关的命令。
Subversion通过仓库目录下conf目录中的文件控制用户相关的信息。默认指定为/conf/ipasswd文件,修改此文件即可管理svn用户信息。但在本程序中,为了让所有的仓库都有相同的用户账户信息,更改了默认的用户信息文件为仓库的根目录所在的目录(即repoPath)下的Password文件。
通过修改svnserve.conf文件的内容来更改指定用户信息文件:
[general]
password-db= ../../Password
相关修改已经在创建仓库时完成。
添加用户只需在Password文件中[users]选项下添加:
userName:passWord
需要说明的是,由于本程序添加了三员账户,而Subversion原本只有开发者账户,用户信息文件中无法记录用户的身份类型,所以本程序另外使用名为Auth的文件来管理自己登陆时所需的账户,其中一条用户记录的形式如下:
userName:passWord:character
其中character代表用户的身份,如系统管理员,开发者等。
Auth文件只是本管理程序使用,Subversion依旧使用Pass-word文件记录svn用户。
删除用户时,需要遍历所有仓库的authz文件,删除其中与之有关的记录。
5)创建.删除、修改用户组
与svn用户信息类似,组信息被Subversion默认记录在仓库目录下/confg/group文件中,本程序同样在创建库时通过修改svnserve.conf文件来更改指定的组信息文件:
[general]
groups-db= ../../Groups
在[groups]下一条组信息记录形式如下:
gl= aaa,bbb
其中等号前的91代表组名,等号后的是组成员,用逗号隔开。在[groups]下修改或添加组信息记录即可实现对用户组的管理。
删除组时,也需要遍历所有仓库的authz文件,刪除其中与之有关的记录。
6)获取仓库目录日志
通过svn命令来获取Subversion自己记录的仓库目录提交日志,完整命令如下:
“cmd/c svn log -username auditManager -password123456 svn://127.O.O.I/dirPath l grep -Ev“^一一一|^$…
为了便于解析命令返回的文本结果,用grep对文本进行了一些处理,去掉了不需要的一些信息。
7)三员日志
三员日志被本程序记录在repoPath下的Log中,在三员用户使用本程序时,其进行的各种SVN管理操作都会被记录到其中,一条日志记录形式如下:
“2019-11-4 14: 59: 36安全管理员修改权限:[/]:hjdcx-uopl= rw hjdcxuop3=r@gl= rw“
8)基于目录的权限分配
同样与SVN用户信息和组信息类似,权限相关信息被Sub-version记录在仓库目录下的/conf/authz文件中。由于各仓库需要具有各自的权限配置,所以不需要修改svnserve.conf文件来指定公用的权限信息文件,使用各仓库默认独有的authz文件即可。程序通过修改该文件即可实现权限配置。
文件典型内容如下:
[/]
hjdcxuopl= rw
hj dcxuop3=r
[/vv/asd]
bbb= rw
[/vv/新建文本文档.txt]
bbb= rw
其中,每个口里的内容代表该authz文件所属仓库里的一个目录,其下则是对这个目录或文件的权限配置信息,[/]代表对整个仓库的权限。
权限配置信息中,等号前的代表用户或组,若是组,则必定已@开头,例如:
[/]
@A=r
代表A组对整个仓库具有只读权限。等号后代表权限,‘r代表读权限,‘w代表写权限,留空代表没有任何权限。
关于权限配置的额外说明:
①子目录会默认继承父目录的权限信息,若一个用户或组对一个目录具有只读权限,则该用户和组对此目录下的所有目录都有只读权限。
②authz文件中对一个目录进行的显式配置会覆盖其默认继承的父目录权限。
③对位于目录树结构中叶节点位置的文件或空目录进行配置是不生效的,即只能通过它们的父目录来控制权限。
9)密级标注
由于只有涉密和非密两种密级,所以程序里的目录树中直接以红色字体表示涉密,普通黑色字体表示非密。 为了在程序关闭后能记住标密信息,进行标密操作时,相关信息会记录到repoPathT的Secret文件中。其中记录了被标密的目录。
3 结论
本方法通过构建界面,设计分权限管理机制,直接调用SVN的命令行实现了一个具备安全权限管理的SVN软件,满足了三员管理,权限分配,代码仓库分密级管理等功能。对于基于SVN软件进行二次开发和功能扩展具有一定的借鉴意义。
参考文献:
[1](美)梅森.版本控制之道——使用Subversion第2版[M].陶文,译.北京:电子工业出版社,2007.
[2](美)Michael Pilat.(美)Ben CollinsSuSSlnan,(美)BrianW.Fitz-patrick.使用subversion进行版本控制(影印版)[M].北京:开明出版社,2009.
【通联编辑:代影】