Làm cách nào để ngăn apache phục vụ thư mục .git?


74

Tôi đã bắt đầu sử dụng git để triển khai các trang web để thử nghiệm. Làm cách nào để ngăn apache phục vụ nội dung thư mục .git?

Tôi đã thử

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

không có thành công

Tôi biết rằng tôi có thể tạo tệp .htaccess trong mỗi thư mục .git và từ chối quyền truy cập, nhưng tôi muốn một cái gì đó tôi có thể đưa vào tệp cấu hình chính tạo ra toàn cầu này trên tất cả các trang web.


3
Khi bạn đã ngăn apache phục vụ thư mục, bạn cũng có thể cần ẩn thư mục .git với "IndexIgnore .git" nếu bạn đã bật Chỉ mục trên thư mục của mình.
Ryan

Câu trả lời:


55

Nó không hoạt động vì bạn có 'svn' chứ không phải 'git' trong quy tắc. Tất cả bạn phải làm là thay thế 'svn' bằng 'git'.

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

1
Khi tôi tạo một .htaccess chỉ chứa mã của bạn, tôi gặp lỗi: "<DirectoryMatch không được phép ở đây"
Shoan


2
Regex đơn giản nhất là<DirectoryMatch /\.git/>
Bachsau

Kiểm tra điều này để biết giải pháp hoàn hảo magento.stackexchange.com/questions/202840/ Kẻ
Pratik Kamani

1, nhờ hát / OP. Lưu ý rằng trong Apache 2.4, "Đặt hàng, từ chối" và dòng tiếp theo đã được thay thế bằng "Yêu cầu tất cả bị từ chối". Ngoài ra, nhiều cài đặt tệp có tên "Apache conf" ở trên được đặt tên là "httpd.conf" --- cách sử dụng của singping chỉ là một tuyên bố thông thường, vì vậy đừng tìm kiếm tên theo nghĩa đen đó (có lẽ không nên nói, nhưng bạn không bao giờ biết làm thế nào mọi người có thể đọc nó).
Kevin_Kinsey

139

Điều này có tác dụng tương tự như nhiều câu trả lời khác nhưng đơn giản hơn nhiều:

RedirectMatch 404 /\.git

Điều này có thể đi vào .htaccesshoặc tập tin cấu hình máy chủ của bạn. Nó ẩn bất kỳ tệp hoặc thư mục nào có tên bắt đầu bằng .git(ví dụ: .gitthư mục hoặc .gitignoretệp) bằng cách trả về 404. Vì vậy, không chỉ nội dung của repo Git của bạn bị ẩn, chính sự tồn tại của nó cũng bị ẩn đi.


2
Tôi thực sự thích giải pháp này. Thật đơn giản và thanh lịch.
Shoan

2
Đặt cái này trong thư mục htdocs gốc cũng làm một công việc toàn cầu.
jor 27/2/2015

4
Yêu tùy chọn này là tốt nhất là tốt. Dường như với tôi rằng việc trả lại 404 cho các yêu cầu như /.git hoặc /.gitignore để đảm bảo rằng git thậm chí đang được sử dụng từ bên ngoài sẽ an toàn hơn.
Ezra miễn phí

2
Xin lưu ý rằng nếu bạn đã bật danh sách .gitthư mục , các thư mục sẽ vẫn hiển thị, nhưng bạn sẽ nhận được 404 khi bạn cố gắng truy cập chúng.
Andy Madge

1
@BennettMcElwee yep đã đồng ý, gần như không bao giờ có lý do chính đáng để danh sách thư mục được bật trên toàn cầu trên máy chủ sản xuất. Chỉ cần nghĩ rằng nó xứng đáng được đề cập trong trường hợp nó bắt được ai đó.
Andy Madge

13

Nếu bạn không sử dụng tệp .htaccess mà thay vào đó muốn sử dụng /etc/apache2/httpd.conf (hoặc bất cứ tệp conf chính nào của máy chủ của bạn) để ẩn cả thư mục .git và tệp .gitignore, bạn có thể sử dụng các mục sau. Tôi tìm thấy câu trả lời ở trên cho cài đặt conf master không ẩn tệp 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
Không chặn www.example.com/.git/configtệp trong Apache httpd 2.4.27.
ilhan

12

Nếu bạn đang sử dụng dịch vụ lưu trữ được chia sẻ và không có quyền truy cập vào apache.conf , bạn vẫn có thể làm điều đó trong tệp .htaccess của mình, như thế này:

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

cảm ơn điều này đã làm việc cho tôi trong một tình huống lưu trữ được chia sẻ trong đó câu trả lời hàng đầu không có
Plato

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

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

