2008-10-18 4 views
25

내 웹 사이트를 버전 관리 (Subversion은 특별히)로 유지하고 업데이트 할 안정 버전이있을 때 svn co을 사용하여 업데이트하고 싶습니다. 그러나 모든 보안이 걱정됩니다. 모든 .svn 폴더는 공개되며, 여기에는 모든 종류의 개인 정보가 포함됩니다. 특히 내 웹 사이트에 대한 완전한 소스 코드가 있습니다!Apache에서 디렉토리를 숨기려면 어떻게해야합니까? 특히 소스 제어입니까?

내가 이것을 막기 위해 할 수있는 일이 있습니까?

답변

37

두 가지 :

  1. 이 기능을 IfModule를 사용하지 마십시오 당신이 존재해야합니다. 그것이 존재하지 않을 수도 있고 계획에 중요하지 않기 때문에 autoindex를 위해 그것을하는 것은 괜찮습니다. 그러나 귀하의 콘텐츠를 보호하기 위해 재 작성이 필요하다고 믿고 있습니다. 따라서 IfModule 지시문을 제거하고 apache가 다시 쓰기가 없으면 사용하도록 설정하는 것이 좋습니다 (또는 최소한 사용자가 보호받지 못하고 의식적으로 줄을 주석 처리 함).

  2. 아니요 당신이 주요 구성 파일에 액세스 할 수있는 경우가 다시 사용할 필요가, 훨씬 쉽게 생성

    <DirectoryMatch \.svn> 
        Order allow,deny 
        Deny from all 
    </DirectoryMatch> 
    

중 하나가 될 것이다 (403) 이나, 경우 (보기의 HTTP 준수 관점에서 더 나은입니다) 금지 당신은 모호한 경로로 보안을 취하고 싶다면 AliasMatch를 사용하십시오.

AliasMatch \.svn /non-existant-page 

남아있는 기본 구성 파일에 액세스 할 수없는 경우 .htaccess에서 mod_rewrite를 사용하도록 설정되어 있습니다.

+1

나는 대략 403에 관하여 점을 이해한다. 개인적으로 (파일이 결코 제공되면 안되는 상황의이 종류에서), 나는 오히려 그들은 전화 번호부가 존재했었다조차 몰랐다. AliasMatch도 시도해 보겠습니다. 이것이 내가 Google에서 수집 한 것입니다. 더 나은 솔루션을 위해 항상 행복합니다. –

+1

공유/가상 호스트에서이 작업을 수행하려는 경우 .htaccess 파일에서 작동하지 않습니다. httpd.conf 파일에 대한 액세스 권한이없는 경우 Monoxide의 대답을 사용하십시오. http://stackoverflow.com/questions/214886/#214887 – nickf

+0

True. .htaccess 파일에서도 mod_rewrite를 사용할 수 없게 될 가능성이 있습니다. (서버가 허용되는 범위 내에서 다소 허용적인 경우) –

7

단일 가상 호스트 기준으로 서버 전체 (권장) 또는 심지어 허용되는 서버가 허용되는 경우 .htaccess 파일 내에서 구현할 수 있습니다. 필요한 구체적인 구성은 다음과 같습니다.

RewriteEngine On 
RewriteRule /\.svn /some-non-existant-404-causing-page 

<IfModule autoindex_module> 
    IndexIgnore .svn 
</IfModule> 

첫 번째 섹션에는 mod_rewrite이 필요합니다. "/.svn"이 포함 된 요청 (예 : 디렉토리 요청 또는 디렉토리 내부의 모든 요청)은 으로 내부적으로이 웹 사이트의 존재하지 않는 페이지로 리디렉션됩니다. 이것은 최종 사용자에게는 완전히 투명하고 감지 할 수 없습니다. 또한 .svn 폴더가 방금 사라진 것처럼 404 오류가 발생합니다.

두 번째 섹션은 순전히 화장품이며, 활성화 된 경우 autoindex 모듈에서 .svn 폴더를 숨 깁니다. 호기심 많은 영혼이 아이디어를 얻지 못하도록 막는 것도 좋은 생각입니다.

+0

.htaccess 파일에 직접 붙여 넣기하면 제대로 작동하지 않습니다. "서버가 허용되는 범위 내에서 다소 관대하다면"정확히 무엇을 의미합니까? – Nate

+0

이 기능을 사용하려면 mod_rewrite가 활성화되어 있어야합니다. 만약 그렇지 않다면 (서버 로그에 오류를 일으키는) 활성화되지 않았거나 정규 표현식을 엉망으로 만든 것입니다 (서브 버전을 숨기고 있습니까?) –

+0

정확히 복사하여 붙여 넣었습니다. mod_rewrite가 있습니다. 사용하도록 설정되었습니다. 그것에 대해 걱정하지 마세요. @ Gilles의 대답은 잘 동작했습니다. – Nate

3

Vinko가 말한 것처럼 디렉토리를 숨겨야한다고 말합니다. 하지만 svn co 대신 svn export을 사용하는 것이 더 간단 할 것입니다. 이 .svn 디렉터리를 생성해야합니다 지 않습니다.

+0

