Làm cho thư mục web .git không thể truy cập


129

Tôi có một trang web mà tôi sử dụng github (nguồn đóng) để theo dõi các thay đổi và cập nhật trang web. Vấn đề duy nhất là, nó xuất hiện thư mục .git có thể truy cập qua web. Làm thế nào tôi có thể ngăn chặn điều này mà vẫn có thể sử dụng git?

Tôi có nên sử dụng .htaccess? Tôi có nên thay đổi quyền của .git không?


nên có trên serverfault
tback

8
Đang trên serverfault: serverfault.com/questions/128069/ trên
scribu

Câu trả lời:


39

Tạo một .htaccesstệp trong .gitthư mục và đặt các mục sau vào tệp này:

Order allow,deny
Deny from all

Nhưng lưu ý, nó sẽ bị mất nếu bạn sao chép lại kho lưu trữ


38
Đúng, nhưng tôi khuyên bạn không nên đặt nó vào .git/thư mục vì nó sẽ bị mất nếu bạn sao chép lại kho lưu trữ.
Jake Wharton

Đây là một nỗi đau nếu bạn có nhiều hơn một thư mục .git và phải được thực hiện lại nếu bạn đã sao chép lại thư mục.
Bennett McElwee

1
Tôi đã thử cái này và thấy nó hoạt động NHƯNG cái này và dường như BẤT K Solution giải pháp nào đặt cài đặt này trong .git / có 2 nhược điểm được đề cập ở trên, cái thứ nhất có vẻ tệ nhất, cộng với thứ 3 có thể tệ nhất: trích dẫn (Tạo thư mục web .git không thể truy cập), bao gồm cách nó được thực hiện khi & bởi ai, tuy nhỏ nhưng vẫn là chìa khóa cho dữ liệu (đặc biệt là bảo mật của nó, bao gồm phân tích khi & trước khi không được thực hiện đúng cách) NHƯNG trong .git / nó không thực sự là một phần của dữ liệu đúng ( bao gồm cả phiên bản & chia sẻ & được bảo quản tốt) vì vậy cũng KHÔNG được khôi phục ... tương tự như một .gitignore tốt nhất với dữ liệu phù hợp và không có trong .git /.
Destiny Architect

3
Tại sao đây là câu trả lời được chấp nhận mà không phải của Bennett? Kỹ thuật của ông là đơn giản và hiệu quả để giải quyết điều này.
Josh Frankel

1
Rất có thể vì OP đã chấp nhận cái này hai năm trước khi cái kia được đăng;)
ThiefMaster

379

Đặt cái này trong một .htaccesstập tin ở thư mục gốc của máy chủ web của bạn:

RedirectMatch 404 /\.git

Giải pháp này rất mạnh mẽan toàn : nó

  • hoạt động cho tất cả các .gitthư mục trong trang web của bạn, ngay cả khi có nhiều hơn một,
  • cũng ẩn các tệp Git khác như .gitignore.gitmodules
  • hoạt động ngay cả đối với các thư mục mới được thêm vào .git
  • thậm chí không cho đi thực tế là các thư mục tồn tại.

1
Nó hoạt động trên .gitthư mục, nhưng tôi vẫn có thể lấy .gitignoretập tin để kéo lên.
Kurt Emch

Regex của tôi hoạt động trong thử nghiệm của tôi và sẽ hoạt động theo tài liệu RedirectMatch vì regex chỉ phải khớp với một phần của URL chứ không phải URL đầy đủ: xem ghi chú "khác biệt tinh tế" trong tài liệu AliasMatch được liên kết . Tuy nhiên, các tài liệu là một chuyện, thế giới thực là một chuyện khác. Regex @artlogic không khớp với URL đầy đủ, vì vậy có thể có một số khác biệt về phiên bản trong Apache hoặc tôi chỉ đọc sai mọi thứ.
Bennett McElwee

