gitlab autenticação usando a variável de ambiente HTTP_REMOTE_USER

3

nós descobrimos o gitlab, e eu gostaria de integrá-lo em nosso processo de autenticação global, que depende da variável de ambiente apache HTTP_REMOTE_USER.

Eu tenho visto muito pouca documentação sobre isso, então estou procurando desesperadamente por qualquer ajuda sobre como fazer isso. Eu gostaria de recuperar da aplicação gitlab a variável HTTP_REMOTE_USER e usá-la para autenticar meus usuários.

Eu tentei usar omniauth e omniauth-ldap, mas isso só retorna em 500 Erros no meu servidor e parece ser um pouco exagerado para recuperar apenas a variável Apache HTTP_REMOTE_USER. O que eu estou procurando é se tal recurso simplesmente existe, ou se eu estou indo para uma direção errada; se alguém tiver alguns links para o doc nele!

Muito obrigado

Muito obrigado pela sua resposta! Eu já tinha adicionado o RequestHeader no arquivo de configuração do apache (estou usando como apache como proxy reverso de unicórnio em vez de nginx e precisava encaminhar o HTTP_REMOTE_USER para o unicorn no cabeçalho do apache). Em seguida, apliquei o patch disponível aqui .

Ao contrário de você, não estou usando uma autenticação de nome de usuário / senha do ldap, mas uma autenticação do kerberos com o ldap para autorizações. Quando chego à página da web do gitlab, vejo nos logs que minha autenticação é concedida e o gitlab recupera do ldap meus atributos de usuário (endereço de e-mail). Até cria minha conta (de acordo com o arquivo allow_single_sign_on: true em /home/git/gitlab/config/gitlab.yml). Mas, em seguida, ele exibe um erro 500, com a mensagem de log "pilha de erros muito profunda".

Eu alterei o arquivo vendor / bundle / ruby / 2.0.0 / activesupport-3.2.13 / lib / active_support / callbacks.rb para colocar em um arquivo fictício o que está acontecendo: (linha 413)

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

Eu vejo então que ele recorre em algumas funções (funções chamando umas às outras em um loop infinito). (Aqui está um período em / home / git / gitlab; a primeira linha é repetida após a última):

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'

Neste passo, eu realmente não sei como consertar isso; está longe do meu conhecimento de RoR (nenhum) e Ruby (poucos). : / Qualquer ajuda seria apreciada aqui!

    
por philippe 27.09.2013 / 15:46

1 resposta

2

Recentemente estive me intrometendo no mesmo problema, mas consegui fazê-lo funcionar. Esta é uma solução muito hacky, então você pode querer refinar você mesmo. Eu faço uso do LDAP para fornecer o endereço de e-mail e as informações da conta do usuário, obtendo o nome do usuário da variável HTTP_REMOTE_USER que é preenchida pelo kerberos via apache.

O seguinte funciona com uma instalação limpa do gitlab com o apache sendo executado como o servidor da web. O omniauth LDAP deve estar ativado e configurado corretamente.

Primeiro, temos que disponibilizar o cabeçalho para o ruby, então, no host virtual (httpd.conf), adicione a linha:

RequestHeader set REMOTE-USER %{REMOTE_USER}s

Depois disso, eu modifiquei alguns arquivos para que isso funcionasse, primeiro acima de /home/git/gitlab/vendor/bundle/ruby/2.0.0/gems/gitlab_omniauth-ldap-1.0.3/lib/omniauth/strategies/ldap.rb

Eu modifiquei as linhas 43-49 para ler:

# 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

Substituindo __ldap-user__ e __user-Password__ pelas credenciais de um usuário do gitlab que fiz para o ldap.

Em seguida, precisamos permitir que a função bind_as use um nome de usuário. Eu modifiquei as linhas 86-86 de /home/git/gitlab/vendor/bundle/ruby/2.0.0/gems/gitlab_omniauth-ldap-1.0.3/lib/omniauth-ldap/adaptor.rb para ler:

  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

e, finalmente, modifiquei o diálogo de login do ldap para direcionar a página diretamente para o retorno de chamada excluindo tudo em /home/git/gitlab/app/views/devise/sessions/_new_ldap.html.haml e adicionando

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

Espero que isso ajude!

Aviso: se o atributo mail não estiver definido na entrada LDAP do usuário, o script será executado em loop.

    
por 07.10.2013 / 17:23