Вопрос по gitlab, ldap – настройка gitlab LDAP-аутентификации без специального пользователя gitlab

9

Я хочу создать Gitlab с нашей компаниейс LDAP как демо. Но, к сожалению, я должен ввести пароль администратора в gitlab.yml, чтобы gitlab получил доступ к службе LDAP. Проблема на самом деле в администрации, так как они неЯ не хочу создавать другую учетную запись только для Gitlab. Есть ли способ обойти это без заполнения моего собственного пароля? Есть ли способ заставить Gitlab устанавливать соединение LDAP только с предоставленными учетными данными пользователя?

Любые идеи, кроме входа в качестве анонимного?

Уже опубликованоВот.

Ваш Ответ

3   ответа
1

GitLab используетOmniAuth управлять несколькими источниками входа в систему (в том числе LDAP).

Так что, если вы можете как-то продлитьomniauth чтобы по-разному управлять соединением LDAP, вы можете получить пароль из другого источника.

Это позволит вам избежать сохранения указанного пароля вldap разделgitlab.yml Конфигурационный файл

Тот'Это была моя первая идея, но куда идти дальше? Я'Я не совсем в рубине. я нашелэтот - поскольку он, кажется, не использует начальную привязку, он выглядит очень многообещающим для меня. У вас есть другие подсказки, куда копать? Bubu
Так вы когда-нибудь заставляли это работать? Я'Я пытаюсь сделать то же самое. orodbhen
@Bubu никаких других намеков прямо сейчас. То, что вы нашли, кажется хорошим примером расширения всеведения, что я и предлагаю. VonC
@DJon Нет, я нечтобы сделать эту работу, как я не имелТочная особенность для поддержки. VonC
9

У меня нетеще не пробовал, но из вещей, которые яДо сих пор мы выполняли аутентификацию на основе LDAP и информации из конфигурационного файла, эта учетная запись пользователя, по-видимому, необходима только тогда, когда ваша LDAP не поддерживает анонимное связывание и поиск.

Поэтому я бы оставил две записиbind_dn а такжеpassword закомментируйте и попробуйте, работает ли он или нет.

UPDATEI»

мы внедрили аутентификацию LDAP в Gitlab и это 'довольно легко.

вgitlab.yml-файл есть раздел называется.ldap

Там вы должны предоставить информацию для подключения к вашему LDAP. Кажется, что все поля должны быть заданы, по-видимому, не существует запасного варианта по умолчанию! Если вы хотите использовать анонимную привязку для извлечения пользователей, укажите пустую строку для DN.bind_dn а такжеpassword, Комментировать их, кажется, не работает! По крайней мере, я получил сообщение об ошибке 501.

Более подробную информацию можно найти наhttps://github.com/patthoyts/gitlabhq/wiki/Setting-up-ldap-auth и (более устаревший, но все же полезный)https://github.com/intridea/omniauth-ldap

Тогда вам понадобится пользователь, который имеет право связываться с LDAP для поиска Bind-DN пользователя, пытающегося войти в систему. Когда анонимный поиск не разрешен, невозможно обойтись. Сожалею. heiglandreas
Потому что очень часто bindDN меняется в зависимости от организационной единицы пользователя. Поэтому вы используете LDAP-запрос, чтобы найти DN пользователя путем поиска уникальной информации, такой как emai-адрес или uid. Однако, если вы уже знаете DN из-за соглашения, возможно, будет возможно использовать omniaurh, как уже предлагалось @VonC. heiglandreas
Но зачем мне искать Bind-DN, если я это уже знаю? Например. пользователь [email protected] хочет войти; Я знаю, что Bind-DN это что-то вроде[email protected], ou = people, dc = example, dc = com " - Gitlab может использовать эту опцию по умолчанию и, таким образом, включить LDAP-Login без необходимости первоначального связывания. Я могу'не понимаю, почему это не стратегия аутентификации LDAP по умолчанию. Bubu
Это не работает в моей компании, так как не установлены разрешения для анонимного связывания или для поиска. Игра с параметрами приводит только к сообщениям об ошибках, поскольку gitlab не может связываться и, следовательно, не может проверить существование предоставленного пользователя (насколько я знаю, gitlab пытается получить полный bind_dn на этом шаге программы). Bubu
5

Я исправил gitlab для работы таким образом и задокументировал процесс вhttps://foivos.zakkak.net/tutorials/gitlab_ldap_auth_without_querying_account/

Я беззастенчиво копирую здесь инструкции для самодостаточности.

Заметка: Этот учебник в последний раз тестировался с gitlab 8.2, установленным из исходного кода.

Этот урок призван описать, как изменитьGitlab установка для использования учетных данных пользователей для аутентификации на сервере LDAP. По умолчаниюGitlab полагается на анонимную привязку или специальныйЗапросы Пользователь должен спросить сервер LDAP о существовании пользователя, прежде чем аутентифицировать его с помощью своих собственных учетных данных. Однако по соображениям безопасности многие администраторы отключают анонимное связывание и запрещают создание специальныхЗапросы Пользователи LDAP.

В этом руководстве мы предполагаем, что у нас есть настройка gitlab на gitlab.example.com и сервер LDAP, работающий на ldap.example.com, а пользователи имеют 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"

Теперь нам нужно выполнить следующие действия:

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

Эти команды будут извлекать модифицированный модуль omniauth-ldap вgitlab/vendor/bundle/ruby/2.x.x/bundler/gems, Теперь, когда модуль выбран, нам нужно изменить его, чтобы использовать DN, ожидаемый нашим LDAP-сервером. Мы достигаем этого путем исправления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 использует пользователяs учетные данные для привязки к серверу LDAP и запроса к нему, а также для аутентификации самого пользователя.

Это, однако, будет работать только до тех пор, пока пользователи не используют ssh-ключи для аутентификации сGitlab, При аутентификации через ssh-ключ по умолчаниюGitlab запрашивает сервер LDAP, чтобы выяснить, является ли соответствующий пользователь (все еще) действительным пользователем или нет. На данный момент мы не можем использовать учетные данные пользователя для запроса сервера LDAP, так как пользователь не предоставил их нам. В результате мы отключаем этот механизм, по существу позволяя пользователям с зарегистрированными ssh-ключами, но удаленными с сервера 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 '[email protected]' and '[email protected]' as LDAP credentials;
      # - GitLab queries the LDAP server with 'jane.doe' and '[email protected]'.
      #
      # 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))'

Похожие вопросы