아마도 단순하지만, 증분 업데이트의 이점을 얻지 못할 수도 있습니다.하나의 이미지와 두 개의 스크립트를 수정하면 체크 아웃을하는 데 몇 초가 걸리지 않고 MB를 풀고 유지 관리 모드로 사이트를 가져와야합니까? –

+1

http://www.techcrunch.com/2009/09/23/basic-flaw-reveals-source-code-to-3300-popular-websites/에서이 토론을 참조하십시오 (이 게시물을 가리키는 코멘트). . 당신이 언급 한 거대한 사이트 (거대한 사이트)와 함께, 다른 디렉토리에서 "svn co"로 "svn export"결과를 얻을 수 있고, CesarB가 다른 대답에서 제안하는 것과 같이 rsync를 excludes와 함께 사용할 수 있습니다. –

4

내가 사용하는 흥미로운 방법이 있습니다 : 체크 아웃 (및 업데이트)은 완전히 별개의 디렉토리 (완전히 별개의 컴퓨터)에서 수행되고 웹 서버가 rsync를 사용하여 코드를 복사합니다. rsync 명령 줄의 --exclude 규칙은 .svn (및 CVS) 디렉토리를 복사하지 않도록하며, --delete-excluded는 이전에 복사 된 경우에도 제거됩니다.

svn update와 rsync는 모두 증분 전송을하기 때문에 대형 사이트의 경우에도 상당히 빠릅니다. 또한 방화벽을 통해 저장소를 가질 수 있습니다. 유일한주의 사항은 서버에서 생성 된 파일이있는 모든 디렉토리 (예 : Drupal의 파일/디렉토리)를 rsync 대상 디렉토리 외부의 장소로 이동해야한다는 것입니다 (rsync는이 방법으로 모든 것을 덮어 씁니다). rsync 소스 디렉토리에 을 작성해야합니다.. rsync 소스 디렉토리는 버전이없는 다른 파일도 가질 수 있습니다 (컴퓨터 고유의 구성 파일과 동일). 내가 사용하는 rsync를 매개 변수의

전체 세트는 중복성을 위해, 나는 아직도 .ht을 방지하는 데비안의 기본 규칙에서 복사 액세스되는을 .svn 방지하기 위해 구성 규칙을 가지고, 심지어 다음

rsync -vv --rsh='ssh -l username' -rltzpy --exclude .svn/ --exclude CVS/ --exclude Attic/ --delete-after --delete-excluded --chmod=og-w,Fa-x 

입니다 * (.htaccess, .htpasswd)에 액세스 할 수 없습니다.

+0

소스 제어 디렉토리에 대한 액세스를 차단하는 기본 제공 예제보다 AliasMatch 예제를 선호합니다. 단지 경미한 보안 위반 (설정보기)이 아니며, 누군가가 내부에 들어갈 수 있다면 큰 문제 일 수 있습니다. 적당한. (여기가 아니라 다른 곳을 보아라.) –

3

VCS에서 직접 가져 오는 것이 아니라 운영 체제 패키지 관리 도구를 사용하여 라이브 코드를 배포하는 것을 고려하십시오. 이렇게하면 라이브 패키지에 메타 데이터 디렉토리 또는 잠재적으로 민감한 도구 및 데이터가 포함되지 않도록 할 수 있습니다.

+0

+1 좋은 아이디어지만, 개발 기계에서도이 방법을 사용한다. 내가 디렉토리 구조 등을 탐색 할 때 언제나 깨끗하게 보일 수 있도록 돕는다. –

+2

이것은 webapps에 대한 끔찍한 생각입니다. – lucian303

+0

그래, 지난 몇 년 동안 내 의견을 크게 바꿨습니다. 응용 프로그램이 상당히 정적이라면 제대로 작동한다고 생각하지만 지속적인 배포 환경에서 VCS 체크 아웃을 기반으로 한 rsync 기반 배포는 VCS에서 가져온 것이 아니라 서버에 푸시 된 가장 안전한 베팅입니다. –

7

동일한 상황에서 두 가지 이유로 RedirectMatch을 사용했습니다. 주로 수정할 수없는 상당히 제한적인 구성을 가진 해당 서버의 .htaccess에 허용 된 유일한 방법은 찾을 수있었습니다. 또한 아파치에게 네, 거기에 파일이 있지만, 서빙 할 때가 아니라는 것을, 아파치에게 알릴 수 있기 때문에 가장 깨끗하다고 ​​생각합니다. 따라서 404를 반환하십시오. (웹 사이트 시청자가 인식해서는 안되는 것을 드러내는 403).

 
## Completely hide some files and directories. 
RedirectMatch 404 "(?:.*)/(?:[.#].*)$" 
RedirectMatch 404 "(?:.*)~$" 
RedirectMatch 404 "(?:.*)/(?:CVS|RCS|_darcs)(?:/.*)?$" 
+0

이것은 나를 위해 큰 도움이되었습니다, 감사합니다! – Nate

5

내가, 소스 제어 디렉토리가 실제로 존재하는지 공개하지 사용자에게 간단한 (404)를 반환 다음을 사용하십시오 :

나는 지금 내 .htaccess 파일의 표준으로 다음 사항을 고려

RedirectMatch 404 /\.(svn|git)(/<$)

관련 문제