Tornar inacessível o diretório .git na Web

129

Eu tenho um site que eu uso o github (código fechado) para rastrear alterações e atualizar o site. O único problema é que parece que o diretório .git está acessível via web. Como posso parar com isso e ainda poder usar o git?

Devo usar .htaccess? Devo alterar as permissões do .git?

Chris Muench
fonte
deve estar em serverfault
tback
8
Está em serverfault: serverfault.com/questions/128069/…
scribu 28/10

Respostas:

39

Crie um .htaccessarquivo na .gitpasta e coloque o seguinte neste arquivo:

Order allow,deny
Deny from all

Mas observe que isso seria perdido se você clonar novamente o repositório

ThiefMaster
fonte
38
É verdade, mas eu recomendaria contra a colocá-lo no .git/próprio diretório porque ele estaria perdido se você nunca re-clonado no repositório.
Jake Wharton
Isso é problemático se você tiver mais de um diretório .git e deve ser refeito se você clonar novamente o diretório.
Bennett McElwee 29/07
1
Eu tentei isso e achei que funciona, mas isso e aparentemente QUALQUER solução que coloca essa configuração no .git / tem os 2 inconvenientes mencionados acima, o primeiro parecendo pior, e o terceiro talvez o pior de tudo: a citação (Make .git directory web inacessível), incluindo como é feito quando e por quem, é pequeno, mas ainda é fundamental para os dados (especialmente por sua segurança, incluindo análise quando e antes de não ser feito corretamente) MAS em .git / NÃO é realmente parte dos dados ( incluindo versionado e compartilhado e bem preservado), também NÃO restaurado ... análogo a um .gitignore melhor colocado com os dados adequados e não em .git /.
Destino Architect
3
Por que essa é a resposta aceita e não a de Bennett? A técnica dele é simples e eficaz para resolver isso.
21415 Josh Frankel
1
Muito provavelmente porque OP aceita este dois anos antes de o outro foi publicado;)
ThiefMaster
379

Coloque isso em um .htaccessarquivo na raiz do seu servidor web:

RedirectMatch 404 /\.git

Esta solução é robusta e segura : é

  • funciona para todos os .gitdiretórios do seu site, mesmo que haja mais de um,
  • também oculta outros arquivos Git como .gitignoree.gitmodules
  • funciona mesmo para .gitdiretórios adicionados recentemente e
  • nem mesmo revela o fato de que os diretórios existem.
Bennett McElwee
fonte
1
Funcionou na .gitpasta, mas eu ainda conseguia obter o .gitignorearquivo.
Kurt Emch 12/04
Minha regex funciona nos meus testes e deve funcionar de acordo com a documentação do RedirectMatch, já que a regex precisa corresponder apenas a parte da URL, não a URL completa: consulte a nota "diferença sutil" na documentação do AliasMatch vinculada . Ainda assim, os documentos são uma coisa, o mundo real é outra. O regex @artlogic corresponde à URL completa, então talvez haja algumas diferenças de versão no Apache ou estou apenas interpretando mal as coisas.
Bennett McElwee
2
@BennettMcElwee - depois de examinar mais de perto a documentação e executar alguns testes, parece que os curingas não são necessários para mim, afinal. Obrigado pela solução. Funciona bem!
Artlogic
De acordo com os documentos do apache2, você também pode colocá-lo em outro contexto de configuração:server config, virtual host, directory, .htaccess
bennos
Eu até sugeriria adicionar ". *" No final da expressão, para que nenhum arquivo / pasta em .git / possa ser acessado ->RedirectMatch 404 /\.git.*
Dimitri Hautot
33

As .htaccesspermissões e a .git/pasta funcionariam. Eu recomendo o primeiro:

<Directory .git>
    order allow,deny
    deny from all
</Directory>
Jake Wharton
fonte
Existe outra maneira de lidar com o apache, pois não tenho permissão para usar a diretiva <Directory> devido às configurações do servidor.
Chris Muench 26/05
2
Há todos os tipos de formas de correspondência (por exemplo, <Files>, <FilesMatch>).
Jake Wharton
4
Essa resposta está totalmente incorreta - o diretório simplesmente não é permitido nos arquivos .htaccess. Não depende das configurações do servidor.
doublemarked
2
NI8VDY = Falha nas 1 das 1 vezes em que tentei: na hospedagem compartilhada Dreamhost, coloquei isso no .htaccess da raiz do site e, em seguida, http: to raiz do site deu uma cotação de erro aos logs do servidor (.. <Diretório não permitido aqui). 2 comentadores já alertam para esse problema e, por último, diz quote (o diretório simplesmente não é permitido em arquivos .htaccess) e consulte os documentos oficiais do diretório httpd.apache.org/docs/current/mod/core.html#directory say quote (Contexto: server configuração, host virtual) e, portanto, não .htaccess. Mas isso tem votos 26, portanto, aqueles que descobrem como trabalhar isso fora do .htaccess, explicam a PLS UPDATE THE SOLUTION.
Destino Architect
Concorde com @DestinyArchitect - desculpe pelo voto negativo, mas isso é enganador.
kael
7

