Apache가 .git 디렉토리를 제공하지 못하게하려면 어떻게합니까?


74

테스트를 위해 웹 사이트를 배포하기 위해 git을 사용하기 시작했습니다. Apache가 .git 디렉토리 내용을 제공하지 못하게하려면 어떻게합니까?

나는 시도했다

<Directorymatch "^/.*/\.svn/">
Order deny,allow
Deny from all
</Directorymatch>

성공하지 못했습니다.

각 .git 디렉토리에 .htaccess 파일을 만들고 액세스를 거부 할 수 있다는 것을 알고 있지만 모든 웹 사이트에서 전역 적으로 사용할 수 있도록 기본 구성 파일에 넣을 수있는 것을 원했습니다.


3
아파치가 디렉토리를 제공하지 못하게 한 후에는 디렉토리에서 색인을 활성화 한 경우 "IndexIgnore .git"로 .git 디렉토리를 숨겨야 할 수도 있습니다.
Ryan

답변:


55

규칙에 'git'이 아닌 'svn'이 있기 때문에 작동하지 않습니다. 'svn'을 'git'으로 바꾸면됩니다.

<Directorymatch "^/.*/\.git/">
Order deny,allow
Deny from all
</Directorymatch>

1
코드 만 포함하는 .htaccess를 만들면 "<DirectoryMatch not allowed here"
Shoan

2
Apache conf에 있어야합니다. 참조 : httpd.apache.org/docs/1.3/mod/core.html#directorymatch을
sinping

2
가장 간단한 정규 표현식은<DirectoryMatch /\.git/>
Bachsau


1 / 싱핑 / OP 덕분입니다. Apache 2.4에서는 "Order, deny"와 다음 줄이 "Require all denied"로 대체되었습니다. 또한 위의 "Apache conf"라는 파일 이름은 "httpd.conf"입니다. --- singping의 사용법은 단순한 설명이므로 해당 리터럴 이름을 검색하지 마십시오. 사람들이 그것을 읽을 수있는 방법).
Kevin_Kinsey

139

이것은 다른 많은 답변과 같은 효과가 있지만 훨씬 간단합니다.

RedirectMatch 404 /\.git

이것은 .htaccess서버 설정 파일 또는 서버 설정 파일 로 이동할 수 있습니다 . 404를 반환하여 이름이 시작하는 파일 또는 디렉토리 .git(예 : .git디렉토리 또는 .gitignore파일)를 숨 깁니다. 따라서 Git 저장소의 내용이 숨겨져있을뿐만 아니라 그 존재도 숨겨져 있습니다.


2
나는이 솔루션을 정말 좋아한다. 간단하고 우아합니다.
Shoan

2
이것을 루트 htdocs 디렉토리에두면 전역 작업도 수행합니다.
소장

4
이 옵션을 가장 좋아하십시오. / git 또는 /.gitignore와 같은 요청에 대해 404를 반환하는 것이 더 안전하므로 git이 사용 중이라는 사실을 외부에서 확인할 수 없습니다.
Ezra Free

2
디렉토리 목록을 사용하도록 설정해도 .git폴더는 계속 표시되지만 폴더에 액세스하려고하면 404가 표시됩니다.
Andy Madge

1
@BennettMcElwee yep은 프로덕션 서버에서 디렉토리 목록을 전역 적으로 활성화해야 할 이유가 거의 없다고 동의했습니다. 누군가를 사로 잡을 경우를 대비하여 언급 할 가치가 있다고 생각했습니다.
Andy Madge

13

.htaccess 파일을 사용하지 않고 /etc/apache2/httpd.conf (또는 서버의 마스터 conf 파일)를 사용하여 .git 디렉토리와 .gitignore 파일을 모두 숨기려면 다음을 사용할 수 있습니다. 마스터 conf 설정에 대한 위의 답변이 gitignore 파일을 숨기지 않았다는 것을 알았습니다.

# do not allow .git version control files to be issued
<Directorymatch "^/.*/\.git+/">
  Order deny,allow
  Deny from all
</Directorymatch>
<Files ~ "^\.git">
    Order allow,deny
    Deny from all 
</Files>

1
www.example.com/.git/configApache httpd 2.4.27에서 파일을 차단하지 마십시오 .
ilhan

12

공유 호스팅 서비스 를 사용 중이고 apache.conf에 액세스 할 수없는 경우 다음과 같이 .htaccess 파일에서 계속 수행 할 수 있습니다.

RewriteEngine On
RewriteRule "^(.*/)?\.git/" - [F,L]

감사합니다. 이것은 최고의 답변을 얻지 못한 공유 호스팅 상황에서 저에게 효과적이었습니다.
Plato

6
### never deliver .git folders, .gitIgnore
RewriteRule ^(.*/)?\.git+ - [R=404,L]

# 2nd line of defense (if no mod_rewrite)
RedirectMatch 404 ^(.*/)?\.git+

이것은 액세스가 필요 .htaccess없는 에서 작동 http.conf합니다. 이것을 다시 쓰기 규칙의 첫 번째로 포함하십시오. Rewrite On필요한 경우 앞에 추가 하십시오.

