|
Apache的HTTP服務器是一個Subversion可以利用的“重型”網(wǎng)絡(luò)服務器,通過一個自定義模塊,httpd可以讓Subversion版本庫通過WebDAV/DeltaV協(xié)議在客戶端前可見,WebDAV/DeltaV協(xié)議是HTTP 1.1的擴展(見 下面的討論包括了對Apache配置指示的引用,給了一些使用這些指示的例子,詳細地描述不在本章的范圍之內(nèi),Apache小組維護了完美的文檔,公開存放在他們的站點 同樣,當你修改你的Apache設(shè)置,很有可能會出現(xiàn)一些錯誤,如果你還不熟悉Apache的日志子系統(tǒng),你一定需要認識到這一點。在你的文件 為了讓你的版本庫使用HTTP網(wǎng)絡(luò),你基本上需要兩個包里的四個部分。你需要Apache httpd 2.0和包括的mod_dav DAV模塊,Subversion和與之一同分發(fā)的mod_dav_svn文件系統(tǒng)提供者模塊,如果你有了這些組件,網(wǎng)絡(luò)化你的版本庫將非常簡單,如:
你可以通過從源代碼編譯httpd和Subversion來完成前兩個項目,也可以通過你的系統(tǒng)上的已經(jīng)編譯好的二進制包來安裝。最新的使用Apache HTTP的Subversion的編譯方法和Apache的配置方式可以看Subversion源代碼樹根目錄的 一旦你安裝了必須的組件,剩下的工作就是在 LoadModule dav_svn_module modules/mod_dav_svn.so 注意,如果mod_dav是作為共享對象編譯(而不是靜態(tài)鏈接到httpd程序),你需要為它使用使用 LoadModule dav_module modules/mod_dav.so LoadModule dav_svn_module modules/mod_dav_svn.so 在你的配置文件后面的位置,你需要告訴Apache你在什么地方保存Subversion版本庫(也許是多個), <Location /repos> DAV svn SVNPath /absolute/path/to/repository </Location> 如果你計劃支持多個具備相同父目錄的Subversion版本庫,你有另外的選擇, <Location /svn> DAV svn # any "/svn/foo" URL will map to a repository /usr/local/svn/foo SVNParentPath /usr/local/svn </Location> 使用上面的語法,Apache會代理所有URL路徑部分為 請確定當你定義新的 在本階段,你一定要考慮訪問權(quán)限問題,如果你已經(jīng)作為普通的web服務器運行過Apache,你一定有了一些內(nèi)容—網(wǎng)頁、腳本和其他。這些項目已經(jīng)配置了許多在Apache下可以工作的訪問許可,或者更準確一點,允許Apache與這些文件一起工作。Apache當作為Subversion服務器運行時,同樣需要正確的訪問許可來讀寫你的Subversion版本庫。(見服務器和訪問許可:一個警告。) 你會需要檢驗權(quán)限系統(tǒng)的設(shè)置滿足Subversion的需求,同時不會把以前的頁面和腳本搞亂。這或許意味著修改Subversion的訪問許可來配合Apache服務器已經(jīng)使用的工具,或者可能意味著需要使用 此時,如果你配置的 <Location /svn> DAV svn SVNParentPath /usr/local/svn </Location> 這樣你的版本庫對全世界是可以“匿名”訪問的,直到你配置了一些認證授權(quán)政策,你通過
最簡單的客戶端認證方式是通過HTTP基本認證機制,簡單的使用用戶名和密碼來驗證一個用戶所自稱的身份,Apache提供了一個htpasswd工具來管理可接受的用戶名和密碼,這些就是你希望賦予Subversion特別權(quán)限的用戶,讓我們給Sally和Harry賦予提交權(quán)限,首先,我們需要添加他們到密碼文件。 $ ### First time: use -c to create the file $ ### Use -m to use MD5 encryption of the password, which is more secure $ htpasswd -cm /etc/svn-auth-file harry New password: ***** Re-type new password: ***** Adding password for user harry $ htpasswd -m /etc/svn-auth-file sally New password: ******* Re-type new password: ******* Adding password for user sally $ 下一步,你需要在 添加完這三個指示,你的 <Location /svn> DAV svn SVNParentPath /usr/local/svn AuthType Basic AuthName "Subversion repository" AuthUserFile /etc/svn-auth-file </Location> 這個 <Location /svn> DAV svn SVNParentPath /usr/local/svn AuthType Basic AuthName "Subversion repository" AuthUserFile /etc/svn-auth-file Require valid-user </Location> 一定要閱讀后面的部分(“授權(quán)選項”一節(jié))來得到 需要警惕:HTTP基本認證的密碼是用明文傳輸,因此非常不可靠的,如果你擔心密碼偷窺,最好是使用某種SSL加密,所以客戶端認證使用 商業(yè)應用需要越過公司防火墻的版本庫訪問,防火墻需要小心的考慮非認證用戶“吸取”他們的網(wǎng)絡(luò)流量的情況,SSL讓那種形式的關(guān)注更不容易導致敏感數(shù)據(jù)泄露。 如果Subversion使用OpenSSL編譯,它就會具備與Subversion服務器使用 怎樣產(chǎn)生客戶端和服務器端證書以及怎樣使用它們已經(jīng)超出了本書的范圍,許多書籍,包括Apache自己的文檔,描述這個任務,現(xiàn)在我們可以覆蓋的是普通的客戶端怎樣來管理服務器與客戶端證書。 當通過
如果客戶端接收了一個服務器證書,它需要去驗證它是可以相信的:這個服務器是它自稱的那一個嗎?OpenSSL庫會去檢驗服務器證書的簽名人或者是核證機構(gòu)(CA)。如果OpenSSL不可以自動信任這個CA,或者是一些其他的問題(如證書過期或者是主機名不匹配),Subversion命令行客戶端會詢問你是否愿意仍然信任這個證書: $ svn list https://host./repos/project Error validating server certificate for ‘https://host.:443‘: - The certificate is not issued by a trusted authority. Use the fingerprint to validate the certificate manually! Certificate information: - Hostname: host. - Valid: from Jan 30 19:23:56 2004 GMT until Jan 30 19:23:56 2006 GMT - Issuer: CA, , Sometown, California, US - Fingerprint: 7d:e1:a9:34:33:39:ba:6a:e9:a5:c4:22:98:7b:76:5c:92:a0:9c:7b (R)eject, accept (t)emporarily or accept (p)ermanently? 這個對話看起來很熟悉,這是你會在web瀏覽器(另一種HTTP客戶端,就像Subversion)經(jīng)??吹降膯栴},如果你選擇(p)ermanent選項,服務器證書會存放在你存放那個用戶名和密碼緩存(見“客戶端憑證緩存”一節(jié)。)的私有運行區(qū) 你的運行中 [global] ssl-authority-files = /path/to/CAcert1.pem;/path/to/CAcert2.pem 許多OpenSSL安裝包括一些預先定義好的可以普遍信任的“缺省的”CA,為了讓Subversion客戶端自動信任這些標準權(quán)威,設(shè)置 當與Apache通話時,Subversion客戶端也會收到一個證書的要求,Apache是詢問客戶端來證明自己的身份:這個客戶端是否是他所說的那一個?如果一切正常,Subversion客戶端會發(fā)送回一個通過Apache信任的CA簽名的私有證書,一個客戶端證書通常會以加密方式存放在磁盤,使用本地密碼保護,當Subversion收到這個要求,它會詢問你證書的路徑和保護用的密碼: $ svn list https://host./repos/project Authentication realm: https://host.:443 Client certificate filename: /path/to/my/cert.p12 Passphrase for ‘/path/to/my/cert.p12‘: ******** … 注意這個客戶端證書是一個“p12”文件,為了讓Subversion使用客戶端證書,它必須是運輸標準的PKCS#12格式,大多數(shù)瀏覽器可以導入和導出這種格式的證書,另一個選擇是用OpenSSL命令行工具來轉(zhuǎn)化存在的證書為PKCS#12格式。 再次,運行中 [groups] examplehost = host. [examplehost] ssl-client-cert-file = /path/to/my/cert.p12 ssl-client-cert-password = somepassword 一旦你設(shè)置了 此刻,你已經(jīng)配置了認證,但是沒有配置授權(quán),Apache可以要求用戶認證并且確定身份,但是并沒有說明這個身份的怎樣允許和限制,這個部分描述了兩種控制訪問版本庫的策略。 最簡單的訪問控制形式是授權(quán)特定用戶為只讀版本庫訪問或者是讀/寫訪問版本庫。 你可以通過在 <Location /svn> DAV svn SVNParentPath /usr/local/svn # how to authenticate a user AuthType Basic AuthName "Subversion repository" AuthUserFile /path/to/users/file # only authenticated users may access the repository Require valid-user </Location> 有時候,你不需要這樣嚴密,舉個例子,Subversion自己在 在 <Location /svn> DAV svn SVNParentPath /usr/local/svn # how to authenticate a user AuthType Basic AuthName "Subversion repository" AuthUserFile /path/to/users/file # For any operations other than these, require an authenticated user. <LimitExcept GET PROPFIND OPTIONS REPORT> Require valid-user </LimitExcept> </Location> 這里只是一些簡單的例子,想看關(guān)于Apache訪問控制 也可以使用Apache的httpd模塊mod_authz_svn更加細致的設(shè)置訪問權(quán)限,這個模塊收集客戶端傳遞過來的不同的晦澀的URL信息,詢問mod_dav_svn來解碼,然后根據(jù)在配置文件定義的訪問政策來裁決請求。 如果你從源代碼創(chuàng)建Subversion,mod_authz_svn會自動附加到mod_dav_svn,許多二進制分發(fā)版本也會自動安裝,為了驗證它是安裝正確,確定它是在 LoadModule dav_module modules/mod_dav.so LoadModule dav_svn_module modules/mod_dav_svn.so LoadModule authz_svn_module modules/mod_authz_svn.so 為了激活這個模塊,你需要配置你的 Apache非常的靈活,你可以從三種模式里選擇一種來配置你的區(qū)塊,作為開始,你選擇一種基本的配置模式。(下面的例子非常簡單;見Apache自己的文檔中的認證和授權(quán)選項來查看更多的細節(jié)。) 最簡單的區(qū)塊是允許任何人可以訪問,在這個場景里,Apache決不會發(fā)送認證請求,所有的用戶作為“匿名”對待。 在另一個極端,你可以配置為拒絕所有人的認證,所有客戶端必須提供證明自己身份的證書,你通過 第三種流行的模式是允許認證和匿名用戶的組合,舉個例子,許多管理員希望允許匿名用戶讀取特定的版本庫路徑,但希望只有認證用戶可以讀(或者寫)更多敏感的區(qū)域,在這個設(shè)置里,所有的用戶開始時用匿名用戶訪問版本庫,如果你的訪問控制策略在任何時候要求一個真實的用戶名,Apache將會要求認證客戶端,為此,你可以同時使用 一旦你的基本 訪問文件的語法與svnserve.conf和運行中配置文件非常相似,以( 具體一點:這個小節(jié)的名稱是 [calc:/branches/calc/bug-142] harry = rw sally = r 在第一個例子里,用戶 當然,訪問控制是父目錄傳遞給子目錄的,這意味著我們可以為Sally指定一個子目錄的不同訪問策略: [calc:/branches/calc/bug-142] harry = rw sally = r # give sally write access only to the ‘testing‘ subdir [calc:/branches/calc/bug-142/testing] sally = rw 現(xiàn)在Sally可以讀取分支的 也可以通過繼承規(guī)則明確的的拒絕某人的訪問,只需要設(shè)置用戶名參數(shù)為空: [calc:/branches/calc/bug-142] harry = rw sally = r [calc:/branches/calc/bug-142/secret] harry = 在這個例子里,Harry對 有一件事需要記住的是需要找到最匹配的目錄,mod_authz_svn模塊首先找到匹配自己的目錄,然后父目錄,然后父目錄的父目錄,就這樣繼續(xù)下去,更具體的路徑控制會覆蓋所有繼承下來的訪問控制。 缺省情況下,沒有人對版本庫有任何訪問,這意味著如果你已經(jīng)從一個空文件開始,你會希望給所有用戶對版本庫根目錄具備讀權(quán)限,你可以使用 [/] * = r 這是一個普通的設(shè)置;注意在小節(jié)名中沒有提到版本庫名稱,這讓所有版本庫對所有的用戶可讀,不管你是使用 星號( 訪問文件也允許你定義一組的用戶,很像Unix的 [groups] calc-developers = harry, sally, joe paint-developers = frank, sally, jane everyone = harry, sally, joe, frank, sally, jane 組可以被賦予通用戶一樣的訪問權(quán)限,使用“at”( [calc:/projects/calc] @calc-developers = rw [paint:/projects/paint] @paint-developers = rw jane = r ...并且非常接近。 mod_dav_svn模塊做了許多工作來確定你標記為“不可讀”的數(shù)據(jù)不會因意外而泄露,這意味著需要緊密監(jiān)控通過svn checkout或是svn update返回的路徑和文件內(nèi)容,如果這些命令遇到一些根據(jù)認證策略不是可讀的路徑,這個路徑通常會被一起忽略,在歷史或者重命名操作時—例如運行一個類似svn cat -r OLD foo.c的命令來操作一個很久以前改過名字的文件 — 如果一個對象的以前的名字檢測到是只讀的,重命令追蹤就會終止。 所有的路徑檢查在有時會非常昂貴,特別是svn log的情況。當檢索一列修訂版本時,服務器會查看所有修訂版本修改的路徑,并且檢查可讀性,如果發(fā)現(xiàn)了一個不可讀路徑,它會從修訂版本的修改路徑中忽略(可以查看 在另一方面,也有一個安全艙門允許你用安全特性來交換速度,如果你不是堅持要求有每目錄授權(quán)(如不使用 mod_authz_svn和類似的模塊),你就可以關(guān)閉所有的路徑檢查,在你的
我們已經(jīng)覆蓋了關(guān)于認證和授權(quán)的Apache和mod_dav_svn的大多數(shù)選項,但是Apache還提供了許多很好的特性。 一個非常有用的好處是使用Apache/WebDAV配置Subversion版本庫時可以用普通的瀏覽器察看最新的版本庫文件,因為Subversion使用URL來鑒別版本庫版本化的資源,版本庫使用的HTTP為基礎(chǔ)的URL也可以直接輸入到Web瀏覽器中,你的瀏覽器會發(fā)送一個 因為URL不能確定你所希望看到的資源的版本,mod_dav_svn會一直返回最新的版本,這樣會有一些美妙的副作用,你可以直接把Subversion的URL傳遞給文檔作為引用,這些URL會一直指向文檔最新的材料,當然,你也可以在別的網(wǎng)站作為超鏈使用這些URL。 你通常會在版本化的文件的URL之外得到更多地用處—畢竟那里是有趣的內(nèi)容存在的地方,但是你會偶爾瀏覽一個Subversion的目錄列表,你會很快發(fā)現(xiàn)展示列表生成的HTML非?;?,并且一定沒有在外觀上(或者是有趣上)下功夫,為了自定義這些目錄顯示,Subversion提供了一個XML目錄特性,一個單獨的 <Location /svn> DAV svn SVNParentPath /usr/local/svn SVNIndexXSLT "/svnindex.xsl" … </Location> 使用 Apache作為一個健壯的Web服務器的許多特性也可以用來增加Subversion的功能性和安全性,Subversion使用Neon與Apache通訊,這是一種一般的HTTP/WebDAV庫,可以支持SSL和Deflate壓縮(是gzip和PKZIP程序用來“壓縮”文件為數(shù)據(jù)塊的一樣的算法)之類的機制。你只需要編譯你希望Subversion和Apache需要的特性,并且正確的配置程序來使用這些特性。 Deflate壓縮給服務器和客戶端帶來了更多地負擔,壓縮和解壓縮減少了網(wǎng)絡(luò)傳輸?shù)膶嶋H文件的大小,如果網(wǎng)絡(luò)帶寬比較緊缺,這種方法會大大提高服務器和客戶端之間發(fā)送數(shù)據(jù)的速度,在極端情況下,這種最小化的傳輸會造成超時和成功的區(qū)別。 不怎么有趣,但同樣重要,是Apache和Subversion關(guān)系的一些特性,像可以指定自定義的端口(而不是缺省的HTTP的80)或者是一個Subversion可以被訪問的虛擬主機名,或者是通過代理服務器訪問的能力,這些特性都是Neon所支持的,所以Subversion輕易得到這些支持。 最后,因為mod_dav_svn是使用一個半完成的WebDAV/DeltaV方言,所以通過第三方的DAV客戶端訪問也是可能的,幾乎所有的現(xiàn)代操作系統(tǒng)(Win32、OS X和Linux)都有把DAV服務器影射為普通的網(wǎng)絡(luò)“共享”的內(nèi)置能力,這是一個復雜的主題;察看附錄 C, WebDAV和自動版本化來得到更多細節(jié)。 |
|
|
來自: ekylin > 《軟件技術(shù)》