趙躍 周麗娜 孫永泉
摘要:由于傳統(tǒng)SVB版本管理工具沒有自身權(quán)限設(shè)置的功能,目前一些特殊的場合,如涉密環(huán)境下,要求對其進(jìn)行功能封裝。該文對SVN命令行進(jìn)行了深入研究,通過增加管控界面等實(shí)現(xiàn)了一個(gè)安全版本的SVN管理工具,將倉庫管理和倉庫權(quán)限管理等功能分開管理,實(shí)現(xiàn)了三員管理等功能,滿足了特殊場合使用的要求。
關(guān)鍵詞:SVN;安全版本
中圖分類號:TP393 文獻(xiàn)標(biāo)識碼:A
文章編號:1009-3044(2020)27-0057-02
開放科學(xué)(資源服務(wù))標(biāo)識碼(OSID):
1 概述
由于傳統(tǒng)的SVN管理工具(如Visual SVN)本身并沒有對自身的權(quán)限控制,任何人通過皆可使用它輕松地進(jìn)行建庫,刪庫等管理操作,且這些操作并沒有日志記錄,所以不能滿足對安全性和保密性有較高要求的SVN管理需求。
基于以上原因,需要開發(fā)一個(gè)將倉庫管理和倉庫權(quán)限管理等功能分開賦予不同的管理人員,并且能將這些操作記錄下來的安全版本SVN管理工具。安全版本SVN管理工具應(yīng)滿足以下幾點(diǎn)要求:
1)實(shí)現(xiàn)通常SVN管理工具的大多數(shù)主要功能,如創(chuàng)建倉庫、創(chuàng)建用戶、基于目錄的權(quán)限分配等。
2)除普通開發(fā)者賬戶外,設(shè)立三員賬戶,只有三員賬戶可以通過此管理工具進(jìn)行管理。三員賬戶功能權(quán)限各自獨(dú)立,其權(quán)限劃分如下:
①系統(tǒng)管理員:系統(tǒng)管理員擁有創(chuàng)建倉庫、刪除倉庫、構(gòu)建倉庫目錄結(jié)構(gòu)的能力。
②安全管理員:安全管理員擁有創(chuàng)建、刪除、修改用戶和組,基于倉庫目錄進(jìn)行開發(fā)者權(quán)限分配的能力。
③審計(jì)員:審計(jì)員可以查看三員賬戶的操作日志,也可以查看倉庫的提交日志。
3)可對代碼倉庫進(jìn)行標(biāo)密。
2 實(shí)現(xiàn)
2.1界面實(shí)現(xiàn)
軟件界面借助Qt實(shí)現(xiàn),通過信號與槽機(jī)制實(shí)現(xiàn)對象間通信,皆是Qt的傳統(tǒng)實(shí)現(xiàn)方式,在此不加以贅述。
整體的界面設(shè)計(jì)和操作方式仿照常見的VisuaISVN的設(shè)計(jì)來實(shí)現(xiàn),以便于曾經(jīng)使用VisuaISVN的人員快速理解使用方式。
主要的操作方式與VisuaISVN基本一致,通過左側(cè)目錄樹及右鍵菜單選擇操作,右側(cè)窗口顯示一些相關(guān)信息。進(jìn)行各種操作時(shí)的各級子窗口也盡量與VisuaISVN保持一致。
2.2 SVN管理功能實(shí)現(xiàn)
SVN在Windows下的服務(wù)端搭建方式常見的有兩種:
1)Apache+ Subversion
2)VisualSVN
前者通過Apache代理接收SVN客戶端的請求,再通過相關(guān)插件與Subversion結(jié)合,后者據(jù)分析.其基于Subversion額外自己實(shí)現(xiàn)了一個(gè)支持HTTP的服務(wù),不再直接使用Subversion。
本軟件直接對Subversion服務(wù)進(jìn)行管理,暫未支持HTTP服務(wù),客戶端只能在局域網(wǎng)內(nèi)用形如svn://IP/repo的形式直接訪問Subversion服務(wù)。
以下重點(diǎn)說明SVN管理相關(guān)功能的實(shí)現(xiàn)細(xì)節(jié)。
1)創(chuàng)建代碼倉庫
Subversion安裝后會(huì)獲得許多有關(guān)的命令行工具,本軟件通過執(zhí)行這些命令并獲取其執(zhí)行結(jié)果,實(shí)現(xiàn)了可視化的管理。
創(chuàng)建代碼倉庫可通過svnadmin命令實(shí)現(xiàn),假設(shè)倉庫所在目錄為repoPath,倉庫名為repoName完整命令如下:
“cmd lc svnadmin create repoPath repoName"
通過命令完成倉庫的創(chuàng)建后,為滿足本軟件的管理需求,需要額外修改倉庫目錄下的/conf/svnserve.conf文件。首先需要清空其中原有的內(nèi)容,然后加入如下的內(nèi)容:
[general]
anon-access= none
auth-access= write
password-db= ../../Password
authz-db= authz
groups-db= ../../Groups
為使系統(tǒng)管理員具備對此新建的倉庫的管理權(quán)限,需立即修改倉庫目錄下的/conf/authz文件,假設(shè)系統(tǒng)管理員用戶名為sysManager在其中加入如下內(nèi)容:
[/]
sysManager= rw
審計(jì)員需要查看倉庫日志,所以也需給予讀權(quán)限:
[/]
auditManager=r
2)刪除代碼倉庫
通過模仿SVN客戶端提交刪除請求來刪除目錄,刪除整個(gè)代碼倉庫則直接刪除其文件夾即可。完整命令如下:
刪除目錄:
“cmd/c svn delete -username sysManager -password123456 -m delete svn://127.O.O.1/repoName/dirPath"
刪除倉庫:
“cmd lc rm -rf /repoPath/repoName”
3)獲取代碼倉庫目錄樹
需要獲取代碼倉庫的目錄結(jié)構(gòu)來初始化界面里的倉庫目錄樹。只能通過svnlook命令的返回值來獲取目錄結(jié)構(gòu),因?yàn)閷?shí)際上無法直接看到真正的目錄結(jié)構(gòu),所有的相關(guān)信息被Sub-version存儲(chǔ)在幾個(gè)特別的文件中。
完整命令如下:
“cmd lc svnlook tree /repoPath/repoName”
該命令的返回值通過管道的方式在程序中獲取到,由于描述目錄結(jié)構(gòu)的文本比較復(fù)雜,所以采用遞歸的方式解析文本,生成目錄樹。
4)創(chuàng)建和刪除用戶
無法通過命令的方式來創(chuàng)建和刪除用戶,因?yàn)镾ubversion并沒有相關(guān)的命令。
Subversion通過倉庫目錄下conf目錄中的文件控制用戶相關(guān)的信息。默認(rèn)指定為/conf/ipasswd文件,修改此文件即可管理svn用戶信息。但在本程序中,為了讓所有的倉庫都有相同的用戶賬戶信息,更改了默認(rèn)的用戶信息文件為倉庫的根目錄所在的目錄(即repoPath)下的Password文件。
通過修改svnserve.conf文件的內(nèi)容來更改指定用戶信息文件:
[general]
password-db= ../../Password
相關(guān)修改已經(jīng)在創(chuàng)建倉庫時(shí)完成。
添加用戶只需在Password文件中[users]選項(xiàng)下添加:
userName:passWord
需要說明的是,由于本程序添加了三員賬戶,而Subversion原本只有開發(fā)者賬戶,用戶信息文件中無法記錄用戶的身份類型,所以本程序另外使用名為Auth的文件來管理自己登陸時(shí)所需的賬戶,其中一條用戶記錄的形式如下:
userName:passWord:character
其中character代表用戶的身份,如系統(tǒng)管理員,開發(fā)者等。
Auth文件只是本管理程序使用,Subversion依舊使用Pass-word文件記錄svn用戶。
刪除用戶時(shí),需要遍歷所有倉庫的authz文件,刪除其中與之有關(guān)的記錄。
5)創(chuàng)建.刪除、修改用戶組
與svn用戶信息類似,組信息被Subversion默認(rèn)記錄在倉庫目錄下/confg/group文件中,本程序同樣在創(chuàng)建庫時(shí)通過修改svnserve.conf文件來更改指定的組信息文件:
[general]
groups-db= ../../Groups
在[groups]下一條組信息記錄形式如下:
gl= aaa,bbb
其中等號前的91代表組名,等號后的是組成員,用逗號隔開。在[groups]下修改或添加組信息記錄即可實(shí)現(xiàn)對用戶組的管理。
刪除組時(shí),也需要遍歷所有倉庫的authz文件,刪除其中與之有關(guān)的記錄。
6)獲取倉庫目錄日志
通過svn命令來獲取Subversion自己記錄的倉庫目錄提交日志,完整命令如下:
“cmd/c svn log -username auditManager -password123456 svn://127.O.O.I/dirPath l grep -Ev“^一一一|^$…
為了便于解析命令返回的文本結(jié)果,用grep對文本進(jìn)行了一些處理,去掉了不需要的一些信息。
7)三員日志
三員日志被本程序記錄在repoPath下的Log中,在三員用戶使用本程序時(shí),其進(jìn)行的各種SVN管理操作都會(huì)被記錄到其中,一條日志記錄形式如下:
“2019-11-4 14: 59: 36安全管理員修改權(quán)限:[/]:hjdcx-uopl= rw hjdcxuop3=r@gl= rw“
8)基于目錄的權(quán)限分配
同樣與SVN用戶信息和組信息類似,權(quán)限相關(guān)信息被Sub-version記錄在倉庫目錄下的/conf/authz文件中。由于各倉庫需要具有各自的權(quán)限配置,所以不需要修改svnserve.conf文件來指定公用的權(quán)限信息文件,使用各倉庫默認(rèn)獨(dú)有的authz文件即可。程序通過修改該文件即可實(shí)現(xiàn)權(quán)限配置。
文件典型內(nèi)容如下:
[/]
hjdcxuopl= rw
hj dcxuop3=r
[/vv/asd]
bbb= rw
[/vv/新建文本文檔.txt]
bbb= rw
其中,每個(gè)口里的內(nèi)容代表該authz文件所屬倉庫里的一個(gè)目錄,其下則是對這個(gè)目錄或文件的權(quán)限配置信息,[/]代表對整個(gè)倉庫的權(quán)限。
權(quán)限配置信息中,等號前的代表用戶或組,若是組,則必定已@開頭,例如:
[/]
@A=r
代表A組對整個(gè)倉庫具有只讀權(quán)限。等號后代表權(quán)限,‘r代表讀權(quán)限,‘w代表寫權(quán)限,留空代表沒有任何權(quán)限。
關(guān)于權(quán)限配置的額外說明:
①子目錄會(huì)默認(rèn)繼承父目錄的權(quán)限信息,若一個(gè)用戶或組對一個(gè)目錄具有只讀權(quán)限,則該用戶和組對此目錄下的所有目錄都有只讀權(quán)限。
②authz文件中對一個(gè)目錄進(jìn)行的顯式配置會(huì)覆蓋其默認(rèn)繼承的父目錄權(quán)限。
③對位于目錄樹結(jié)構(gòu)中葉節(jié)點(diǎn)位置的文件或空目錄進(jìn)行配置是不生效的,即只能通過它們的父目錄來控制權(quán)限。
9)密級標(biāo)注
由于只有涉密和非密兩種密級,所以程序里的目錄樹中直接以紅色字體表示涉密,普通黑色字體表示非密。 為了在程序關(guān)閉后能記住標(biāo)密信息,進(jìn)行標(biāo)密操作時(shí),相關(guān)信息會(huì)記錄到repoPathT的Secret文件中。其中記錄了被標(biāo)密的目錄。
3 結(jié)論
本方法通過構(gòu)建界面,設(shè)計(jì)分權(quán)限管理機(jī)制,直接調(diào)用SVN的命令行實(shí)現(xiàn)了一個(gè)具備安全權(quán)限管理的SVN軟件,滿足了三員管理,權(quán)限分配,代碼倉庫分密級管理等功能。對于基于SVN軟件進(jìn)行二次開發(fā)和功能擴(kuò)展具有一定的借鑒意義。
參考文獻(xiàn):
[1](美)梅森.版本控制之道——使用Subversion第2版[M].陶文,譯.北京:電子工業(yè)出版社,2007.
[2](美)Michael Pilat.(美)Ben CollinsSuSSlnan,(美)BrianW.Fitz-patrick.使用subversion進(jìn)行版本控制(影印版)[M].北京:開明出版社,2009.
【通聯(lián)編輯:代影】