Bagaimana cara saya mencegah apache dari melayani direktori .git?

74

Saya sudah mulai menggunakan git untuk penyebaran situs web untuk pengujian. Bagaimana cara saya mencegah apache menyajikan konten direktori .git?

Saya mencoba

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

tanpa keberhasilan.

Saya tahu bahwa saya dapat membuat file .htaccess di setiap direktori .git dan menolak akses, tetapi saya menginginkan sesuatu yang dapat saya masukkan ke file konfigurasi utama yang menjadikannya global di semua situs web.

Shoan
sumber
3
Setelah Anda mencegah apache dari melayani direktori Anda mungkin juga perlu menyembunyikan direktori .git dengan "IndexIgnore .git" jika Anda mengaktifkan Indeks pada direktori Anda.
Ryan

Jawaban:

55

Ini tidak berfungsi karena Anda memiliki 'svn' dan tidak 'git' dalam aturan. Yang harus Anda lakukan adalah mengganti 'svn' dengan 'git'.

<Directorymatch "^/.*/\.git/">
Order deny,allow
Deny from all
</Directorymatch>
berdosa
sumber
1
Ketika saya membuat .htaccess yang hanya berisi kode Anda, saya mendapatkan kesalahan: "<DirectoryMatch tidak diizinkan di sini"
Shoan
2
Itu harus di conf Apache. Lihat: httpd.apache.org/docs/1.3/mod/core.html#directorymatch
sinping
2
Regex yang paling sederhana adalah<DirectoryMatch /\.git/>
Bachsau
Periksa ini untuk solusi sempurna magento.stackexchange.com/questions/202840/...
Pratik Kamani
1st, terima kasih untuk bernyanyi / OP. Perhatikan bahwa di Apache 2.4 "Order, deny" dan baris berikutnya telah digantikan oleh "Require all deny". Selain itu, banyak instalasi file yang disebut "Apache conf" di atas bernama "httpd.conf" --- penggunaan singping hanyalah pernyataan biasa, jadi jangan mencari nama literal itu (mungkin harus pergi tanpa berkata, tetapi Anda tidak pernah tahu bagaimana orang mungkin membacanya).
Kevin_Kinsey
139

Ini memiliki efek yang sama dengan banyak jawaban lain tetapi jauh lebih sederhana:

RedirectMatch 404 /\.git

Ini bisa masuk ke .htaccessatau file konfigurasi server Anda. Itu menyembunyikan file atau direktori yang namanya dimulai dengan .git(misalnya .gitdirektori atau .gitignorefile) dengan mengembalikan 404. Jadi tidak hanya konten repo Git Anda disembunyikan, keberadaannya juga tersembunyi.

Bennett McElwee
sumber
2
Saya sangat suka solusi ini. Sederhana dan elegan.
Shoan
2
Menempatkan ini di direktori root htdocs juga melakukan pekerjaan global.
jor
4
Suka opsi ini yang terbaik juga. Menurut saya lebih aman mengembalikan 404 untuk permintaan seperti /.git atau /.gitignore sehingga fakta bahwa git bahkan sedang digunakan tidak dapat ditentukan dari luar.
Ezra Gratis
2
Ketahuilah bahwa dengan jika daftar direktori Anda diaktifkan, .gitfolder - folder itu masih akan terlihat, tetapi Anda akan mendapatkan 404 ketika Anda mencoba mengaksesnya.
Andy Madge
1
@BennettMcElwee ya setuju, hampir tidak pernah ada alasan bagus untuk membuat daftar direktori diaktifkan secara global pada server produksi. Hanya berpikir itu layak disebutkan kalau-kalau itu menangkap seseorang.
Andy Madge
13

Jika Anda tidak menggunakan file .htaccess tetapi ingin menggunakan /etc/apache2/httpd.conf (atau apa pun file master conf server Anda) untuk menyembunyikan file .git directories dan .gitignore, Anda dapat menggunakan yang berikut ini. Saya menemukan jawaban di atas untuk pengaturan master conf tidak menyembunyikan file 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>
Kyle Sloan
sumber
1
Jangan blokir www.example.com/.git/configfile di Apache httpd 2.4.27.
ilhan
12

Jika Anda menggunakan layanan hosting bersama dan tidak memiliki akses ke apache.conf , Anda masih dapat melakukannya di file .htaccess Anda, seperti ini:

RewriteEngine On
RewriteRule "^(.*/)?\.git/" - [F,L]
danorton
sumber
terima kasih ini bekerja untuk saya dalam situasi hosting bersama di mana jawaban teratas tidak
Plato
6
### never deliver .git folders, .gitIgnore
RewriteRule ^(.*/)?\.git+ - [R=404,L]

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

