背景

  目前公司使用SVN和GIT作为版本管理配置工具,而随着服务项目数量的增多,单个服务器的压力的压力越来愈大,集群部署成了必然之选(SVN,GIT的Nginx集群搭建后续再写),而集群部署最为麻烦的地方在于保证权限数据一致。采用本地文件/数据库方式然后同步固然可行,但使用LDAP域认证则在以下几个方面更具优势:

  • 无论是SVN集群还是GIT服务器都使用相同用户名/密码
  • 敏感的密码信息不会落地,没有失窃风险
  • 用户信息失效(离职)等能够及时生效

  同时由于目前公司了两个LDAP域,因此对LDAP认证的要求必然是能够支持多域认证,只有当两个域中有用户冲突(极少)时才需手工维护用户验证信息。
  *PS:生产系统基于统一认证系统只用输一次用户密码,即可多系统间的单点登陆鉴权方式显然更为方便,不过由于SVN和GIT不是生产系统,因此还是使用了LDAP域认证。

给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域认证了!

GITLAB-CE社区免费版增加多LDAP域支持

  GIT的服务端使用了GITLAB-CE社区免费版,在官方说明文档上有LDAP域的详细配置信息,因此配置起来不难,直接修改/etc/gitlab/gitlab.rb中的相关LDAP配置信息即可
图片描述
验证也是ok的。
  接下来多LDAP域配置的支持是一个小小挑战,因为多域支持是GITLAB-EE收费版标明了的一个特性:
图片描述

  再看看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和GIT都支持多域认证了!!完结撒花!!!


唯心不易
29 声望5 粉丝

略懂略懂