보안 측면에서 나는 공격자에게보다 유익한 403보다 가짜 404를 선호합니다. 둘 중 하나를 주석 처리하고 다른 하나도 당신을 위해 작동하는지 확인하십시오.

Btw, 좋은 변화는, 두 가지에 대한 리무스 테스트는 다음과 같습니다.

http://localhost/.gitignore
http://localhost/.git/HEAD

왜 두 규칙이 있습니까? 더 간단한 RedirectMatch만으로도 충분합니다. (또한 정규 표현식이 옳지 않은 것처럼 보입니다-왜 더하기 끝?)
Bennett McElwee

개인 편집증 / 두 배의 보안. RewriteEngine이 꺼지면 (중앙 구성 변경, 팀 통신 불량, 운이 좋지 않은 서버 "업데이트") ... 이름을 :-) +가 더 이상 사용되지 않거나 $, 좋은 포인트가되어야합니다! (테스트 할 시간이 없습니다, 죄송합니다.)
Frank Nocke

RewriteEngine이 꺼져 있을지 걱정되는 경우 RewriteEngine OnRewriteRule 앞에 두십시오. 그러나 더 간단한 RedirectMatch 자체로는 충분하기 때문에 어쨌든 그것은 긴장적이고 중복 적입니다. 그럼에도 불구하고 단순화 될 수 있습니다. 기본적으로 나는 대신 대답을 권장 합니다. :)
Bennett McElwee

리트머스 테스트의 경우 +1

5

.htaccess를 사용하여 .git 디렉토리와 .gitignore 및 .gitmodules와 같은 다른 파일을 모두 보호하려면 다음을 사용하십시오.

RewriteEngine On
RewriteRule ^(.*/)?\.git+ - [F,L]
ErrorDocument 403 "Access Forbidden"

4
나를 위해 작동하지만 후행 ErrorDocument는 영향을 미치지 않습니다. 보안 각도에서, 나는 ... 공격자에게 정보 (403)를 통해 화려한 가짜 404 거라고
프랭크 Nocke에게

1
해커에게 정보를 공개하기 때문에 이것은 나쁜 생각입니다. 403은 존재한다는 의미이고 404는 그렇지 않다는 의미입니다. 서버 설정의 모든 사실은 해커에게 유용합니다. 이것을 수정하는 것을 고려할 것입니다.
GerardJP

3

항상 다음 줄을 vhost 템플릿에 추가합니다.

RedirectMatch 404 /\\.(svn|git|hg|bzr|cvs)(/|$)

아무도 VCS 특정 데이터에 액세스 할 수 없도록하십시오. 완벽하게 작동합니다.


1

웹 서버가 .git 저장소에 액세스하는 데 사용하는 것과 다른 사용자를 사용한다고 가정하면 .git 디렉토리에서 다른 사용자에 대한 실행 비트를 비활성화 할 수 있습니다.

이것은 다른 웹 서버에서 작동하며 성능이 많이 소모되는 .htaccess 파일에 의존하지 않습니다.


1

Linux 배포판의 모든 "숨겨진"파일과 디렉토리 (일반적으로 "."로 시작하는 모든 파일)를 단순히 거부하려는 경우 서버 conf 컨텍스트에 배치 할 때 Apache 2.4에서 작동하는 항목은 다음과 같습니다.

<FilesMatch "^\.(.*)$">
    Require all denied
</FilesMatch>
<DirectoryMatch "/\.(.*)">
    Require all denied
</DirectoryMatch>

그리고 여기에 더 오래된 아파치 2.2 스타일 (같은 정규식, 다른 인증 지시어)이 있습니다 :

<FilesMatch "^\.(.*)$">
    Order deny,allow
    Deny from all
</FilesMatch>
<DirectoryMatch "/\.(.*)">
    Order deny,allow
    Deny from all
</DirectoryMatch>

그런 다음에 대해 걱정할 필요가 없습니다 .git또는 .svn특히. 그것도 같은 것들을 일치합니다 .htaccess그리고 .htpasswd본질적으로.

개인적으로 404 대신 403을 발행하는 것을 좋아하지만 인증 거부 대신 RewriteRule을 쉽게 사용할 수 있습니다.

<FilesMatch "^\.(.*)$">
    RewriteRule "^(.*)$" - [R=404,L]
</FilesMatch>
<DirectoryMatch "/\.(.*)">
    RewriteRule "^(.*)$" - [R=404,L]
</DirectoryMatch>

0

서빙을 거부하고 싶을 수도 .gitignore있습니다.

점으로 시작하는 파일은 리눅스에서 숨겨져 있습니다.

따라서 점으로 시작하는 것은 404 개입니다.

RedirectMatch 404 /\.


0

조금 늦었지만 답변이 약간 다르므로 추가하겠다고 생각했습니다. httpd.conf 파일로 이동해야합니다. <Files "*">내에 중첩 <Directory>디렉토리의 모든 파일을 차단합니다 태그입니다.

# GitHub Directory
<Directory /var/www/html/yoursite/.git>
   Order Deny,Allow
   Deny from all
   <Files "*">
     Order Deny,Allow
     Deny from all
   </Files>
</Directory>
# GitHub files
<Files .gitignore>
  order Deny,Allow
  Deny from all
</Files>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.