ฉันจะป้องกัน apache จากการให้บริการไดเรกทอรี. git ได้อย่างไร


74

ฉันเริ่มใช้ git เพื่อปรับใช้เว็บไซต์เพื่อทดสอบ ฉันจะป้องกัน apache จากการแสดงเนื้อหาไดเรกทอรี. git ได้อย่างไร

ฉันเหนื่อย

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

ไม่ประสบความสำเร็จ

ฉันรู้ว่าฉันสามารถสร้างไฟล์. htaccess ในแต่ละไดเรกทอรี. git และปฏิเสธการเข้าถึง แต่ฉันต้องการบางสิ่งที่ฉันสามารถใส่ลงในไฟล์กำหนดค่าหลักที่ทำให้เป็นสากลในทุกเว็บไซต์


3
เมื่อคุณป้องกันไม่ให้ apache แสดงไดเรกทอรีคุณอาจต้องซ่อนไดเรกทอรี. git ด้วย "IndexIgnore .git" หากคุณเปิดใช้งานดัชนีในไดเรกทอรีของคุณ
Ryan

คำตอบ:


55

มันไม่ทำงานเพราะคุณมี 'svn' และไม่ 'git' ในกฎ สิ่งที่คุณต้องทำคือแทนที่ 'svn' ด้วย 'git'

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

1
เมื่อฉันสร้าง. htaccess ที่มีเฉพาะรหัสของคุณฉันได้รับข้อผิดพลาด: "<ไม่อนุญาตให้ใช้ไดเรกทอรีจับคู่ที่นี่"
Shoan

2
มันจะต้องอยู่ใน Apache conf ดู: httpd.apache.org/docs/1.3/mod/core.html#directorymatch
sinping

2
regex ที่ง่ายที่สุดคือ<DirectoryMatch /\.git/>
Bachsau

ตรวจสอบเรื่องนี้เพื่อหาทางออกที่สมบูรณ์แบบmagento.stackexchange.com/questions/202840/…
Pratik Kamani

วันที่ 1 ขอบคุณที่ร้องเพลง / OP โปรดทราบว่าใน Apache 2.4 "Order, deny" และบรรทัดถัดไปได้ถูกแทนที่ด้วย "Require all disabled" นอกจากนี้การติดตั้งหลายไฟล์ที่ชื่อ "Apache conf" ด้านบนมีชื่อว่า "httpd.conf" --- การใช้งานของ singping เป็นเพียงข้อความธรรมดาดังนั้นอย่าค้นหาชื่อที่แท้จริง (อาจจะไม่พูด แต่คุณไม่เคยรู้ คนอื่น ๆ อ่านมันอย่างไร)
Kevin_Kinsey

139

สิ่งนี้มีผลเช่นเดียวกับคำตอบอื่น ๆ มากมาย แต่ง่ายกว่ามาก:

RedirectMatch 404 /\.git

สิ่งนี้สามารถเข้าไป.htaccessหรือไฟล์กำหนดค่าเซิร์ฟเวอร์ของคุณ มันซ่อนไฟล์หรือไดเรกทอรีใด ๆ ที่มีชื่อขึ้นต้นด้วย.git(เช่น.gitไดเรกทอรีหรือ.gitignoreไฟล์) โดยส่งคืน 404 ดังนั้นไม่เพียง แต่เนื้อหาของ repo Git ของคุณที่ซ่อนอยู่การดำรงอยู่ของมันก็ถูกซ่อนไว้เช่นกัน


2
ฉันชอบวิธีนี้มาก มันง่ายและสง่างาม
Shoan

2
การวางสิ่งนี้ไว้ในไดเรกทอรี root htdocs ก็เป็นงานระดับโลกเช่นกัน
jor

4
รักตัวเลือกนี้ดีที่สุดเช่นกัน ดูเหมือนว่าฉันจะปลอดภัยกว่าหากส่งคืน 404 สำหรับคำขอเช่น /.git หรือ /.gitignore เพื่อให้ทราบว่าแม้กระทั่งการใช้คอมไพล์ก็ไม่สามารถหาได้จากภายนอก
Ezra ฟรี

2
โปรดระวังว่าหากคุณเปิดใช้งานรายชื่อไดเรกทอรี.gitโฟลเดอร์จะยังคงมองเห็นได้ แต่คุณจะได้รับ 404 เมื่อคุณพยายามเข้าถึง
Andy Madge

1
@BennettMcElwee เห็นด้วยแทบจะไม่มีเหตุผลที่ดีเลยที่จะเปิดใช้งานรายชื่อไดเรกทอรีทั่วโลกบนเซิร์ฟเวอร์ที่ใช้งานจริง แค่คิดว่ามันสมควรได้รับการกล่าวถึงในกรณีที่มันดึงดูดใครบางคนออกมา
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/configไฟล์ใน Apache httpd 2.4.27
ilhan

12

หากคุณใช้บริการโฮสติ้งที่ใช้ร่วมกันและไม่สามารถเข้าถึงapache.confคุณยังสามารถทำได้ในไฟล์. htaccess เช่นนี้:

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

ขอบคุณสิ่งนี้ใช้ได้กับฉันในสถานการณ์โฮสติ้งที่แชร์ซึ่งคำตอบยอดนิยมไม่ได้
เพลโต

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ถ้าจำเป็น

