建立一個安全的Subversion服務器

發表于:2007-06-22來源:作者:點擊數: 標簽:
最近一個客戶聘請了一個 網絡 開發 團隊來幫助他的工作過度的網管。他們要求我安裝一個 版本控制 系統,這個系統能夠保證團隊中的任何成員避免無意中修改別人的文件,并且能夠給予管理員恢復文件到任何版本的機制。 我的第一個想法就是Subversion。因為它是

   
  最近一個客戶聘請了一個網絡開發團隊來幫助他的工作過度的網管。他們要求我安裝一個版本控制系統,這個系統能夠保證團隊中的任何成員避免無意中修改別人的文件,并且能夠給予管理員恢復文件到任何版本的機制。
  

  我的第一個想法就是Subversion。因為它是我寫BSD Hacks 時和編輯器一起用的版本控制系統。在Ports Collection中搜索一下之后發現,Subversion需要好幾個相關的port。比如,esvn看起來相當適合客戶端,因為它的GUI界面能夠運行在Unix,Mac OS X以及Windows中。對于一個對Unix技術掌握不深的網絡開發團隊而言,當他們需要把數據存貯在FreeBSD服務器上而從非FreeBSD系統讀取時,esvn是非常好的選擇。
  
  前期準備
  
  在我的想法中,只允許開發團隊的成員具有權限訪問倉庫是非常重要的。同時,我們把倉庫放在和目前的web服務器分開的操作系統上,當web管理員看到適合的文件時,由他負責把文件從倉庫復制到web服務器上。
  
  為了實現這個目的,先對已存在的你想放到版本控制系統下的目錄結構做一個備份,然后把它安全發送到倉庫服務器。在我的例子中,我把web服務器上www目錄的數據備份到一臺內網服務器
  192.168.2.2上。
  
  # tar czvf - /usr/local/etc/www/data | ssh dru@192.168.2.2 "cat > www.tar.gz"
  
  下一步是在倉庫服務器上建立一個svn組,并把已存在的需要訪問倉庫的用戶加到這個組中。比如,當我創建svn組后,我在/etc/group加入這句話把已存在的web管理員用戶加進去:
  
  # vi /etc/group
  svn:*:3690:webadmin
  
  然后,新建一個用戶svn。如果有必要,你還需創建所有要訪問倉庫系統的用戶帳號(如果他們還沒有創建)。要保證每個用戶是svn的成員并且有密碼和可用的shell。我使用sysinstall為新的網絡工程師建立用戶帳號。完成以后,我雙擊svn組的成員。大概就像這樣:
  
  # grep svn /etc/group
  svn:*:3690:webadmin,devel1,devel2
  
  處理 umask在安裝Subversion之前,我們先看看svn用戶的umask。在我的FreeBSD系統上,它是這樣的:
  # su -l svn
  % umask
  022
  
  在UNIX中,用戶umask值決定了新建目錄或文件的默認權限。這是通過關閉某些權限達到的。如果你記得:
  r = 4
  w = 2
  x = 1
  
  你應該看得出這個umask沒有對用戶(svn)關閉任何權限(0);它對組(svn)關閉了寫權限(2);它對其他組用戶關閉了寫權限(2)。
  
  因為svn組的成員必須能夠寫入倉庫,所以把umask中關于組的 2 改為 0。甚至如果你不想讓其他組成員知道這個倉庫的存在,你可以把關于其他組成員的 2 改為 7。
  
  修改用戶svn的shell配置比較簡單。如果用戶使用 csh:
  % vi ~svn/.cshrc
  ,那么找到umask那行并把它改為 002 或 007。如果你的svn用戶不用csh,修改你的shell配置文件。如果你把你的修改保存在 ~svn/.cshrc (或別的地方),別忘了告訴shell:
  % source ~svn/.cshrc
  
  再敲一次 umask 命令,以保證你的修改有效。
  
  安裝Subversion ,并讓它擁有正確的umask
  
  如果你選擇一個002的umask,那么當你從ports collection生成Subversion的時候,你能把一個wrapper編譯進去。如果你選擇一個007的umask或安裝已預編譯好的Subversion,那就要創建一個wrapper腳本來保證你的Subversion二進制文件使用你的umask值。
  
  使用wrapper編譯,使其umask值為002:
  # cd /usr/ports/devel/subversion
  # make -DWITH_SVNSERVE_WRAPPER install clean
  
  或者,你可以安裝已預編譯的二進制代碼包
  # pkg_add -r subversion
  
  注意:無論使用何種方法,安裝之前都應該把這篇文章看完!因為你可以發現一些額外的讓你感興趣的編譯選項!
  
  如果你不在wrapper中編譯,請移動你的代碼到相應的位置,并創建你自己的wrapper腳本:
  # mv /usr/local/bin/svn /usr/local/bin/svn.orig# vi /usr/local/bin/svn#!/bin/sh#wrapper script to set umask to 007 on subversion binariesumask 007/usr/local/bin/svn.orig "$@"
  
  設置你的umask值為002或007,使它和syn用戶的umask值一樣。別忘了設置你的wrapper腳本為可執行的:
  # chmod +x /usr/local/bin/svn
  
  創建倉庫
  
  既然環境搭好了,那你就可以創建倉庫了。用svn用戶登錄以保證svn用戶和svn組擁有你在倉庫中創建的文件。在 /usr/home/svn/目錄中,鍵入:
  % svnadmin create repository
  
  在這個例子中,我的倉庫名為repository。你可以選擇任何對你有幫助的名字。svnadmin create 僅僅創建了Subversion工具所需要的目錄結構。
  % ls -F repository
  README.txt dav/ format locks/
  conf/ db/ hooks/
  
  注意目錄db是默認生成的。因為Subversion使用數據庫跟蹤倉庫中文件的變化,所以你必須把你的數據放到數據庫中。然后,我把備份文件解壓縮,這樣就有的一些可以放進去的數據。但是要注意這么做的時候,不要把備份文件直接恢復到~svn/repository目錄下。(記得否,它是個數據庫)。相反,我新建了個目錄結構:
  % pwd
  /usr/home/svn
  % mkdir www && cd www
  % mkdir branches tags trunk
  % cd trunk
  % tar xzvf /full/path/to/www.tar.gz .
  % cd
  
  這樣,svn用戶的主目錄結構像這樣:
  % ls -F ~svn
  repository/ www/
  
  導入數據
  
  下一步,應該把~svn/www/的數據導入到Subversion服務器了。為了實現這個目的,可以使用 svn import 命令:
  % svn import www file:///usr/home/svn/repository/www -m "initial import"
  
  svn import 是svn的許多命令中用戶可以使用的一條。鍵入 svn help 可以看到所有可以使用的命令的名字。如果你在svn和help中插入命令,比如 svn import help,你就可以看到那條命令的語法幫助。在svn import后面的是包含要導入數據的目錄的名字(www)。你的數據不一定非得在相同的目錄下,它僅僅是定義了到數據的完整路徑,但必須保證你的svn組用戶擁有訪問導入數據的權限。注意:如果你已經導入的數據,原始數據就沒有必要留在硬盤上了。在我的例子中,我使用了這條命令:
  rm -Rf www。
  
  接下來,請注意當我定義倉庫的完整路徑時所使用的語法。Subversion支持多URL模式或者RA(repository aclearcase/" target="_blank" >ccess)模塊。檢驗你的Subversion支持哪種模式:
  #svn --version
  svn, version 1.1.3 (r12730)  compiled Mar 20 2005, 11:04:16Copyright (C) 2000-2004 CollabNet.Subversion is open source software, see http://subversion.tigris.org/This product includes software developed by CollabNet (http://www.Collab.Net/).The following repository access (RA) modules are available:* ra_dav : Module for accessing a repository via WebDAV (DeltaV) protocol. - handles 'http' schema - handles 'https' schema* ra_local : Module for accessing a repository on local disk. - handles 'file' schema* ra_svn : Module for accessing a repository using the svn.network protocol. - handles svn schema
  因為我想要在本地路徑訪問倉庫,所以我使用了file:/// 模式。我還可以在這URL后面加上www,因為我想訪問倉庫中名為www的目錄。當然,你能在同一個倉庫中導入多個目錄結構,并且用容易記住的名字命名。
  
  最后,我使用了 -m 消息開關把注釋:"initial import"加入倉庫日志中。如果我不包括這個參數,svn將使用默認編輯器(vi)打開日志并要求我填入注釋,否則無法進入下一步。
  
  這是非常關鍵的一個地方。安裝一個版本控制系統的全部原因是為了允許許多用戶修改文件,并且有可能是并發的。每一個用戶都應該負責任的記錄清楚他們對哪些文件作了哪些改動。你的工作就是讓他們明白為什么svn命令總是提示他們加入注釋。
  
  確定如何訪問倉庫
  
  恭喜你!你現在擁有了一個可以工作的倉庫!現在到了仔細比較各種不同的URL模式并選出最適合你需求的訪問方法的最好的時間。
  
  免費電子文檔Version Control with Subversion第六章詳細介紹了各種可能的配置。你可以在編譯FreeBSD port的時候,在 make 命令后添加參數 -DWITH_BOOK,把書安裝上。
  
  如果你的用戶通過本地或ssh登錄系統,可以使用 file:/// 訪問。因為用戶對于倉庫時本地(local)的,所以這種情況下,系統不會打開一個 TCP/IP端口監聽Subversion連接。然而,它卻要求每個用戶有一個活動的shell帳號并且假定你的用戶可以登錄Unix服務器。和別的shell帳戶一樣,其安全性能由這幾方面決定:用戶密碼的健壯性;倉庫權限以及組成員的正確配置。讓用戶通過ssh登錄系統并不保證session已被加密。
  
  另一種方案是把Subversion整合進apache服務器。默認情況下,Subversion 的FrssBSD port支持SSL編譯,這意味著你的用戶可以在瀏覽器中使用 https:// 模式訪問倉庫。然而,如果你的apache版本是2.X而不是1.X,要記得在編譯的時候把參數-DWITH_MOD_DAV_SVN 加入到 make后面。
  
  如果你考慮讓用戶通過瀏覽器訪問,要先仔細閱讀Subversion文檔關于apahce httpd配置部分,然后你要配置不少東西。幸運的是,文檔很完整!
  
  第三種方案時使用 svnserve 監聽網絡連接。文檔建議采用這種模式,無論是通過inetd還是獨

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97