Ignorando diretórios .svn no IIS

8

Somos uma organização de desenvolvimento web e recentemente adotamos o subversion para o nosso sistema de controle de versão. Como executar uma atualização é muito mais rápido do que exportar e copiar os arquivos, os desenvolvedores desejam que o servidor de produção seja uma cópia de trabalho.

A única preocupação que tenho com isso é todos os arquivos .svn espalhados por todo o sistema e o fato de que algum indivíduo empreendedor poderia, potencialmente, ler o conteúdo dos arquivos ali, possivelmente fornecendo a eles informações que preferiríamos que não tivessem. .

Qual é a melhor / mais fácil maneira de impedir que o IIS sirva qualquer conteúdo desses diretórios .svn?

cdeszaq
fonte
11
Olá. Você poderia esclarecer que tipo de informação você gostaria de ter no .svn que ainda não estará disponível nos arquivos implantados?
Geo
Qual versão do IIS? Se o IIS7, você poderia obter o URL Rewrite Module e apenas configurar uma regra simples para ignorar os diretórios .svn.
MattB
11
@ Geo - os diretórios .svn contêm cópias em texto sem formatação dos arquivos na base de texto. Como os arquivos têm o mesmo nome, apenas com .svn-base anexado, as pessoas podem visualizar o código em texto sem formatação (este é um site ASP clássico). Preferimos que isso não aconteça.
cdeszaq
@ MattB - O servidor é o IIS6 no momento, mas está mudando para o IIS7 eventualmente. Portanto, examinarei o módulo de reescrita após a troca, mas, infelizmente, o servidor é o IIS6 no momento.
Cdeszaq 06/10/09

Respostas:

8

"Não faça dessa maneira" não responde à pergunta.

Na prática, eu gosto de ter uma cópia de trabalho no servidor de produção, porque dessa maneira eu posso fazer alterações rápidas na produção (quem nunca fez isso?) E devolvê-las. Depende de onde você deseja o controle deslizante de segurança / conveniência e em muitos casos, este é um bom lugar.

A solução padrão no Apacheland é deixar os arquivos .svn lá, mas solicitar ao servidor da Web que nunca os sirva. Veja como fazer isso com o IIS 5-7 no Windows 2000-2008.

  1. Baixe e instale o ISAPI_Rewrite - a versão Lite será suficiente para esse fim. Observe os requisitos adicionais do sistema para o Win 2008. Aviso - o instalador do MSI para e inicia o IIS.

  2. Desmarque a caixa "Somente leitura" nas propriedades do arquivo httpd.ini . Se você usou o instalador MSI, existe um atalho para o arquivo httpd.ini no menu Iniciar, em Helicon-> ISAPI_Rewrite

  3. Adicione estas linhas ao httpd.ini :

Diretivas ISAPI_Rewrite no httpd.ini :

# Deny access to Subversion working copy administrative
#  directories (.svn) and their contents
RewriteRule .*/\.svn\b.* . [F,I,O]

Agora, qualquer solicitação para um diretório .svn ou seu conteúdo resultará em um 404 não encontrado do servidor.

Nathan
fonte
Não percebi que instalei a versão mais antiga, ISAPI_Rewrite2. A versão mais recente, ISAPI_Rewrite3, inclui um aplicativo chamado "ISAPI_Rewrite Manager" que facilita um pouco a edição do arquivo e, no Windows 2008 Server, não parecia ser necessário reiniciar o IIS. Além disso, eu postei isso com mais alguns detalhes no meu blog: n8v.enteuxis.org/2009/11/...
Nathan
"Não faça dessa maneira" não responde à pergunta. - Stackoverflow em poucas palavras. Obrigado por abordar a questão diretamente.
John Hargrove
5

Você pode garantir que nenhuma conta de usuário usada pelo IIS tenha direitos para acessar os diretórios .svn.

Você pode fazer isso manualmente (não recomendado) ou usar algo como o script de exclusão MrJangles acionado para executar após a atualização do SVN ou executar regularmente como uma tarefa agendada:

for /r YOURPATH %f in (.svn) do icacls /deny <name_of_iis_user>:F "%f"

(observação: eu não testei o acima, você precisará verificar se ele faz o que está tentando antes de confiar na produção; consulte a saída de "icacls / help" para obter mais informações)

(outra observação: "icacls" é um comando do Vista / 2008, nas variantes anteriores do Windows, o comando é "cacls")

David Spillett
fonte
Isso é pura genialidade!
Richard Slater
5

Usando o IIS 7, abra o Gerenciador do IIS, selecione o nó do servidor, clique duas vezes no recurso Mapeamentos de manipulador . Clique na ação Adicionar manipulador gerenciado e configure o manipulador da seguinte maneira:

  • Caminho da solicitação: * .svn / * (mapeamento de curinga para todos os arquivos em todas as pastas .svn)
  • Tipo: System.Web.HttpForbiddenHandler
  • Nome: metadados do Subversion (você pode escolher um nome diferente, se quiser)

Agora, qualquer solicitação de arquivos nas pastas de metadados do Subversion denominadas .svn em todos os sites deve retornar isso:

Erro de Servidor na '/' Aplicação.

Este tipo de página não é exibido.

Descrição: o tipo de página que você solicitou não é exibido porque foi explicitamente proibido. Revise o URL abaixo e verifique se está escrito corretamente.

URL solicitado: /.svn/text-base/Default.aspx.svn-base

Você pode escolher um tipo de manipulador diferente, se desejar, talvez um manipulador FileNotFound que retorne um código de status 404.

Para o IIS 6 (com o ASP.NET 2 instalado e configurado):

