web-dev-qa-db-fra.com

Comment empêcher Apache de servir le répertoire .git?

J'ai commencé à utiliser git pour le déploiement de sites Web à des fins de test. Comment empêcher Apache de servir le contenu du répertoire .git?

J'ai essayé

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

sans succès.

Je sais que je peux créer un fichier .htaccess dans chaque répertoire .git et refuser l'accès, mais je voulais quelque chose que je pourrais mettre dans le fichier de configuration principal qui le rend mondial sur tous les sites Web.

78
Shoan

Cela ne fonctionne pas parce que vous avez 'svn' et pas 'git' dans la règle. Tout ce que vous avez à faire est de remplacer le 'svn' par le 'git'.

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

Cela a le même effet que la plupart des autres réponses mais est beaucoup plus simple:

RedirectMatch 404 /\.git

Cela peut aller dans .htaccess ou votre fichier de configuration du serveur. Il masque tout fichier ou répertoire dont le nom commence par .git (par exemple, un .git répertoire ou .gitignore file) en renvoyant un 404. Donc non seulement le contenu de votre dépôt Git est caché, mais son existence même est cachée aussi.

143
Bennett McElwee

Si vous n'utilisez pas de fichiers .htaccess mais souhaitez utiliser à la place /etc/Apache2/httpd.conf (ou tout autre fichier de configuration principal de votre serveur) pour masquer les répertoires .git et les fichiers .gitignore, vous pouvez utiliser ce qui suit. J'ai trouvé la réponse ci-dessus pour que le paramètre de configuration maître ne masque pas le fichier 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>
14
Kyle Sloan

Si vous êtes sur un service d'hébergement partagé et n'avez pas accès à Apache.conf, vous pouvez toujours le faire dans votre fichier .htaccess, comme ceci:

RewriteEngine On
RewriteRule "^(.*/)?\.git/" - [F,L]
12
danorton
### never deliver .git folders, .gitIgnore
RewriteRule ^(.*/)?\.git+ - [R=404,L]

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

Cela fonctionne dans .htaccess, non http.conf accès requis. Incluez-le comme première règle de réécriture. Prepend Rewrite On si besoin.

Du point de vue de la sécurité, je préfère un faux 404 à un 403, plus informatif pour l'attaquant. Commentez l'un des deux pour vous assurer que l'autre fonctionne aussi pour vous.

Btw, de bons changements sont, votre test lithmus pour les deux sont:

http://localhost/.gitignore
http://localhost/.git/HEAD
6
Frank Nocke

Pour protéger le répertoire .git ainsi que d'autres fichiers tels que .gitignore et .gitmodules à l'aide de .htaccess, utilisez:

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

J'ajoute toujours la ligne suivante dans le modèle vhost

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

Juste pour être sûr que personne ne peut accéder aux données spécifiques à VCS. Fonctionne parfaitement.

4
ALex_hha

Pour ceux qui cherchent simplement à refuser tous les fichiers et répertoires "cachés" d'une distribution Linux (généralement tous les fichiers commençant par un "."), Voici ce qui fonctionne sur Apache 2.4 lorsqu'il est placé dans le contexte de configuration du serveur:

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

Et voici l'ancien style Apache 2.2 (même regex, juste des directives d'authentification différentes):

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

Ensuite, vous n'avez pas à vous soucier de .git ou .svn Plus précisément. Cela correspondrait également à des choses comme .htaccess et .htpasswd intrinsèquement.

Personnellement, j'aime émettre 403 pour de telles demandes au lieu de 404, mais vous pouvez facilement utiliser un RewriteRule au lieu d'un refus d'auth, comme ceci:

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

En supposant que votre serveur Web utilise un utilisateur différent de celui que vous utilisez pour accéder au référentiel .git, vous pouvez désactiver le bit d'exécution pour les autres sur le répertoire .git.

Cela devrait fonctionner avec d'autres serveurs Web et ne dépend pas de fichiers .htaccess gourmands en performances.

1
Martijn

C'est un peu tard, mais ma réponse est légèrement différente, j'ai donc pensé l'ajouter. Cela doit aller dans le fichier httpd.conf. Le <Files "*"> Imbriqué dans la balise <Directory> Bloquera tous les fichiers du répertoire.

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

Vous voulez probablement refuser de servir .gitignore ainsi que.

Les fichiers commençant par un point sont cachés sous Linux.

Par conséquent, juste 404 tout ce qui commence par un point:

RedirectMatch 404 /\.

0
Vladimir Kornea