12

我想用我们公司的 LDAP 设置 Gitlab 作为演示。但不幸的是,我必须在 gitlab.yml 中输入管理员密码才能使 gitlab 访问 LDAP 服务。问题实际上是管理,因为他们不想只为 Gitlab 设置另一个帐户。有没有办法在不填写我自己的密码的情况下绕过这个问题?有没有办法让 Gitlab 仅使用提供的用户凭据建立 LDAP 连接?

除了匿名登录还有什么想法吗?

已经张贴在这里

4

3 回答 3

11

我还没有尝试过,但是根据我迄今为止构建的针对 LDAP 进行身份验证的内容以及来自配置文件的信息,这个用户帐户似乎只在您的 LDAP 不支持匿名绑定和搜索时才需要。

所以我会留下这两个条目bind_dnpassword注释掉并尝试它是否有效。

更新

我已经在 Gitlab 中实现了 LDAP-Autehntication,它相当简单。

gitlab.yml-file 中有一个名为ldap.

您必须在此处提供连接到 LDAP 的信息。好像所有的字段都得给,好像没有fallback default!如果您想使用匿名绑定来检索用户 DN,请为bind_dn and提供一个空字符串password。评论他们似乎不起作用!至少我收到了 501 错误消息。

更多信息可以在https://github.com/patthoyts/gitlabhq/wiki/Setting-up-ldap-auth和(更过时但仍然有用)https://github.com/intridea/omniauth-ldap找到

于 2013-03-11T08:39:59.973 回答
6

我已经修补了 gitlab 以这种方式工作,并在 https://foivos.zakkak.net/tutorials/gitlab_ldap_auth_without_querying_account/中记录了该过程

为了自我完整性,我无耻地复制了这里的说明。

注意:本教程最后使用从源代码安装的 gitlab 8.2 进行了测试。

本教程旨在描述如何修改Gitlab安装以使用用户凭据向 LDAP 服务器进行身份验证。默认情况下, Gitlab依赖匿名绑定或特殊查询用户来询问 LDAP 服务器用户的存在,然后再使用她自己的凭据对她进行身份验证。然而,出于安全原因,许多管理员禁用匿名绑定并禁止创建特殊查询LDAP 用户。

在本教程中,我们假设我们在 gitlab.example.com 上有一个 gitlab 设置和一个在 ldap.example.com 上运行的 LDAP 服务器,并且用户具有以下形式的 DN CN=username,OU=Users,OU=division,OU=department,DC=example,DC=com:.

打补丁

为了让Gitlab在这种情况下工作,我们需要部分修改其关于 LDAP 的身份验证机制。

首先,我们用这个派生替换了omniauth-ldap 模块。为此,我们将以下补丁应用于gitlab/Gemfile

diff --git a/Gemfile b/Gemfile
index 1171eeb..f25bc60 100644
--- a/Gemfile
+++ b/Gemfile
@@ -44,4 +44,5 @@ gem 'gitlab-grack', '~> 2.0.2', require: 'grack'
 # LDAP Auth
 # GitLab fork with several improvements to original library. For full list of changes 
 # see https://github.com/intridea/omniauth-ldap/compare/master...gitlabhq:master
-gem 'gitlab_omniauth-ldap', '1.2.1', require: "omniauth-ldap"
+#gem 'gitlab_omniauth-ldap', '1.2.1', require: "omniauth-ldap"
+gem 'gitlab_omniauth-ldap', :git => 'https://github.com/zakkak/omniauth-ldap.git', require: 'net-ldap', require: "omniauth-ldap"

现在,我们需要执行以下操作:

  1. sudo -u git -H bundle install --without development test mysql --path vendor/bundle --no-deployment
  2. sudo -u git -H bundle install --deployment --without development test mysql aws

这些命令将获取修改后的omniauth-ldap 模块 gitlab/vendor/bundle/ruby/2.x.x/bundler/gems。现在模块已获取,我们需要修改它以使用 LDAP 服务器期望的 DN。我们通过修补lib/omniauth/strategies/ldap.rb来 实现这一点gitlab/vendor/bundle/ruby/2.x.x/bundler/gems/omniauth-ldap

diff --git a/lib/omniauth/strategies/ldap.rb b/lib/omniauth/strategies/ldap.rb
index 9ea62b4..da5e648 100644
--- a/lib/omniauth/strategies/ldap.rb
+++ b/lib/omniauth/strategies/ldap.rb
@@ -39,7 +39,7 @@ module OmniAuth
         return fail!(:missing_credentials) if missing_credentials?

         # The HACK!  FIXME: do it in a more generic/configurable way
-        @options[:bind_dn]  = "CN=#{request['username']},OU=Test,DC=my,DC=example,DC=com"
+        @options[:bind_dn]  = "CN=#{request['username']},OU=Users,OU=division,OU=department,DC=example,DC=com"
         @options[:password] = request['password']
         @adaptor = OmniAuth::LDAP::Adaptor.new @options

使用此模块,gitlab 使用用户的凭据绑定到 LDAP 服务器并对其进行查询,以及对用户本人进行身份验证。

