O ScriptAlias faz com que as solicitações correspondam a muitos blocos de Localização. O que está acontecendo?

2

Desejamos restringir o acesso em nosso servidor de desenvolvimento aos usuários que possuem um certificado válido de cliente SSL. Estamos executando o Apache 2.2.16 no Debian 6.

No entanto, para algumas seções (principalmente git-http, configuração com gitolite no link ), precisamos de uma exceção, pois muitos clientes git don suporte a certificados de cliente SSL.

Consegui exigir a autenticação do certificado de cliente para o servidor e adicionar exceções para alguns locais. No entanto, parece que isso não funciona para o git.

A configuração atual é a seguinte:

SSLCACertificateFile ssl-certs/client-ca-certs.crt
<Location />
  SSLVerifyClient require
  SSLVerifyDepth 2
</Location>
# this works
<Location /foo>
  SSLVerifyClient none
</Location>
# this does not
<Location /git>
  SSLVerifyClient none
</Location>

Eu também tentei uma solução alternativa, com os mesmos resultados:

# require authentication everywhere except /git and /foo
<LocationMatch "^/(?!git|foo)">
  SSLVerifyClient require
  SSLVerifyDepth 2
</LocationMatch>

Em ambos os casos, um usuário sem certificado de cliente pode acessar perfeitamente my.server / foo /, mas não my.server / git / (o acesso é recusado porque nenhum certificado de cliente válido é fornecido). Se eu desabilitar completamente a autenticação do certificado de cliente SSL, o my.server / git / funciona ok.

O problema do ScriptAlias

Gitolite é configurado usando a diretiva ScriptAlias. Eu descobri que o problema ocorre com qualquer ScriptAlias similar:

# Gitolite
ScriptAlias /git/ /path/to/gitolite-shell/
ScriptAlias /gitmob/ /path/to/gitolite-shell/
# My test
ScriptAlias /test/ /path/to/test/script/

Note que / path / to / test / script é um arquivo, não um diretório, o mesmo vale para / path / to / gitolite-shell /

Meu script de teste simplesmente imprime o ambiente, super simples:

#!/usr/bin/perl

print "Content-type:text/plain\n\n";
print "TEST\n";
@keys = sort(keys %ENV);
foreach (@keys) {
    print "$_ => $ENV{$_}\n";
}

Parece que, se eu vou para link , que qualquer diretiva SSLVerifyClient está sendo aplicada e que estão em blocos de local que correspondem a / teste / algumaLocalização ou apenas / algumaLocalização .

Se eu tiver a seguinte configuração:

<LocationMatch "^/f">
        SSLVerifyClient require
        SSLVerifyDepth 2
</LocationMatch>

Em seguida, o URL a seguir requer um certificado de cliente: link . No entanto, o seguinte URL não: link

Observe que isso parece se aplicar apenas à configuração SSL. O seguinte não tem efeito algum no link :

<LocationMatch "^/f">
        Order allow,deny
        Deny from all
</LocationMatch>

No entanto, ele bloqueia o acesso ao link .

Isso representa um grande problema para os casos em que tenho algum projeto em execução no link (que precisa exigir a autorização do certificado de cliente SSL) < strong> e existe um repositório git para esse projeto no link que não pode exigir um certificado de cliente SSL. Como a URL / git / project também é correspondida novamente / project Location blocks, essa configuração parece impossível, dadas as minhas descobertas atuais.

Pergunta : Por que isso está acontecendo e como resolvo meu problema?

No final, desejo exigir a autorização do certificado SSL Client para todo o servidor, exceto para / git e / someLocation, com configuração mínima possível (para que não precise modificar a configuração sempre que algo novo for implementado ou um novo repositório git é adicionado).

Atualizar Mais informações: Observe que, em alguns casos, o link é, na verdade, reverso do proxy para que <Directory /path/to/project> directiva é impossível. Se eu quiser proteger esse aplicativo com um certificado de cliente SSL, isso deve necessariamente ser com um bloco <Location /project> (ou mais geral <Location /> ).

Update 2 Acabei de testar isso no apache 2.4.3, com o mesmo resultado. Se isso foi devido a algum bug, pelo menos está presente em duas versões.

Observação: reescrevi minha pergunta (em vez de apenas adicionar mais atualizações na parte inferior) para levar em conta minhas novas descobertas e, com sorte, deixar isso mais claro.

    
por brain99 24.08.2012 / 10:29

1 resposta

0

De acordo com a documentação do Apache atual, isso pode ser um problema:

In per-server context it applies to the client authentication process used in the standard SSL handshake when a connection is established. In per-directory context it forces a SSL renegotiation with the reconfigured client verification level after the HTTP request was read but before the HTTP response is sent.

Que tal usar o diretório < Directory > contexto em vez de < Localização & gt ;. Uma entrada para o nível raiz e outra para o caminho Script-Alias: / path / to / gitolite-shell /

Atualização:

Encontrei alguns conselhos para este caso - > Pergunta / resposta no Stackoverflow

    
por 29.08.2012 / 14:40