2
@BennettMcElwee - sau khi xem kỹ tài liệu và chạy một vài bài kiểm tra, có vẻ như các ký tự đại diện không cần thiết cho tôi. Cảm ơn giải pháp. Hoạt động tuyệt vời!
artlogic

Theo tài liệu apache2, bạn cũng có thể đặt nó vào ngữ cảnh cấu hình khác:server config, virtual host, directory, .htaccess
bennos

Tôi thậm chí sẽ đề nghị thêm ". *" Vào cuối biểu thức, để không có tệp / thư mục nào dưới .git / có thể được truy cập ->RedirectMatch 404 /\.git.*
Dimitri Hautot

33

Cả hai .htaccessvà quyền trên .git/thư mục sẽ làm việc. Tôi khuyên bạn nên trước đây:

<Directory .git>
    order allow,deny
    deny from all
</Directory>

Có cách nào khác để làm với apache không vì tôi không được phép sử dụng lệnh <Directory> do cài đặt máy chủ.
Chris Muench

2
Có tất cả các cách kết hợp (ví dụ <Files>,, <FilesMatch>).
Jake Wharton

4
Câu trả lời này hoàn toàn không chính xác - Thư mục đơn giản là không được phép trong các tệp .htaccess. Nó không phụ thuộc vào cài đặt máy chủ.
đôi

2
NI8VDY = Thất bại trong 1 trong 1 lần tôi đã thử: trên dịch vụ lưu trữ chia sẻ Dreamhost, tôi đã đặt cái này vào .htaccess của trang web sau đó http: để root trang web đưa ra báo giá lỗi máy chủ (.. <Thư mục không được phép ở đây). 2 người bình luận đã cảnh báo về vấn đề này và cuối cùng nói trích dẫn (Thư mục đơn giản là không được phép trong các tệp .htaccess) và xem tài liệu thư mục chính thức httpd.apache.org/docs/cản/mod/core.html#directory nói trích dẫn (Ngữ cảnh: máy chủ cấu hình, máy chủ ảo) và không .htaccess. Nhưng điều này có số phiếu 26, vì vậy những người tìm ra cách giải quyết vấn đề này .htaccess, PLS CẬP NHẬT GIẢI PHÁP giải thích.
Kiến trúc sư Destiny

Đồng ý với @DestinyArchitect - xin lỗi vì downvote, nhưng điều này là sai lệch.
kael

7

Tôi không muốn làm hỏng trong .gitthư mục và không thể để giải pháp của Bennett hoạt động trên Apache 2.2, nhưng việc thêm các <VirtualHost>cấu hình sau vào cấu hình của tôi đã hoạt động:

RewriteRule ^.*\.git.* - [R=404]

5

Tôi không thoải mái với việc kiểm soát quyền truy cập vào các thư mục .git của mình và chọn thực hiện thông qua cấu hình apache thay vì .htaccess, để ngăn tôi ghi đè lên chúng hoặc quên cài đặt mới, v.v.

Dưới đây là một số hướng dẫn chi tiết hy vọng họ giúp đỡ. Tôi đang sử dụng Ubuntu 16.10.

  1. Trước tiên hãy kiểm tra xem điều gì xảy ra nếu bạn điều hướng đến thư mục .git trong trình duyệt. Trong trường hợp của tôi, tôi đã được trình bày với một danh sách thư mục. Nếu bạn đang thấy những gì bạn không nên thấy (ví dụ: bạn không nhận được 404), hãy làm như sau.
  2. Sử dụng apache2ctl -V để nhận HTTPD_ROOT và SERVER_CONFIG_FILE
  3. Sử dụng công cụ này để chỉnh sửa cấu hình apache của bạn, trong trường hợp của tôi $ sudo nano /etc/apache2/apache2.conf
  4. Thêm phần sau vào đâu đó trong tệp cấu hình: RedirectMatch 404 /.git
  5. Khởi động lại apache: $ sudo dịch vụ apache2 khởi động lại
  6. Bây giờ sẽ giúp bạn có được 404 nếu bạn điều hướng đến thư mục một lần nữa
  7. Tôi đã thử điều này với .gitignore và cũng nhận được 404

