Rendre le répertoire .git inaccessible

129

J'ai un site Web sur lequel j'utilise github (source fermée) pour suivre les modifications et mettre à jour le site. Le seul problème est qu'il semble que le répertoire .git soit accessible via le Web. Comment puis-je arrêter cela et continuer à utiliser git?

Dois-je utiliser .htaccess? Dois-je modifier les autorisations de .git?

Chris Muench
la source
devrait être sur serverfault
tback
8
Est sur serverfault: serverfault.com/questions/128069/…
scribu

Réponses:

39

Créez un .htaccessfichier dans le .gitdossier et placez ce qui suit dans ce fichier:

Order allow,deny
Deny from all

Mais notez qu'il serait perdu si jamais vous re-cloniez le référentiel

ThiefMaster
la source
38
C'est vrai, mais je recommanderais de ne pas le mettre dans le .git/répertoire lui-même car il serait perdu si jamais vous re-cloniez le référentiel.
Jake Wharton
C'est pénible si vous avez plus d'un répertoire .git, et doit être refait si jamais vous re-clonez le répertoire.
Bennett McElwee
1
J'ai essayé cela et j'ai trouvé que cela fonctionne MAIS ceci et apparemment TOUTE solution qui place ce paramètre dans .git / présente les 2 inconvénients mentionnés ci-dessus, le premier semble le pire, plus un troisième peut-être le pire de tous: la citation (Make .git directory web inaccessible), y compris comment cela est fait quand et par qui, est petit mais reste essentiel pour les données (en particulier pour leur sécurité, y compris l'analyse quand et avant pas correctement fait) MAIS en .git / cela ne fait PAS vraiment partie des données proprement dites ( y compris versionné et partagé et bien conservé) donc également PAS restauré ... analogue à un .gitignore mieux placé avec les données appropriées et non dans .git /.
Destiny Architect
3
Pourquoi est-ce la réponse acceptée et non celle de Bennett? Sa technique est simple et efficace pour résoudre ce problème.
Josh Frankel
1
Très probablement parce que OP a accepté celui-ci deux ans avant la publication de l'autre;)
ThiefMaster
379

Mettez ceci dans un .htaccessfichier à la racine de votre serveur Web:

RedirectMatch 404 /\.git

Cette solution est robuste et sécurisée : elle

  • fonctionne pour tous les .gitrépertoires de votre site, même s'il y en a plus d'un,
  • masque également d'autres fichiers Git comme .gitignoreet.gitmodules
  • fonctionne même pour les .gitrépertoires nouvellement ajoutés , et
  • ne révèle même pas le fait que les répertoires existent.
Bennett McElwee
la source
1
Cela fonctionnait sur le .gitdossier, mais je pouvais toujours récupérer le .gitignorefichier.
Kurt Emch
Mon regex fonctionne dans mes tests, et devrait fonctionner selon la documentation RedirectMatch puisque le regex ne doit correspondre qu'à une partie de l'URL, pas l'URL complète: voir la note "différence subtile" dans la documentation liée AliasMatch . Pourtant, les documents sont une chose, le monde réel en est une autre. Le regex @artlogic correspond à l'URL complète, alors peut-être qu'il existe des différences de version dans Apache ou que je ne fais que mal interpréter les choses.
Bennett McElwee
2
@BennettMcElwee - après avoir examiné de plus près la documentation et avoir exécuté quelques tests, il semble que les caractères génériques ne sont pas nécessaires pour moi après tout. Merci pour la solution. Fonctionne très bien!
artlogic
Selon la documentation apache2, vous pouvez également le mettre dans un autre contexte de configuration:server config, virtual host, directory, .htaccess
bennos
Je suggérerais même d'ajouter ". *" À la fin de l'expression, afin qu'aucun fichier / dossier sous .git / ne soit accessible ->RedirectMatch 404 /\.git.*
Dimitri Hautot
33

Les deux .htaccesset les autorisations sur le .git/dossier fonctionneraient. Je recommande l'ancien:

<Directory .git>
    order allow,deny
    deny from all
</Directory>
Jake Wharton
la source
Existe-t-il une autre façon de faire avec apache car je ne suis pas autorisé à utiliser la directive <Directory> en raison des paramètres du serveur.
Chris Muench
2
Il y a toutes sortes de façons de correspondance (par exemple <Files>, <FilesMatch>).
Jake Wharton
4
Cette réponse est tout à fait incorrecte - Le répertoire n'est tout simplement pas autorisé dans les fichiers .htaccess. Cela ne dépend pas des paramètres du serveur.
doublé
2
NI8VDY = Échec dans 1 de 1 fois que je l'ai essayé: sur l'hébergement partagé Dreamhost, j'ai mis ceci dans le .htaccess de la racine du site Web, puis http: à la racine du site Web a donné une citation d'erreur des journaux du serveur (.. <Répertoire non autorisé ici). 2 commentateurs sont déjà alertés de ce problème et disent la dernière citation (le répertoire n'est tout simplement pas autorisé dans les fichiers .htaccess) et consultez la documentation officielle du répertoire httpd.apache.org/docs/current/mod/core.html#directory say quote (Contexte: serveur config, hôte virtuel) et donc pas .htaccess. Mais cela a des votes 26, donc ceux qui trouvent comment travailler avec .htaccess, expliquent PLS UPDATE THE SOLUTION.
Destiny Architect
D'accord avec @DestinyArchitect - désolé pour le vote défavorable, mais c'est trompeur.
kael
7

Je ne voulais pas me faufiler dans le .gitrépertoire et je n'ai pas pu faire fonctionner la solution de Bennett sur Apache 2.2, mais l'ajout de ce qui suit à ma <VirtualHost>configuration a fonctionné:

RewriteRule ^.*\.git.* - [R=404]
David Moles
la source
5

Je ne suis pas à l'aise avec le contrôle individuel de l'accès à mes dossiers .git et je choisis de le faire via apache config au lieu de .htaccess, pour éviter de les écraser ou d'oublier une nouvelle installation, etc.

Voici quelques instructions détaillées en espérant qu'elles vous aideront. J'utilise Ubuntu 16.10.

  1. Vérifiez d'abord ce qui se passe si vous accédez au dossier .git dans un navigateur. Dans mon cas, on m'a présenté une liste d'annuaire. Si vous voyez ce que vous ne devriez pas voir (c'est-à-dire que vous n'obtenez pas de 404), procédez comme suit.
  2. Utilisez apache2ctl -V pour obtenir HTTPD_ROOT et SERVER_CONFIG_FILE
  3. Utilisez ceci pour éditer votre configuration Apache, dans mon cas $ sudo nano /etc/apache2/apache2.conf
  4. Ajoutez ce qui suit quelque part dans le fichier de configuration: RedirectMatch 404 /.git
  5. Redémarrez Apache: redémarrage de $ sudo service apache2
  6. Devrait maintenant vous obtenir un 404 si vous accédez à nouveau au dossier
  7. J'ai essayé cela avec .gitignore et j'ai également obtenu un 404
Chris B
la source
4

Une option plus robuste et simple consisterait à désactiver la permission de lecture et d'exécution du .gitrépertoire.

Comme Apache (httpd) s'exécute principalement sous un compte utilisateur spécial, par exemple, il s'exécute en tant qu'utilisateur apachesur CentOS, tandis que le .gitrépertoire doit être créé sous un compte utilisateur réel, nous pouvons donc simplement bloquer l'accès en modifiant l'autorisation. De plus, cette approche n'introduit aucun nouveau fichier, ni n'affecte les commandes git.

La commande peut être:

chmod -R o-rx .git
grêle
la source
Sur une machine où les SA ne veulent pas d'utiliser .htaccess et ne veulent pas que je joue avec leurs fichiers de type httpd.conf, cela semble être la meilleure solution.
Alien Life Form
1
L'inconvénient évident est que si vous re-clonez, vous devrez vous rappeler de chmodrecommencer.
Lauri Nurmi
3

mod_rewrite vous donnera l'effet désiré:

RewriteEngine on
RewriteRule .*\.git/.* - [F]
Kosh
la source
9
Il s'agit d'une vulnérabilité de divulgation d'informations: elle permet aux utilisateurs de déterminer facilement l'existence du .gitrépertoire car il renvoie un code interdit plutôt que Not Found.
Bennett McElwee
2
Ce n'est pas une vulnérabilité d'utiliser git
Adam
1

Au lieu de jouer avec les .htaccessrègles comme le suggèrent la plupart des réponses, pourquoi ne pas simplement placer le .git/répertoire au-dessus de la racine Web?

Dans mes configurations, mon .gitrépertoire se trouve généralement dans quelque chose comme:

/home/web/project_name/.git/

Mon code actuel habite

/home/web/project_name/www_root/

puisque ma racine Web (telle que définie sur Apache ou Nginx .. je préfère ce dernier) /home/web/project_name/www_root/il n'y a aucun moyen que le .gitrépertoire puisse être accessible depuis le Web car il vit "plus haut" que la racine Web

Javier Larroulet
la source
donc public_html est un sous-répertoire du répertoire de travail du repo ?? semble intéressant
Hayden Thring
Non, ce n'est pas un sous-répertoire. Ils sont tous les deux "frères et sœurs" dans mon répertoire principal de projet. Mon project_namerépertoire a deux sous-répertoires: www_rootoù se trouvent les fichiers réellement servis lorsqu'un visiteur navigue sur mon site et .gitoù se trouve le dépôt. Extraire des mises à jour du référentiel www_rootet de son contenu. Le fait est que, puisque le .gitrépertoire est hiérarchiquement "au-dessus" de mon contrôleur frontal, il est inaccessible via le Web.
Javier Larroulet
Je pense que c'est ce que je voulais dire, donc vous avez / home / user / public_html / et /home/user/.git
Hayden Thring
wow, c'est une solution si simple et si simple que son génie, (pas que faire un bloc à l'échelle du serveur dans apache security.conf soit difficile), la seule chose à surveiller est si votre hébergement a des paramètres de propriété / autorisations étranges sur publlic_html, que pourrait être changé.
Hayden Thring
1
très vrai ... j'ai en fait d'autres "répertoires frères" à d'autres fins qui restent inaccessibles depuis le web, ce qui me permet de dormir un peu mieux la nuit :)
Javier Larroulet