Điều này hoạt động trong .htaccess, không http.confcần truy cập. Bao gồm điều này như là đầu tiên của quy tắc viết lại. Chuẩn bị Rewrite Onnếu cần.

Từ góc độ bảo mật, tôi thích 404 không có thật hơn 403, nhiều thông tin hơn cho kẻ tấn công. Nhận xét một trong hai ra, để đảm bảo, những người khác cũng làm việc cho bạn.

Btw, những thay đổi tốt là, bài kiểm tra lithmus của bạn cho hai người là:

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

Tại sao có cả hai quy tắc? RedirectMatch đơn giản hơn đủ cho chính nó. (Ngoài ra, các biểu thức không có vẻ hoàn toàn đúng - tại sao điểm cộng ở cuối?)
Bennett McElwee

Chứng hoang tưởng cá nhân / bảo mật nhân đôi. Nếu RewriteEngine bị tắt (thay đổi cấu hình trung tâm, giao tiếp nhóm kém, "cập nhật" máy chủ không may mắn, ... bạn đặt tên cho nó :-) Dấu + đã lỗi thời hoặc là một điểm tốt, tốt! (không có thời gian để thử nghiệm, xin lỗi.)
Frank Nocke

Nếu bạn lo lắng rằng RewriteEngine có thể bị tắt, chỉ cần đặt RewriteEngine Ontrước RewriteRule của bạn. Nhưng dù sao nó cũng là tautological và dự phòng bởi vì RedirectMatch đơn giản hơn đủ cho chính nó. Mặc dù điều đó có thể được đơn giản hóa. Về cơ bản tôi đang đề nghị câu trả lời của tôi thay vào đó. :)
Bennett McElwee

+1 cho bài kiểm tra litmus.

5

Để bảo vệ cả thư mục .git cũng như các tệp khác như .gitignore và .gitmodules bằng cách sử dụng .htaccess, hãy sử dụng:

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

4
Nó hoạt động với tôi, tuy nhiên ErrorDocument trailing không có tác động. Từ góc độ bảo mật, tôi thích một cái giả 404 trên một thông tin 403 cho kẻ tấn công ...
Frank Nocke

1
Đây là một ý tưởng tồi, bởi vì nó tiết lộ thông tin cho tin tặc. 403 có nghĩa là nó ở đó, 404 có nghĩa là không. Mọi sự thật trên thiết lập của máy chủ đều hữu ích với tin tặc. Tôi sẽ xem xét sửa đổi điều này.
GerardJP

3

Tôi luôn thêm dòng sau vào mẫu vhost

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

Chỉ cần chắc chắn rằng không ai có thể truy cập dữ liệu cụ thể của VCS. Hoạt động hoàn hảo.


1

Giả sử máy chủ web của bạn đang sử dụng một người dùng khác với người dùng bạn sử dụng để truy cập kho lưu trữ .git, bạn có thể vô hiệu hóa bit thực thi cho những người khác trên thư mục .git.

Điều này sẽ hoạt động với các máy chủ web khác và không phụ thuộc vào các tệp .htaccess tiêu tốn hiệu năng.


1

Đối với những người muốn đơn giản từ chối tất cả các tệp và thư mục "ẩn" trên bản phân phối Linux (nói chung là tất cả các tệp bắt đầu bằng "."), Đây là những gì hoạt động trên Apache 2.4 khi được đặt trong ngữ cảnh máy chủ:

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

Và đây là kiểu Apache 2.2 cũ hơn (cùng regex, chỉ là các lệnh xác thực khác nhau):

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

Sau đó, bạn không phải lo lắng về .githoặc .svncụ thể. Điều đó cũng sẽ phù hợp với những thứ như .htaccess.htpasswdvốn có.

Cá nhân, tôi thích phát hành 403 cho các yêu cầu như vậy thay vì 404, nhưng bạn có thể dễ dàng sử dụng RewriteRule thay vì từ chối xác thực, như vậy:

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

0

Bạn có thể muốn từ chối phục vụ .gitignorelà tốt.

Các tập tin bắt đầu bằng một dấu chấm được ẩn trong linux.

Do đó, chỉ cần 404 bất cứ thứ gì bắt đầu bằng dấu chấm:

RedirectMatch 404 /\.


0

Điều này hơi muộn nhưng câu trả lời của tôi hơi khác một chút nên tôi nghĩ tôi sẽ thêm nó vào. Điều này phải đi trong tệp httpd.conf. Việc <Files "*">lồng bên trong <Directory>thẻ sẽ chặn tất cả các tệp trong thư mục.

# 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>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.