Ini berfungsi .htaccess, tidak http.confdiperlukan akses. Masukkan ini sebagai aturan penulisan ulang yang pertama. Tambahkan Rewrite Onjika diperlukan.

Dari sudut keamanan, saya lebih suka 404 palsu daripada 403, lebih informatif bagi penyerang. Komentari salah satu dari keduanya, untuk memastikan, yang lain juga cocok untuk Anda.

Btw, perubahan yang bagus adalah, uji lithmus Anda untuk keduanya adalah:

http://localhost/.gitignore
http://localhost/.git/HEAD
Frank Nocke
sumber
Mengapa keduanya memiliki aturan? RedirectMatch yang lebih sederhana sudah mencukupi sendiri. (Juga, regex tampaknya tidak benar - mengapa nilai tambah di akhir?)
Bennett McElwee
Personal Paranoia / keamanan berlipat ganda. Jika RewriteEngine kebetulan dimatikan (konfigurasi konfigurasi pusat, komunikasi tim yang buruk, "pembaruan" server sial, ... sebut saja :-) + sudah usang atau seharusnya menjadi $, poin bagus! (tidak ada waktu untuk pengujian, maaf.)
Frank Nocke
Jika Anda khawatir RewriteEngine mungkin mati, taruh RewriteEngine Onsebelum Aturan Rewrite Anda. Tapi bagaimanapun itu tautologis dan berlebihan karena RedirectMatch yang lebih sederhana sudah mencukupi sendiri. Meskipun itu bisa disederhanakan. Pada dasarnya saya merekomendasikan jawaban saya sebagai gantinya. :)
Bennett McElwee
+1 untuk tes lakmus.
5

Untuk melindungi direktori .git dan juga file lain seperti .gitignore dan .gitmodules menggunakan .htaccess, gunakan:

RewriteEngine On
RewriteRule ^(.*/)?\.git+ - [F,L]
ErrorDocument 403 "Access Forbidden"
scribu
sumber
4
Tidak bekerja untuk saya, namun Trailing ErrorDocument tidak berdampak. Dari sudut keamanan, saya lebih suka 404 palsu atas 403 informatif kepada penyerang ...
Frank Nocke
1
Ini adalah ide yang buruk, karena mengungkapkan informasi kepada peretas. A 403 berarti ada di sana, 404 berarti tidak ada. Setiap fakta pada pengaturan server berguna bagi peretas. Saya akan mempertimbangkan merevisi ini.
GerardJP
3

Saya selalu menambahkan baris berikut ke template vhost

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

Hanya untuk memastikan bahwa tidak ada yang dapat mengakses data spesifik VCS. Bekerja dengan sempurna.

ALex_hha
sumber
1

Dengan asumsi server web Anda menggunakan pengguna yang berbeda dari yang Anda gunakan untuk mengakses repositori .git, Anda bisa menonaktifkan bit eksekusi untuk orang lain di direktori .git.

Ini harus bekerja dengan server web lain dan tidak bergantung pada file .htaccess yang memakan waktu.

Martijn
sumber
1

Bagi mereka yang hanya ingin menolak semua file "tersembunyi" dan direktori pada distribusi Linux (umumnya semua file dimulai dengan "."), Inilah yang bekerja di Apache 2.4 ketika ditempatkan dalam konteks server conf:

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

Dan inilah gaya Apache 2.2 yang lebih lama (regex yang sama, hanya arahan auth yang berbeda):

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

Maka Anda tidak perlu khawatir .gitatau .svnsecara khusus. Itu juga akan cocok dengan hal-hal seperti .htaccessdan .htpasswdsecara inheren.

Secara pribadi, saya suka menerbitkan 403 untuk permintaan seperti itu, bukan 404, tetapi Anda dapat dengan mudah menggunakan RewriteRule alih-alih penolakan auth, seperti:

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

Anda mungkin ingin menolak melayani .gitignorejuga.

File yang dimulai dengan titik tersembunyi di linux.

Oleh karena itu, hanya 404 apa pun yang dimulai dengan titik:

RedirectMatch 404 /\.

Vladimir Kornea
sumber
0

Ini sedikit terlambat tetapi jawaban saya sedikit berbeda jadi saya pikir saya akan menambahkannya. Ini harus masuk dalam file httpd.conf. The <Files "*">bersarang di dalam <Directory>tag akan memblokir semua file dalam direktori.

# 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>
jonnyjandles
sumber