ScriptAlias는 요청을 너무 많은 위치 블록과 일치시킵니다. 무슨 일이야?

ScriptAlias는 요청을 너무 많은 위치 블록과 일치시킵니다. 무슨 일이야?

우리는 개발 서버에 대한 액세스를 유효한 SSL 클라이언트 인증서가 있는 사용자로 제한하고 싶습니다. 우리는 Debian 6에서 Apache 2.2.16을 실행하고 있습니다.

그러나 일부 섹션(주로 git-http, gitolite를 사용하여 설정)https://my.server/git/) 많은 git 클라이언트가 SSL 클라이언트 인증서를 지원하지 않으므로 예외가 필요합니다.

서버에 대한 클라이언트 인증서 인증을 요구하고 일부 위치에 대한 예외를 추가하는 데 성공했습니다. 그러나 이것은 git에서는 작동하지 않는 것 같습니다.

현재 설정은 다음과 같습니다.

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>

나는 또한 동일한 결과를 가진 대체 솔루션을 시도했습니다.

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

두 경우 모두 클라이언트 인증서가 없는 사용자는 my.server/foo/에 완벽하게 액세스할 수 있지만 my.server/git/에는 액세스할 수 없습니다(유효한 클라이언트 인증서가 제공되지 않아 액세스가 거부됨). SSL 클라이언트 인증서 인증을 완전히 비활성화하면 my.server/git/이 정상적으로 작동합니다.

ScriptAlias ​​문제

Gitolite는 ScriptAlias ​​지시문을 사용하여 설정됩니다. 유사한 ScriptAlias에서 문제가 발생하는 것으로 나타났습니다.

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

/path/to/test/script는 디렉토리가 아닌 파일입니다. /path/to/gitolite-shell/도 마찬가지입니다.

내 테스트 스크립트는 매우 간단하게 환경을 인쇄합니다.

#!/usr/bin/perl

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

내가 가면 그럴 것 같다.https://my.server/test/someLocation, /test/someLocation과 일치하는 Location 블록에 있는 모든 SSLVerifyClient 지시문이 적용되고 있음을 나타냅니다.아니면 그냥 /someLocation.

다음 구성이 있는 경우:

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

그런 다음 다음 URL에는 클라이언트 인증서가 필요합니다.https://my.server/test/foo. 그러나 다음 URL은 그렇지 않습니다.https://my.server/test/somethingElse/foo

이는 SSL 구성에만 적용되는 것 같습니다. 다음은 아무런 영향을 미치지 않습니다.https://my.server/test/foo:

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

그러나 다음 항목에 대한 액세스를 차단합니다.https://my.server/foo.

이는 일부 프로젝트가 실행 중인 경우에 큰 문제를 야기합니다.https://my.server/project(SSL 클라이언트 인증서 인증이 필요함)그리고해당 프로젝트에 대한 git 저장소가 있습니다.https://my.server/git/projectSSL 클라이언트 인증서가 필요할 수 없습니다. /git/project URL도 /project 블록과 일치하므로 Location현재 조사 결과에 따르면 이러한 구성은 불가능해 보입니다.

질문: 왜 이런 일이 발생하며, 문제를 해결하려면 어떻게 해야 합니까?

결국 가능한 최소한의 구성으로 /git 및 /someLocation을 제외한 전체 서버에 대해 SSL 클라이언트 인증서 인증을 요구하고 싶습니다. git 저장소가 추가되었습니다).

업데이트추가 정보: 어떤 경우에는https://my.server/project실제로 역방향 프록시가 적용되어 <Directory /path/to/project>지시문이 불가능합니다. SSL 클라이언트 인증서로 해당 애플리케이션을 보호하려면 반드시 <Location /project>(또는 보다 일반적인 <Location />) 블록을 사용해야 합니다.

업데이트 2방금 Apache 2.4.3에서 이것을 테스트했는데 동일한 결과가 나왔습니다. 이것이 버그로 인한 것이라면 적어도 두 가지 버전이 있습니다.


참고: 나는 새로운 발견을 고려하고 이를 더 명확하게 하기 위해 (맨 아래에 더 많은 업데이트를 추가하는 대신) 내 질문을 다시 작성했습니다.

답변1

현재에 따르면아파치 문서이것은 문제가 될 수 있습니다:

서버별 컨텍스트에서는 연결이 설정될 때 표준 SSL 핸드셰이크에 사용되는 클라이언트 인증 프로세스에 적용됩니다. 디렉터리별 컨텍스트에서는 HTTP 요청을 읽은 후 HTTP 응답이 전송되기 전에 재구성된 클라이언트 확인 수준으로 SSL 재협상을 강제합니다.

<Location> 대신 <Directory> 컨텍스트를 사용하는 것은 어떻습니까? 루트 수준에 대한 항목 하나와 Script-Alias ​​경로에 대한 항목: /path/to/gitolite-shell/

업데이트:

이 사건에 대한 몇 가지 조언을 찾았습니다 ->Stackoverflow의 질문/답변

관련 정보