但是,这仅在用户不使用 ssh-keys 与Gitlab进行身份验证时才有效。通过 ssh-key 进行身份验证时,默认情况下Gitlab 会查询 LDAP 服务器以查明相应的用户是否(仍然)是有效用户。此时,我们无法使用用户凭据来查询 LDAP 服务器,因为用户没有将它们提供给我们。结果我们禁用了这个机制,本质上允许注册了 ssh-keys 但从 LDAP 服务器中删除的用户仍然使用我们的Gitlab设置。为了防止此类用户仍然能够使用您的Gitlab设置,您必须从设置中的任何帐户中手动删除他们的 ssh 密钥。

要禁用此机制,我们使用以下补丁gitlab/lib/gitlab/ldap/access.rb

diff --git a/lib/gitlab/ldap/access.rb b/lib/gitlab/ldap/access.rb
index 16ff03c..9ebaeb6 100644
--- a/lib/gitlab/ldap/access.rb
+++ b/lib/gitlab/ldap/access.rb
@@ -14,15 +14,16 @@ module Gitlab
       end

       def self.allowed?(user)
-        self.open(user) do |access|
-          if access.allowed?
-            user.last_credential_check_at = Time.now
-            user.save
-            true
-          else
-            false
-          end
-        end
+        true
+        # self.open(user) do |access|
+        #   if access.allowed?
+        #     user.last_credential_check_at = Time.now
+        #     user.save
+        #     true
+        #   else
+        #     false
+        #   end
+        # end
       end

       def initialize(user, adapter=nil)
@@ -32,20 +33,21 @@ module Gitlab
       end

def allowed?
-        if Gitlab::LDAP::Person.find_by_dn(user.ldap_identity.extern_uid, adapter)
-          return true unless ldap_config.active_directory
+        true
+        # if Gitlab::LDAP::Person.find_by_dn(user.ldap_identity.extern_uid, adapter)
+        #   return true unless ldap_config.active_directory

-          # Block user in GitLab if he/she was blocked in AD
-          if Gitlab::LDAP::Person.disabled_via_active_directory?(user.ldap_identity.extern_uid, adapter)
-            user.block unless user.blocked?
-            false
-          else
-            user.activate if user.blocked? && !ldap_config.block_auto_created_users
-            true
-          end
-        else
-          false
-        end
+        #   # Block user in GitLab if he/she was blocked in AD
+        #   if Gitlab::LDAP::Person.disabled_via_active_directory?(user.ldap_identity.extern_uid, adapter)
+        #     user.block unless user.blocked?
+        #     false
+        #   else
+        #     user.activate if user.blocked? && !ldap_config.block_auto_created_users
+        #     true
+        #   end
+        # else
+        #   false
+        # end
rescue
false
end

配置

gitlab.yml使用类似以下的内容(根据您的需要修改):

#
# 2. Auth settings
# ==========================

## LDAP settings
# You can inspect a sample of the LDAP users with login access by running:
#   bundle exec rake gitlab:ldap:check RAILS_ENV=production
ldap:
  enabled: true
  servers:
    ##########################################################################
    #
    # Since GitLab 7.4, LDAP servers get ID's (below the ID is 'main'). GitLab
    # Enterprise Edition now supports connecting to multiple LDAP servers.
    #
    # If you are updating from the old (pre-7.4) syntax, you MUST give your
    # old server the ID 'main'.
    #
    ##########################################################################
    main: # 'main' is the GitLab 'provider ID' of this LDAP server
      ## label
      #
      # A human-friendly name for your LDAP server. It is OK to change the label later,
      # for instance if you find out it is too large to fit on the web page.
      #
      # Example: 'Paris' or 'Acme, Ltd.'
      label: 'LDAP_EXAMPLE_COM'

      host: ldap.example.com
      port: 636
      uid: 'sAMAccountName'
      method: 'ssl' # "tls" or "ssl" or "plain"
      bind_dn: ''
      password: ''

      # This setting specifies if LDAP server is Active Directory LDAP server.
      # For non AD servers it skips the AD specific queries.
      # If your LDAP server is not AD, set this to false.
      active_directory: true

      # If allow_username_or_email_login is enabled, GitLab will ignore everything
      # after the first '@' in the LDAP username submitted by the user on login.
      #
      # Example:
      # - the user enters 'jane.doe@example.com' and 'p@ssw0rd' as LDAP credentials;
      # - GitLab queries the LDAP server with 'jane.doe' and 'p@ssw0rd'.
      #
      # If you are using "uid: 'userPrincipalName'" on ActiveDirectory you need to
      # disable this setting, because the userPrincipalName contains an '@'.
      allow_username_or_email_login: false

      # To maintain tight control over the number of active users on your GitLab installation,
      # enable this setting to keep new users blocked until they have been cleared by the admin
      # (default: false).
      block_auto_created_users: false

      # Base where we can search for users
      #
      #   Ex. ou=People,dc=gitlab,dc=example
      #
      base: 'OU=Users,OU=division,OU=department,DC=example,DC=com'

      # Filter LDAP users
      #
      #   Format: RFC 4515 http://tools.ietf.org/search/rfc4515
      #   Ex. (employeeType=developer)
      #
      #   Note: GitLab does not support omniauth-ldap's custom filter syntax.
      #
      user_filter: '(&(objectclass=user)(objectclass=person))'
于 2016-01-03T01:16:03.407 回答
2

GitLab 使用omniauth来管理多个登录源(包括LDAP)。

因此,如果您可以以某种方式扩展omniauth以以不同方式管理 LDAP 连接,则可以从其他来源获取密码。
这将允许您避免在配置文件的ldap 部分gitlab.yml保留所述密码。

于 2013-03-10T13:38:04.420 回答