目前公司使用SVN和GIT做爲版本管理配置工具,而隨着服務項目數量的增多,單個服務器的壓力的壓力越來愈大,集羣部署成了必然之選(SVN,GIT的Nginx集羣搭建後續再寫),而集羣部署最爲麻煩的地方在於保證權限數據一致。採用本地文件/數據庫方式而後同步當然可行,但使用LDAP域認證則在如下幾個方面更具優點:linux
同時因爲目前公司了兩個LDAP域,所以對LDAP認證的要求必然是可以支持多域認證,只有當兩個域中有用戶衝突(極少)時才需手工維護用戶驗證信息。
*PS:生產系統基於統一認證系統只用輸一次用戶密碼,便可多系統間的單點登錄鑑權方式顯然更爲方便,不過因爲SVN和GIT不是生產系統,所以仍是使用了LDAP域認證。git
SVN服務器使用的是免費的Collabnet的Subversion edgehttps://www.collab.net/downlo...,它是一個集成了Apache+SVN並提供了管理端的整合工具,登錄它的管理端,就發現它管理端是支持配置LDAP認證的。
配置後驗證LDAP域可以正常工做,但這顯然不知足多域認證要求,這就須要進一步進行後臺配置改造了!數據庫
後臺的SVN權限認證工做仍是Apache httpd來完成的,只要httpd支持,直接修改 httpd的配置文件應該可以實現多域的。故上網搜索httpd multiple ldap便可發現配置方法https://www.linuxquestions.or...
參照網上方法直接編輯後臺的httpd.conf文件以下:(注意httpd.conf中要註釋掉這個引入#Include "data/conf/svn_viewvc_httpd.conf",不然會直接使用Subversion edge管理端配置,配置不生效)
再次驗證!失敗!難道網上是忽悠的麼?此次直接去apache httpd官網上仔細搜索,通過千心萬苦終於發現這個是因爲apache httpd2.4.7以前存在bug,配置不報錯,可是並不生效!須要升級到2.4.7版本以後才能起做用!這開源軟件也是坑啊!
因爲升級apache版本須要從新編譯httpd和svn,操做太麻煩(原來在aix上編譯這一套依賴包都找半天!C語言開源搞不起來不是沒有道理的。。。)故直接從新升級了Subversion edge爲最新版本,謝天謝地,它用的是正好是httpd2.4.7!
測試結果ok,SVN終於支持多LDAP域認證了!apache
GIT的服務端使用了GITLAB-CE社區免費版,在官方說明文檔上有LDAP域的詳細配置信息,所以配置起來不難,直接修改/etc/gitlab/gitlab.rb中的相關LDAP配置信息便可
驗證也是ok的。
接下來多LDAP域配置的支持是一個小小挑戰,由於多域支持是GITLAB-EE收費版標明瞭的一個特性:
ruby
再看看GITLAB-EE收費標準,每個用戶,一個月都要收4美金!!你怎麼不去搶啊!!!
沒錢只能本身動手了,LDAP多域認證,不就應該是認證時再加一個分支這麼點事麼?ruby這種腳本語言工程都不用搭,直接定位到代碼修改就ok了!憑證這兩點信念和本身半吊子ROR的水平開始了LDAP認證定位。
具體找的過程就不說了。。各類醜陋的Print打印日誌進行跟蹤,可是最終仍是被我找到文件了:
/opt/gitlab/embedded/lib/ruby/gems/2.3.0/gems/gitlab_omniauth-ldap-1.2.1/lib/omniauth/strategies/ldap.rb服務器
def callback_phase #一個ldap相關信息 @options.host='' @options.password='' @options.bind_dn='' @adaptor = OmniAuth::LDAP::Adaptor.new @options return fail!(:missing_credentials) if missing_credentials? begin @ldap_user_info = @adaptor.bind_as(:filter => filter(@adaptor), :size => 1, :password => request['password']) #增長修改第二個ldap域認證支持 if !@ldap_user_info @options.host='' @options.password='' @options.bind_dn='' @adaptor = OmniAuth::LDAP::Adaptor.new @options @ldap_user_info = @adaptor.bind_as(:filter => filter(@adaptor), :size => 1, :password => request['password']) end return fail!(:invalid_credentials) if !@ldap_user_info @user_info = self.class.map_user(@@config, @ldap_user_info) super rescue Exception => e return fail!(:ldap_error, e) end end
咱們在認證的時候增長本身須要的額外域分支就好了!短短几行代碼搞定,雖然簡陋,可是好歹支持多域認證了,省錢了不是:)
然而好事多磨,驗證的時候仍然報了AccessDenied,繼續跟蹤,發現是在是否blockuser時也多ldap進行了判斷,若是user在ldap中不存在,則會進行block處理,故這塊也須要增長多域調整,對應文件以下:
/opt/gitlab/embedded/service/gitlab-rails/lib/gitlab/ldap/access.rb,修改後再次認證終於經過了!svn
終於至此,SVN和GIT都支持多域認證了!!完結撒花!!!工具