จากมุมความปลอดภัยฉันชอบปลอม 404 มากกว่า 403 ให้ข้อมูลเพิ่มเติมกับผู้โจมตี แสดงความคิดเห็นหนึ่งในสองประการเพื่อให้แน่ใจว่าอีกงานหนึ่งที่เหมาะกับคุณเช่นกัน

Btw การเปลี่ยนแปลงที่ดีคือการทดสอบ lithmus ของคุณสำหรับทั้งสองคือ:

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

ทำไมต้องมีทั้งกฎ RedirectMatch ที่เรียบง่ายกว่านั้นพอเพียงสำหรับตัวมันเอง (นอกจากนี้ regexes ดูไม่ถูกต้อง - ทำไมจึงเป็นบวกในตอนท้าย?)
Bennett McElwee

ความหวาดกลัวส่วนบุคคล / ความปลอดภัยเป็นสองเท่า หาก RewriteEngine ถูกปิดใช้งาน (การเปลี่ยนแปลงการกำหนดค่าส่วนกลางการสื่อสารของทีมไม่ดีเซิร์ฟเวอร์ "อัปเดต" โชคไม่ดี ... คุณชื่อ :-) + ล้าสมัยหรือควรเป็น $ จุดดี! (ไม่มีเวลาสำหรับการทดสอบขออภัย.)
Frank Nocke

หากคุณกังวลว่า RewriteEngine อาจปิดให้ใส่RewriteEngine Onก่อน RewriteRule ของคุณ แต่อย่างไรก็ตามมันเป็นเรื่องซ้ำซากและซ้ำซ้อนเพราะ RedirectMatch ที่เรียบง่ายพอเพียงในตัวของมันเอง แม้ว่ามันจะง่ายขึ้นก็ตาม โดยทั่วไปฉันแนะนำคำตอบของฉันแทน :)
Bennett McElwee

+1 สำหรับการทดสอบสารสีน้ำเงิน

5

ในการปกป้องทั้งไดเรกทอรี. git รวมถึงไฟล์อื่น ๆ เช่น. gitignore และ. gitmodules โดยใช้. htaccess ให้ใช้:

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

4
ใช้งานได้สำหรับฉัน แต่ ErrorDocument ต่อท้ายไม่มีผลกระทบ จากมุมการรักษาความปลอดภัยฉันอยากจะปลอม 404 มากกว่า 403 ข้อมูลไปยังผู้โจมตี ...
Frank Nocke

1
นี่เป็นความคิดที่ไม่ดีเพราะมันเปิดเผยข้อมูลแก่แฮกเกอร์ 403 หมายความว่าอยู่ที่นั่น 404 หมายถึงไม่ใช่ ข้อเท็จจริงทุกอย่างเกี่ยวกับการตั้งค่าเซิร์ฟเวอร์นั้นมีประโยชน์กับแฮ็กเกอร์ ฉันจะพิจารณาแก้ไขสิ่งนี้
GerardJP

3

ฉันมักจะเพิ่มบรรทัดต่อไปนี้ในเทมเพลต vhost

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

เพียงเพื่อให้แน่ใจว่าไม่มีใครสามารถเข้าถึงข้อมูลเฉพาะของ VCS ได้ ทำงานได้สมบูรณ์แบบ


1

สมมติว่าเว็บเซิร์ฟเวอร์ของคุณกำลังใช้ผู้ใช้ที่แตกต่างจากที่คุณใช้ในการเข้าถึงที่เก็บ. git คุณสามารถปิดการใช้งานบิตรันสำหรับผู้อื่นในไดเรกทอรี. git

สิ่งนี้ควรทำงานกับเว็บเซิร์ฟเวอร์อื่นและไม่ต้องพึ่งพาไฟล์. htaccess


1

สำหรับผู้ที่ต้องการเพียงแค่ปฏิเสธไฟล์และไดเรกทอรี "ที่ซ่อนอยู่" ทั้งหมดในการแจกจ่าย Linux (โดยทั่วไปไฟล์ทั้งหมดที่ขึ้นต้นด้วย ".") นี่คือสิ่งที่ใช้งานได้กับ Apache 2.4 เมื่ออยู่ในบริบทของเซิร์ฟเวอร์:

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

และนี่คือสไตล์ Apache 2.2 ที่เก่ากว่า (regex เดียวกันเพียงคำสั่งการตรวจสอบสิทธิ์ที่แตกต่างกัน):

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

จากนั้นคุณไม่ต้องกังวล.gitหรือ.svnเฉพาะเจาะจง ที่จะตรงกับสิ่งที่ชอบ.htaccessและ.htpasswdโดยเนื้อแท้

โดยส่วนตัวแล้วฉันชอบออก 403s สำหรับคำขอดังกล่าวแทนที่จะเป็น 404 แต่คุณสามารถใช้ RewriteRule แทนที่จะปฏิเสธการรับรองความถูกต้องเช่น:

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

0

คุณอาจต้องการปฏิเสธการแสดง.gitignoreเช่นกัน

ไฟล์ที่ขึ้นต้นด้วยจุดจะถูกซ่อนใน linux

ดังนั้นเพียง 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.