web-dev-qa-db-ja.com

gitlabLDAPのセットアップ-特別なgitlabユーザーなしでの認証

デモとして、会社のLDAPを使用してGitlabをセットアップしたいと思います。しかし残念ながら、gitlabがLDAPサービスにアクセスできるようにするには、gitlab.ymlに管理者パスワードを入力する必要があります。問題は実際には管理です。彼らはGitlabのためだけに別のアカウントを設定したくないからです。自分のパスワードを入力せずにこれを回避する方法はありますか?提供されたユーザー資格情報のみでGitlabにLDAP接続を確立させる方法はありますか?

匿名でログインする以外のアイデアはありますか?

すでに投稿されています ここ

11
Bubu

まだ試していませんが、これまでに作成したLDAPに対する認証と構成ファイルの情報から、このユーザーアカウントは、LDAPが匿名のバインドと検索をサポートしていない場合にのみ必要になるようです。

したがって、2つのエントリbind_dnpasswordをコメント化したままにして、機能するかどうかを試します。

[〜#〜]更新[〜#〜]

LDAP-Autehnticationを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

11
heiglandreas

このように動作するようにgitlabにパッチを適用し、プロセスを https://foivos.zakkak.net/tutorials/gitlab_ldap_auth_without_querying_account/ で文書化しました。

私は恥知らずにここの指示を自己完結のためにコピーします。

:このチュートリアルは、ソースからインストールされたgitlab 8.2で最後にテストされました。

このチュートリアルの目的は、 Gitlab インストールを変更して、ユーザーの資格情報を使用してLDAPサーバーで認証する方法を説明することです。デフォルトでは Gitlab は匿名バインディングまたは特別なqueryingユーザーに依存して、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モジュールを this 派生に置き換えます。これを実現するために、次のパッチを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.rbgitlab/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キーを使用して認証する場合、デフォルトでは 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 '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))'
5
zakkak

GitLabはomniauthを使用して複数のログインソース(LDAPを含む)を管理します。

したがって、LDAP接続を別の方法で管理するために何らかの方法でomniauthを拡張できる場合は、別のソースからパスワードを取得できます。
これにより、上記のパスワードを gitlab.yml構成ファイルのldapセクション に保持することを回避できます。

1
VonC