web-dev-qa-db-ja.com

HTTP_REMOTE_USER環境変数を使用したgitlab認証

gitlabを発見しました。これを、ApacheHTTP_REMOTE_USER環境変数に依存するグローバル認証プロセスに統合したいと思います。

私はそれに関するドキュメントをほとんど見たことがないので、これを行う方法についての助けを必死に探しています。 gitlabアプリケーションからHTTP_REMOTE_USER変数を取得し、それを使用してユーザーを認証したいと思います。

Omn​​iauthとomniauth-ldapを使用しようとしましたが、これはサーバーのエラー500でのみ返され、ApacheHTTP_REMOTE_USER変数のみを取得するには少しやり過ぎのようです。私が探しているのは、そのような機能が単に存在するのか、それとも間違った方向に進んでいるのかということです。誰かがドキュメントへのリンクを持っている場合!

どうもありがとう


あなたの答えに感謝します!私はすでにApache構成ファイルにRequestHeaderを追加していました(私はあなたとしてApacheをnginxではなくUnicornリバースプロキシとして使用しており、ApacheヘッダーでHTTP_REMOTE_USERをUnicornに転送する必要がありました)。次に、利用可能なパッチを適用しました ここ

あなたとは異なり、私はldapユーザー名/パスワード認証を使用していませんが、自動起動にldapを使用したKerberos認証を使用しています。 gitlab Webページにアクセスすると、認証が許可されていることをログで確認でき、gitlabはLDAPからユーザー属性(電子メールアドレス)を取得します。アカウントも作成されます(allow_single_sign_on:/home/git/gitlab/config/gitlab.ymlファイルでtrue)。ただし、エラー500が表示され、「エラースタックが深すぎます」というログメッセージが表示されます。

次に、ファイルvendor/bundle/Ruby/2.0.0/activesupport-3.2.13/lib/active_support/callbacks.rbを変更して、何が起こっているのかをダミーファイルに配置しました:(行413)

def __reset_runner(symbol)
  f = File::open('/tmp/blah', 'a')
  f.write(caller(1,10))
  f.close()

次に、いくつかの関数(無限ループで相互に呼び出す関数)で再帰することがわかります。 (ここに/ home/git/gitlabのピリオドがあります;最初の行は最後の行の後に繰り返されます):

vendor/bundle/Ruby/2.0.0/gems/activesupport-3.2.13/lib/active_support/callbacks.rb:436:in `block in __update_callbacks'
vendor/bundle/Ruby/2.0.0/gems/activesupport-3.2.13/lib/active_support/callbacks.rb:433:in `each'
vendor/bundle/Ruby/2.0.0/gems/activesupport-3.2.13/lib/active_support/callbacks.rb:433:in `__update_callbacks'
vendor/bundle/Ruby/2.0.0/gems/activesupport-3.2.13/lib/active_support/callbacks.rb:502:in `set_callback'
vendor/bundle/Ruby/2.0.0/gems/activemodel-3.2.13/lib/active_model/callbacks.rb:110:in `before_save'
vendor/bundle/Ruby/2.0.0/gems/activerecord-3.2.13/lib/active_record/autosave_association.rb:189:in `add_autosave_association_callbacks'
vendor/bundle/Ruby/2.0.0/gems/activerecord-3.2.13/lib/active_record/autosave_association.rb:140:in `build'
vendor/bundle/Ruby/2.0.0/gems/activerecord-3.2.13/lib/active_record/associations/builder/has_many.rb:10:in `build'
vendor/bundle/Ruby/2.0.0/gems/activerecord-3.2.13/lib/active_record/associations/builder/collection_association.rb:13:in `build'
vendor/bundle/Ruby/2.0.0/gems/activerecord-3.2.13/lib/active_record/associations.rb:1198:in `has_many'

この段階では、これを修正する方法が本当にわかりません。それは私のRoR(なし)とRuby(少数)の知識から遠く離れています。:/ここで助けていただければ幸いです!

3
philippe

私は最近、まったく同じ問題に頭を悩ませていますが、それを機能させることができました。これは非常にハッキーなソリューションなので、自分で改良することをお勧めします。 LDAPを使用して、電子メールアドレスとユーザーアカウント情報を提供し、Apacheを介してKerberosによって入力されるHTTP_REMOTE_USER変数からユーザー名を取得します。

以下は、ApacheをWebサーバーとして実行しているgitlabのクリーンインストールで機能します。 LDAP omniauthを有効にして、適切に構成する必要があります。

まず、ヘッダーをRubyで使用できるようにする必要があるため、仮想ホスト(httpd.conf)に次の行を追加します。

RequestHeader set REMOTE-USER %{REMOTE_USER}s

その後、私はこれを機能させるためにいくつかのファイルを変更しました。最初は/home/git/gitlab/vendor/bundle/Ruby/2.0.0/gems/gitlab_omniauth-ldap-1.0.3/lib/omniauth/strategies/ldap.rbです。

43〜49行目を次のように変更しました。

# Dont allow blank password for ldap auth
      #if request['username'].nil? || request['username'].empty? || request['password'].nil? || request['password'].empty?
      #  raise MissingCredentialsError.new(env.to_a)#"Missing login credentials")
      #end

      @ldap_user_info = @adaptor.bind_as(:filter => Net::LDAP::Filter.eq(@adaptor.uid, @options[:name_proc].call(request.env['HTTP_REMOTE_USER'].split('@')[0])),:size => 1, :username => "__ldap-user__", :password => "__User-Password__")
      return fail!(:invalid_credentials) if !@ldap_user_info

__ldap-user____user-Password__を、LDAP用に作成したgitlabユーザーの資格情報に置き換えます。

次に、bind_as関数がユーザー名を取得できるようにする必要があります。 /home/git/gitlab/vendor/bundle/Ruby/2.0.0/gems/gitlab_omniauth-ldap-1.0.3/lib/omniauth-ldap/adaptor.rbの86〜86行目を次のように変更しました。

  def bind_as(args = {})
    result = false
    @connection.open do |me|
      rs = me.search args
      if rs and rs.first and dn = rs.first.dn
        password = args[:password]
        username = args[:username]
        method = args[:method] || @method
        password = password.call if password.respond_to?(:call)
        if method == 'sasl'
        result = rs.first if me.bind(sasl_auths({:username => username, :password => password}).first)
        else
        result = rs.first if me.bind(:method => :simple, :username => username,
                            :password => password)
        end
      end
    end
    result
  end

最後に、LDAPログインダイアログを変更して、/home/git/gitlab/app/views/devise/sessions/_new_ldap.html.haml内のすべてを削除し、追加することで、ページをコールバックに直接誘導しました。

%script
  window.location.href = '/users/auth/ldap/callback'

これがお役に立てば幸いです。

警告:メール属性がユーザーのLDAPエントリに設定されていない場合、スクリプトはループします。

2
Taran Moltu