【遷移】svnserve 配置

題外話:Debian 上 Dovecot 終於升級到 2.0.18 了,CalenderServer 也升級了一把,解決了 Python 2.7 下無法啟動的問題,Samba 4 居然也打包了,雖然安裝時報一大堆錯。。。

作為 GIT 派,本來是不想配置 Subversion 的,不過對 TortoiseSVN 還真是印象良好,加上考慮到大眾需求,未必所有人都喜歡 GIT 這樣的口味,所以還是配置下 svnserve 玩玩。svn 最近的發展也挺有意思,.svn 目錄只放在頂級工作目錄里,fsfs 庫的文件存儲方式增加了 shard 特性,避免一個目錄下有太多文件,還增加了 svnadmin pack 命令,頗有像 GIT 看齊的意思,不得不再贊一下 Linus 的高瞻遠矚。

Subversion 的服務端有三種運行方式:svnbook.red-bean.com/en

  • Apache + mod_dav_svn,亮點是可以利用 Apache 的認證機制、詳細的訪問日誌、單寫多讀主從代理機制以及簡單的代碼庫瀏覽 Web 界面。
  • svnserve daemon 或者 inetd
  • svnserve + ssh

之前用 subversion 時一直用第一種方式,但在我這個 SSO 方案里,它有一些問題:代碼庫被 www-data 用戶所有,同一個 Apache 上服務的其它 web 應用如果有漏洞,那麼代碼庫也有暴露風險;mod_kerb 得到的用戶名帶有 @REALM 後綴,我估計很可能 mod_dav_svn 得到的也是這種用戶名,這樣寫 authz 文件時比較羅嗦。

第三種方式下 svnserve 所在機器需要定製 login shell,避免用戶可以登錄 svnserve 所在伺服器獲得 shell 訪問,但即使這麼做,由於 svnserve 處於 tunnel 模式,以 ssh 登錄用戶身份運行,所以要特別注意 svn repository 的文件許可權,一般需要把所有用戶放入 git 組,並使用 svnwrap 來統一 umask;如果仿造 gitolite 的做法,用同一個 svn 賬戶,用戶用 ssh 公鑰認證提交,那又用不了 kerberos 認證,而且很可能 svn log 里的 author 全是 svn 賬戶了。

由於 svnserve 支持 SASL 認證,所以還是第二種方式最完美,不需要用戶可以登錄 svnserve 所在機器,可以用 Cyrus SASL 支持的 GSSAPI 認證,svnserve 的 --log-file 選項可以記錄 svn 訪問日誌,美中不足的是 svnserve 的錯誤日誌完全沒有,比如登錄失敗了 svnserve 屁都不放一個,還好 Cyrus SASL 有調試日誌。另一個問題是 svnserve 不支持接收到 SIGHUP 時重新打開日誌文件,所以做日誌 rotation 時需要重啟 svnserve 服務。

Debian 打包的 Subversion 沒有提供 svnserve 的 /etc/init.d/svnserve 文件,我折騰了下,仿照 /etc/init.d/skeleton 寫了一個,並創建了 svn 用戶以及 svn 組,讓 svnserve 以 svn 用戶身份運行。svnserve 的 SASL 認證配置文件可以放在 /etc/sasl2/svn.conf 里。一番折騰後,svnserve 的 GSSAPI 認證搞定,Linux 下 svn 命令行以及 Windows 下 TortoiseSVN 都可以。需要注意的一點是 Kerberos for Windows 里如果當前 principal 不是 default principal,那麼 TortoiseSVN、Putty 在做 GSSAPI 認證時都會觸發 Kerberos for Windows 彈出密碼輸入窗口。


推薦閱讀:
查看原文 >>
相关文章