給SUBVERSION-EDGE和GITLAB-CE增長多LDAP域認證支持的經歷

背景

  目前公司使用SVN和GIT做爲版本管理配置工具,而隨着服務項目數量的增多,單個服務器的壓力的壓力越來愈大,集羣部署成了必然之選(SVN,GIT的Nginx集羣搭建後續再寫),而集羣部署最爲麻煩的地方在於保證權限數據一致。採用本地文件/數據庫方式而後同步當然可行,但使用LDAP域認證則在如下幾個方面更具優點:linux

  • 不管是SVN集羣仍是GIT服務器都使用相同用戶名/密碼
  • 敏感的密碼信息不會落地,沒有失竊風險
  • 用戶信息失效(離職)等可以及時生效

  同時因爲目前公司了兩個LDAP域,所以對LDAP認證的要求必然是可以支持多域認證,只有當兩個域中有用戶衝突(極少)時才需手工維護用戶驗證信息。
  *PS:生產系統基於統一認證系統只用輸一次用戶密碼,便可多系統間的單點登錄鑑權方式顯然更爲方便,不過因爲SVN和GIT不是生產系統,所以仍是使用了LDAP域認證。git

給SVN增長多LDAP域支持

  • Subversion edge管理端配置LDAP域認證

  SVN服務器使用的是免費的Collabnet的Subversion edgehttps://www.collab.net/downlo...,它是一個集成了Apache+SVN並提供了管理端的整合工具,登錄它的管理端,就發現它管理端是支持配置LDAP認證的。
圖片描述
  配置後驗證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

GITLAB-CE社區免費版增長多LDAP域支持

  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都支持多域認證了!!完結撒花!!!工具

相關文章
相關標籤/搜索