4

Một tùy chọn mạnh mẽ và đơn giản hơn sẽ vô hiệu hóa quyền READ và Execut của .gitthư mục.

Vì hầu hết Apache (httpd) chạy dưới một tài khoản người dùng đặc biệt, ví dụ, nó chạy như người dùng apachetrên CentOS, trong khi .gitthư mục phải được tạo trong tài khoản người dùng thực, vì vậy chúng tôi chỉ cần chặn quyền truy cập bằng cách thay đổi quyền. Hơn nữa, cách tiếp cận này không giới thiệu bất kỳ tệp mới nào, cũng không ảnh hưởng đến các lệnh git.

Lệnh có thể là:

chmod -R o-rx .git

Trên một máy mà các SA không muốn sử dụng .htaccess và không muốn tôi làm phiền với các tệp httpd.conf -type của họ, đây có vẻ là giải pháp tốt nhất.
Mẫu cuộc sống ngoài hành tinh

1
Nhược điểm rõ ràng là nếu bạn sao chép lại, bạn sẽ phải nhớ chạy chmodlại.
Lauri Nurmi

3

mod_rewrite sẽ cung cấp cho bạn ảnh hưởng mong muốn:

RewriteEngine on
RewriteRule .*\.git/.* - [F]

9
Đây là một lỗ hổng tiết lộ thông tin: nó giúp mọi người dễ dàng xác định sự tồn tại của .gitthư mục vì nó trả về mã Cấm thay vì Không tìm thấy.
Bennett McElwee

2
Nó không phải là một lỗ hổng để sử dụng git
Adam

1

Thay vì lộn xộn với .htaccesscác quy tắc như hầu hết các câu trả lời gợi ý, tại sao không chỉ cần đặt .git/thư mục phía trên webroot?

Trong các thiết lập của tôi, .gitthư mục của tôi thường sống trong một cái gì đó như:

/home/web/project_name/.git/

Mã thực tế của tôi sống ở

/home/web/project_name/www_root/

vì root web của tôi (như được định nghĩa trên Apache hoặc Nginx .. Tôi thích cái sau) /home/web/project_name/www_root/nên không có cách nào để .gitthư mục có thể truy cập từ web vì nó sống "cao hơn" so với webroot


vì vậy public_html là một thư mục con của thư mục làm việc repo ?? Nghe có vẻ thú vị
Hayden Thring

Không, nó không phải là thư mục con. Cả hai đều là "anh em ruột" trong thư mục dự án chính của tôi. Thư mục của tôi project_namecó hai thư mục con: www_rootnơi các tệp thực sự được phục vụ khi khách truy cập duyệt trang web của tôi và .gitnơi repo. Kéo từ các bản cập nhật repo www_rootvà nội dung của nó. Vấn đề là, vì .gitthư mục được phân cấp "phía trên" bộ điều khiển phía trước của tôi, nên nó không thể truy cập qua web.
Cây cải

Tôi nghĩ đây là ý của tôi, vì vậy bạn có / home / user / public_html / và /home/user/.git
Hayden Thring

wow đó là một giải pháp đơn giản và dễ dàng, thiên tài của nó, (không phải là tạo ra một khối máy chủ rộng lớn trong apache security.conf là khó) điều duy nhất cần chú ý là nếu lưu trữ của bạn có một số cài đặt quyền sở hữu / quyền hạn kỳ lạ trên publlic_html, đó là có thể được thay đổi.
Hayden Thring

1
rất đúng ... Tôi thực sự có các "thư mục anh chị em" khác cho các mục đích khác không thể truy cập được từ web, điều này cho phép tôi ngủ ngon hơn một chút vào ban đêm :)
Javier Larroulet
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.