趙躍 周麗娜 孫永泉
摘要:由于傳統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.
【通聯編輯:代影】