Navegue para Diretório inicial> Configuração> Mapeamento e mapeie a .svn-baseextensão para %SystemRoot%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll. Em machine.config (no qual você pode encontrar %SystemRoot%\Microsoft.NET\Framework\v2.0.50727\CONFIG), você pode adicionar o mesmo manipulador acima para a extensão, adicionar o seguinte elemento XML como filho do <httpHandlers>elemento:

<add verb="*" path="*.svn-base" type="System.Web.HttpForbiddenHandler"/>

Isso impedirá que os visitantes solicitem os arquivos de código-fonte; eles ainda podem solicitar outros arquivos das pastas .svn. Mapeie mais extensões para aspnet_isapi.dll ou faça um mapeamento curinga (afetará o desempenho) e você poderá impedir que mais arquivos sejam solicitados.

Michiel van Oosterhout
fonte
4

Do ponto de vista da segurança pura, reeducaria seus desenvolvedores.

A facilidade de implantação não é necessariamente uma boa ideia se você sacrifica a segurança.

Você está planejando uma configuração para bloquear o acesso a informações confidenciais. O que acontece se a configuração mudar acidentalmente. O que acontece se um hotFix do IIS cair e mudar o funcionamento da sua configuração. O que acontece se a biblioteca de terceiros que você usa falha e para de funcionar. Posso pensar em vários eventos extremamente prováveis ​​que interromperiam sua configuração e permitiriam o acesso a esses arquivos, que seriam TOTALMENTE MITIGADOS por não ter os arquivos no servidor em primeiro lugar.

Você deve criar um script de implantação que copie os arquivos apropriados de um servidor intermediário. Você pode até montar via SVN para um diretório diferente no Prod.

Para implantar, você pode usar o RoboCopy e o comando / XD para excluir diretórios .svn. Você pode usar a ferramenta de implantação da web da Microsoft e limitar os diretórios com isso. Você pode implantar e executar o acima, for /r YOURPATH %f in (.svn) do rd /s /q "%f"se precisar também.

Apenas não implante esses diretórios no site de produção.

Christopher_G_Lewis
fonte
1

Não use subversão. A sério.

A partir dos seus comentários, parece que você está usando a ferramenta errada para o trabalho. O Subversion é uma ótima ferramenta para seus desenvolvedores, mas não é uma ferramenta de implantação / espelhamento. Se seu objetivo é simplesmente copiar arquivos do servidor de teste / teste para o servidor de produção com um mínimo de largura de banda e tempo, sugiro que você use o rsync . Agora, como eu sou um administrador do Unix, pode haver algum equivalente do Windows ao rsync que eu não conheça, então você pode querer fazer alguma pesquisa. No entanto, você pode usar o rsync no Cygwin ou cwrsync .

O Rsync permite espelhar diretórios em um servidor com diretórios em outro. Ele calcula um delta entre os dois servidores e copia apenas as diferenças. Não apenas isso, mas compacta o delta e, opcionalmente, também pode criptografá-lo.

Swoogan
fonte
.... +1 para rsync
Jason S
Destacado. O principal problema com a tentativa de ocultar ativamente os arquivos é que, se a regra do manipulador ou reescrita que você colocar em prática cair, todos os arquivos serão expostos subitamente novamente. Se você possui sua cópia de trabalho em um ambiente de teste ou de implantação privada, e tudo o que precisa é de um grande botão vermelho 'publicar' (um pequeno script) que sincroniza novamente a partir desse local para o servidor ativo. O rsync pode ser facilmente configurado para ignorar os caminhos / padrões dos arquivos e fará o upload da maioria das alterações em um piscar de olhos, e é quase tão conveniente quanto a sua configuração atual.
SmallClanger
0

A melhor prática seria um sistema de implantação automática que exporte e publique após a atualização SVN. Considere Hudson, por exemplo. Existem poucos, mas como não precisamos de um, não estou muito bem informado

Greetz, GHad

GHad
fonte
Queremos evitar a exportação devido a vários problemas, como largura de banda e velocidade de conexão. A atualização apenas repassa as coisas que mudaram, o que limita a quantidade de coisas repassadas drasticamente, o que é um fator importante para nós. Além disso, não queremos que as coisas sejam atualizadas automaticamente; portanto, embora o Hudson do CC.Net forneça isso, não nos ajuda aqui porque atualizaremos a produção manualmente.
cdeszaq
se você atualizar manualmente, por que não ter seu WC em uma área não atendida pelo servidor da Web e copie os arquivos atualizados desse diretório para o diretório que é atendido. Você obtém o benefício da atualização rápida da rede, ao custo de algum espaço em disco.
Gbjbaanb
0

Eu agendo um script em meus servidores de produção que procura .svn e simplesmente exclui os arquivos. Eu não acho que isso funcionará no seu caso.

for /r YOURPATH %f in (.svn) do rd /s /q "%f"

Se a remoção dos arquivos não for uma opção, você poderá colocar segurança básica nos diretórios por meio do IIS (restrições de senha ou IP). Isso impediria o IIS de fornecer conteúdo a usuários não autorizados.

Boa sorte!

Snipper
fonte
Remover os diretórios .svn não é uma opção, porque perderíamos os recursos de cópia de trabalho. Existe uma maneira com script para pesquisar em uma árvore e adicionar essas restrições do IIS? A tarefa de fazer isso manualmente é muito grande e perde a automação fornecida pelo subversion.
cdeszaq
Sem dúvida existe. Eu não escrevi nada assim antes, então vamos torcer para que outra pessoa responda.
Snipper