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

74

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 global sur tous les sites Web.

Shoan
la source
3
Une fois que vous avez empêché Apache de servir le répertoire, vous devrez peut-être également masquer le répertoire .git avec "IndexIgnore .git" si vous avez activé les index sur votre répertoire.
Ryan

Réponses:

55

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

<Directorymatch "^/.*/\.git/">
Order deny,allow
Deny from all
</Directorymatch>
sinping
la source
1
Lorsque je crée un fichier .htaccess contenant uniquement votre code, le
message d'erreur suivant s'affiche
2
Ce doit être dans la conf Apache. Voir: httpd.apache.org/docs/1.3/mod/core.html#directorymatch
Sinping
2
La regex la plus simple est<DirectoryMatch /\.git/>
Bachsau
Cochez cette solution pour une solution parfaite magento.stackexchange.com/questions/202840/…
Pratik Kamani
1er, grâce à singping / OP. Notez que dans Apache 2.4 les mots "Order, deny" et la ligne suivante ont été remplacés par "Require all denied". En outre, de nombreuses installations dont le fichier appelé "Apache conf" ci-dessus s'appelle "httpd.conf" - l'utilisation de singping était simplement une déclaration informelle, aussi ne cherchez pas ce nom littéral (vous devriez probablement le dire, mais vous ne saurez jamais comment les gens pourraient le lire).
Kevin_Kinsey
139

Cela a le même effet que beaucoup d'autres réponses mais est beaucoup plus simple:

RedirectMatch 404 /\.git

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

Bennett McElwee
la source
2
J'aime beaucoup cette solution. C'est simple et élégant
Shoan
2
Le placer dans le répertoire racine htdocs effectue également un travail global.
Jor
4
J'aime cette option le meilleur aussi. Il me semble qu'il est plus sûr de renvoyer un 404 pour des requêtes telles que /.git ou /.gitignore, de sorte que le fait que git soit même utilisé ne peut pas être déterminé de l'extérieur.
Ezra Free
2
Sachez que si vous avez activé les listes de répertoires, les .gitdossiers seront toujours visibles, mais vous obtiendrez le 404 lorsque vous tenterez d'y accéder.
Andy Madge
1
@ BennettMcElwee oui, il n'y a presque jamais de bonne raison d'activer la liste des répertoires dans le monde entier sur un serveur de production. Je pensais que cela méritait une mention au cas où il surprendrait quelqu'un.
Andy Madge
13

Si vous n'utilisez pas les fichiers .htaccess mais souhaitez plutôt utiliser /etc/apache2/httpd.conf (ou le fichier de configuration principal de votre serveur) pour masquer les répertoires .git et les fichiers .gitignore, vous pouvez utiliser les éléments suivants. J'ai trouvé la réponse ci-dessus pour le paramètre maître conf ne masquait 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>
Kyle Sloan
la source
1
Ne pas bloquer le www.example.com/.git/configfichier dans Apache httpd 2.4.27.
ilhan
12

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]
Danorton
la source
merci cela a fonctionné pour moi dans une situation d'hébergement partagé où la réponse principale n'a pas
Plato
6
### 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, aucun http.confaccès requis. Incluez ceci en tant que première des règles de réécriture. Préfinissez Rewrite Onsi nécessaire.

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 pour vous aussi.

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

http://localhost/.gitignore
http://localhost/.git/HEAD
Frank Nocke
la source
Pourquoi avoir les deux règles? Le plus simple RedirectMatch suffit à lui seul. (En outre, les expressions rationnelles ne semblent pas tout à fait correctes - pourquoi l'avantage de la fin?)
Bennett McElwee
Paranoïa personnelle / sécurité doublée. Si RewriteEngine est désactivé (modifications de la configuration centrale, mauvaise communication entre les équipes, "serveur" malchanceux, ... vous le nommez :-) Le + est obsolète ou devrait être un $, bon point! (pas de temps pour les tests, désolé.)
Frank Nocke
Si vous craignez que RewriteEngine ne soit peut-être pas activé, mettez-le simplement RewriteEngine Onavant votre RewriteRule. Quoi qu'il en soit, il est tautologique et redondant car le plus simple RedirectMatch suffit à lui seul. Même si cela pourrait être simplifié. Fondamentalement, je recommande ma réponse à la place. :)
Bennett McElwee
+1 pour le test décisif.
5

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"
scribu
la source
4
Cela fonctionne-t-il pour moi, cependant le ErrorDocument final n'a aucun impact? Du point de vue de la sécurité, je souhaiterais une 404 fausse sur une 403 informative à l'attaquant ...
Frank Nocke
1
C'est une mauvaise idée, car elle divulgue des informations aux pirates. Un 403 signifie qu'il est là, un 404 signifie que ce n'est pas. Chaque fait sur la configuration d’un serveur est utile pour un pirate informatique. J'envisagerais de réviser cela.
GerardJP
3

J'ajoute toujours la ligne suivante dans le template 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.

ALex_hha
la source
1

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 utilisateurs du répertoire .git.

Cela devrait fonctionner avec d'autres serveurs Web et ne repose pas sur des fichiers .htaccess gourmands en performances.

Martijn
la source
1

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 un contexte de configuration de 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 .gitou .svnspécifiquement. Cela correspondrait aussi à des choses comme .htaccesset .htpasswdintrinsèquement.

Personnellement, j'aime bien émettre des requêtes 403 au lieu de 404, mais vous pouvez facilement utiliser un RewriteRule au lieu d'un refus d'authentification, comme ceci:

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

Vous voulez probablement aussi refuser de servir .gitignore.

Les fichiers commençant par un point sont cachés dans linux.

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

RedirectMatch 404 /\.

Vladimir Kornea
la source
0

C'est un peu tard mais ma réponse est légèrement différente et j'ai donc pensé l'ajouter. Cela doit aller dans le fichier httpd.conf. Le <Files "*">niché à l'intérieur de la <Directory>balise 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>
Jonnyjandles
la source