Como capturar ou duplicar com segurança as solicitações recebidas para um servidor da web

1

Adotamos um aplicativo da web legado que não podemos modificar (o código-fonte está corrompido e a implantação falha) e, eventualmente, seremos reescritos. O ideal seria migrar um passo de cada vez, mas isso não é possível, já que não podemos modificar efetivamente o aplicativo.

Estou encarregado de reescrever o aplicativo e existem alguns algoritmos de sincronização complexos que gostaria de testar em relação aos dados POST'd para a API atual.

Qual é a maneira mais fácil e mais segura de capturar solicitações HTTP de entrada com todos os dados associados? A solução deve ser transparente para os usuários da API. O servidor está rodando no Ubuntu Linux e nós temos acesso SSH a ele. O aplicativo da Web está sendo executado no Apache 2 em Ruby.

  • Use algum tipo de sniffer de pacotes para capturar o tráfego de entrada. Eu teria que descobrir uma maneira de reproduzir essas solicitações em um servidor próprio.
  • Altere o DNS para apontar para outro IP que capture e registre os dados da solicitação e, em seguida, redirecione a solicitação para o servidor de produção. Eu não acho que nós temos acesso a infra-estrutura de rede, então eu suponho que isso deve ser executado como um serviço da web que retorna uma solicitação com um cabeçalho de redirecionamento para o servidor real. Parece frágil e pode representar preocupações de segurança para os navegadores?
  • Use algum tipo de módulo do Apache para fazer isso.

Como as soluções acima se comparam em termos de:

  • O risco imposto para desativar o servidor e / ou o site
  • A facilidade de implementação

Por favor, sinta-se à vontade para sugerir alternativas adicionais / melhores.

    
por georgiosd 08.04.2013 / 10:58

3 respostas

1

Eu usaria tcpdump ou ngrep , seria bom ter a porta no switch conectado ao servidor da Web espelhada, mas, na falta disso, você pode executar ngrep ou tcpdump no servidor em si.

Você precisará de acesso de superusuário para executar qualquer um desses programas.

Você vai querer ler um pouco, já que obviamente sabe o que está procurando no tráfego, o ngrep permite que você selecione tráfego por regex, o que pode permitir que você escolha pacotes com melhor precisão.

ngrep -l -q -d eth0 "^POST " tcp and port 80 -O dump.file

Isso traria para você quaisquer dados HTTP POSTados para a porta 80 em eth0. Você pode escolher algo muito mais específico. Se você estiver lendo o tráfego diretamente do arquivo, você pode querer adicionar -W byline , pois ele torna os pacotes muito mais legíveis, já que respeita as quebras de linha, para que você possa ver o pacote escrito mais logicamente (para humanos). ). -O dump.file grava a saída da sua captura de pacotes em um arquivo. A saída pode ser tão detalhada quanto você quiser, para reproduzir os pacotes, dê uma olhada em tcpreplay

    
por 08.04.2013 / 11:15
1

A maneira mais fácil e segura de capturá-lo seria simplesmente executar um sniffer de pacotes, como você sugeriu. Se você simplesmente fizer uma pesquisa na Web por "solicitações de repetição de HTTP", receberá vários programas que podem capturar e reproduzir suas solicitações. Existem também ferramentas profissionais para isso, por ex. "LoadRunner", que é usado no meu trabalho.

Se você não quiser instalar nenhum software extra, poderá usar tcpdump -s0 -w /path/to/output.file para capturar o tráfego. Isso lhe dará um arquivo do qual você pode ler, usando "tcpdump -A -r /path/to/output.file ', presumivelmente usando filtros como" dst = ip.to.webserver ". Mas então você precisaria algo para reproduzi-lo.

Aqui está um exemplo de mim usando o tcpdump em localhost:

$ tcpdump -i lo0 -s0 -w /tmp/tcpdump.out

entretanto, eu acesso um site em localhost de outra janela; uma vez terminado, pressionarei ctrl-c para parar o tcpdump

$ sudo tcpdump -r /tmp/tcpdump.out  -t -q -n -A 'tcp dst port 80 and  (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
reading from file /tmp/tcpdump.out, link-type EN10MB (Ethernet)
IP 127.0.0.1.57499 > 127.0.0.1.http: tcp 122
E.....@[email protected]................
.9...9..GET /~dyho01/ HTTP/1.0
User-Agent: Wget/1.11.4 Red Hat modified
Accept: */*
Host: localhost
Connection: Keep-Alive

Você provavelmente poderia obter as mesmas informações abrindo o arquivo raw tcpdump em um programa do Windows, como o wireshark.

    
por 08.04.2013 / 11:14
1

A opção de sniffer de pacotes é boa, desde que a conexão não tenha criptografia em jogo, então você será SOL. Nesse caso, você precisará de um modelo de proxy para a captura, em que os usuários se conectam ao proxy usando SSL, aceitam o certificado de proxy e, em seguida, a conexão com o proxy está novamente em SSL para o host de destino. Ferramentas de teste como LoadRunner, Jmeter ou similares seriam boas para capturar uma conversa de proxy para um único usuário para permitir que você examine a estrutura das informações que estão sendo passadas, mas seria impraticável para uso em produção para vários usuários.

Eu procuraria um pacote de servidor proxy em que você pudesse configurar o proxy para despejar as solicitações em um log para fins de análise. Dessa forma, você teria uma visualização bruta da solicitação fora do SSL e teria que remontar os pacotes de um rastreamento de nível de pacote.

    
por 15.05.2013 / 15:46