Eu não queria mexer no .gitdiretório e não consegui que a solução de Bennett funcionasse no Apache 2.2, mas adicionar o seguinte à minha <VirtualHost>configuração funcionou:

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

Não me sinto confortável em controlar o acesso às minhas pastas .git individualmente e optar por fazê-lo via configuração do apache em vez de .htaccess, para impedir que eu as substitua ou que se esqueça de uma nova instalação, etc.

Aqui estão algumas instruções detalhadas, espero que ajude. Estou usando o Ubuntu 16.10.

  1. Primeiro verifique o que acontece se você navegar para a pasta .git em um navegador. No meu caso, fui apresentado a uma lista de diretórios. Se você estiver vendo o que não deveria estar vendo (por exemplo, não está recebendo um 404), faça o seguinte.
  2. Use apache2ctl -V para obter o HTTPD_ROOT e SERVER_CONFIG_FILE
  3. Use isso para editar sua configuração do apache, no meu caso $ sudo nano /etc/apache2/apache2.conf
  4. Adicione o seguinte em algum lugar no arquivo de configuração: RedirectMatch 404 /.git
  5. Reinicie o apache: $ sudo service apache2 restart
  6. Agora você deve obter um 404 se você navegar para a pasta novamente
  7. Eu tentei isso com .gitignore e também tenho um 404
Chris B
fonte
4

Uma opção mais robusta e simples seria desabilitar as permissões READ e Execution do .gitdiretório.

Como o Apache (httpd) é executado principalmente em uma conta de usuário especial, por exemplo, ele é executado como usuário apacheno CentOS, enquanto o .gitdiretório deve ser criado em uma conta de usuário real, para que possamos simplesmente bloquear o acesso alterando a permissão. Além disso, essa abordagem não introduz nenhum novo arquivo, nem afeta os comandos git.

O comando pode ser:

chmod -R o-rx .git
hailong
fonte
Em uma máquina em que as SAs não desejam o uso de .htaccess e não querem que eu mexa com seus arquivos httpd.conf -type, essa parece ser a melhor solução.
Alien Life Form
1
A desvantagem óbvia é que, se você clonar novamente, precisará se lembrar de executar chmodnovamente.
23718 Lauri Nurmi #
3

mod_rewrite fornecerá o efeito desejado:

RewriteEngine on
RewriteRule .*\.git/.* - [F]
Kosh
fonte
9
Esta é uma vulnerabilidade de divulgação de informações: facilita para as pessoas determinar a existência do .gitdiretório porque retorna um código Proibido em vez de Não Encontrado.
Bennett McElwee
2
Não é uma vulnerabity ao uso git
Adam
1

Em vez de mexer com .htaccessregras, como a maioria das respostas sugere, por que não simplesmente colocar o .git/diretório acima da raiz da web?

Nas minhas configurações, meu .gitdiretório geralmente mora em algo como:

/home/web/project_name/.git/

Meu código atual vive em

/home/web/project_name/www_root/

desde que minha raiz da web (conforme definido no Apache ou Nginx .. prefiro o último) é que /home/web/project_name/www_root/não há como o .gitdiretório ser acessível a partir da web, pois ele vive "mais alto" que o webroot

Javier Larroulet
fonte
public_html é um subdiretório do dir de trabalho repo ?? parece interessante
Hayden Thring
Não, não é um subdiretório. Ambos são "irmãos" dentro do meu diretório principal do projeto. Meu project_namediretório possui dois subdiretórios: www_rootonde seriam os arquivos realmente exibidos quando um visitante navega no meu site e .gitonde está o repositório. Puxar das atualizações de repositório www_roote seu conteúdo. O fato é que, como o .gitdiretório está hierarquicamente "acima" do meu controlador frontal, é inacessível via web.
Javier Larroulet
Eu acho que é isso que eu quis dizer, então você tem / home / user / public_html / e /home/user/.git
Hayden Thring
uau, que é uma solução tão fácil e simples, sua genialidade (não é difícil criar um bloco amplo para o servidor no apache security.conf) a única coisa a ser observada é se a sua hospedagem possui algumas configurações estranhas de propriedade / permissões no publlic_html, que pode ser alterado.
Hayden Thring
1
muito verdade ... Na verdade, tenho outros "diretórios de irmãos" para outros fins que permanecem inacessíveis da web, o que me permite dormir um pouco melhor à noite :)
Javier Larroulet