Como habilitar a proteção DDoS?

86

DDoS (ataques distribuídos de negação de serviço) geralmente são bloqueados no nível do servidor, certo?

Existe uma maneira de bloqueá-lo em um nível de PHP, ou pelo menos reduzi-lo?

Se não, qual é a maneira mais rápida e comum de impedir ataques DDoS?

coderama
fonte
De não ter nada melhor, aqui está uma lista de módulos do Apache que podem ajudar potencialmente. Parece não muito rico, entretanto, e os dois projetos de quatro (conforme pesquisado por 'dos') aparecem apontando para lugar nenhum.
Audrius Meskauskas
Algo assim? mod-antiloris.sourceforge.net
K-Gun
Um DDOS é bem-sucedido quando o sistema não consegue mais processar todas as solicitações que o ataque está fazendo. Se você adicionar código em seu aplicativo que verifica cada solicitação para "Este é um ataque DDOS", então esse código está realmente fazendo mais mal do que bem, porque apenas leva um pouco mais de recursos para cada solicitação. Isso só funcionaria em um ambiente muito restritivo, onde solicitações anônimas não são permitidas de qualquer maneira.
Hugo Delsing

Respostas:

188

DDOS é uma família de ataques que sobrecarrega os principais sistemas do datacenter, incluindo:

  • A conexão de rede do centro de hospedagem com a internet
  • A rede interna e os roteadores do centro de hospedagem
  • Seu firewall e balanceadores de carga
  • Seus servidores web, servidores de aplicativos e banco de dados.

Antes de começar a construir sua defesa DDOS, considere qual é o valor em risco de pior caso. Para um serviço não crítico e gratuito para uma pequena comunidade, o valor total em risco pode ser amendoim. Para um sistema pago, voltado para o público e de missão crítica para um negócio estabelecido de bilhões de dólares, o valor pode ser o valor da empresa. Neste último caso, você não deve usar StackExchange :) De qualquer forma, para se defender contra DDOS, você precisa de uma abordagem de defesa em profundidade:

  1. Trabalhe com seu centro de hospedagem para entender os serviços que eles oferecem, incluindo IP e filtragem de porta em suas conexões de rede com a Internet e serviços de firewall que oferecem. Isso é crítico: muitos sites são retirados da Internet pela empresa de hospedagem, pois a empresa de hospedagem lida com a interrupção de todo o data center causada pelo DDoS para um cliente. Além disso, durante um ataque DDOS, você trabalhará em estreita colaboração com a equipe do centro de hospedagem, portanto, conheça seus números de emergência e mantenha uma boa relação com eles :) Eles devem ser capazes de bloquear regiões internacionais inteiras, bloquear completamente serviços ou redes específicas protocolos e outras medidas defensivas de amplo espectro ou, alternativamente, permitir apenas IPs da lista de permissões (dependendo do seu modelo de negócios)
  2. Enquanto estiver no centro de hospedagem - use uma Content Delivery Network para distribuir serviços (principalmente estáticos) perto de seus usuários finais e esconder seus servidores reais dos arquitetos DDOS. O CDN completo é muito grande para um DDOS remover todos os nós em todos os países; se o DDOS se concentra em um país, pelo menos outros usuários ainda estão OK.
  3. Mantenha todos os seus sistemas e pacotes de software atualizados com os patches de segurança mais recentes - e todos eles:

    • Switches gerenciados - sim, eles às vezes precisam ser atualizados
    • Roteadores
    • Firewalls
    • Balanceadores de carga
    • Sistemas operacionais
    • Servidores web
    • Línguas e suas bibliotecas
  4. Certifique-se de ter um bom firewall ou dispositivo de segurança configurado e regularmente revisado por um especialista em segurança qualificado . Regras fortes no firewall são uma boa defesa contra muitos ataques simples. Também é útil ser capaz de gerenciar a largura de banda disponível para cada serviço aberto.

  5. Tenha boas ferramentas de monitoramento de rede - isso pode ajudá-lo a entender:

    • Que você está sob ataque, em vez de simplesmente estar sob carga pesada
    • De onde vem o ataque (o que pode incluir países com os quais você normalmente não faz negócios) e
    • O que o ataque realmente é (portas, serviços, protocolos, IPs e conteúdo de pacote)
  6. O ataque pode ser simplesmente o uso pesado de serviços de sites legítimos (por exemplo, acessando URIs 'legais' executando consultas ou inserindo / atualizando / excluindo dados) - milhares ou milhões de solicitações provenientes de dezenas a milhões de endereços IP diferentes trarão um site para seu joelhos. Como alternativa, alguns serviços podem ser tão caros para executar que apenas algumas solicitações causam um DOS - pense em um relatório realmente caro. Portanto, você precisa de um bom monitoramento no nível do aplicativo do que está acontecendo:

    • Quais serviços foram invocados e quais argumentos / dados são enviados (ou seja, registrar em seu aplicativo)
    • Quais usuários estão fazendo a invocação e de quais IPs (ou seja, logando em seu aplicativo)
    • Quais consultas e inserções / atualizações / exclusões o banco de dados está executando
    • Média de carga, utilização de CPU, i / o de disco, tráfego de rede em todos os computadores (e VMs) em seu sistema
    • Certifique-se de que todas essas informações sejam facilmente recuperáveis ​​e que você possa correlacionar os logs de diferentes computadores e serviços (ou seja, certifique-se de que todos os computadores estejam sincronizados com o tempo usando o ntp).
  7. Restrições e limites sensatos em sua aplicação . Por exemplo, você pode:

    • Use um recurso de QoS no balanceador de carga para enviar todas as sessões anônimas para separar servidores de aplicativos em seu cluster, enquanto os usuários conectados usam outro conjunto. Isso evita que um DDOS anônimo em nível de aplicativo tire clientes valiosos
    • Usando um CAPCHA forte para proteger serviços anônimos
    • Tempo limite de sessão
    • Tenha um limite de sessão ou limite de taxa em certos tipos de solicitação, como relatórios. Certifique-se de que você pode desligar o acesso anônimo, se necessário
    • Certifique-se de que um usuário tenha um limite para o número de sessões simultâneas (para evitar que uma conta invadida se conecte um milhão de vezes)
    • Ter diferentes usuários de aplicativos de banco de dados para diferentes serviços (por exemplo, uso transacional vs. uso de relatórios) e usar o gerenciamento de recursos de banco de dados para evitar que um tipo de solicitação da web sobrecarregue todos os outros
    • Se possível, torne essas restrições dinâmicas ou pelo menos configuráveis. Dessa forma, enquanto você está sob ataque, você pode definir limites temporários agressivos no local ('estrangulando' o ataque), como apenas uma sessão por usuário e nenhum acesso anônimo. Isso certamente não é ótimo para seus clientes, mas muito melhor do que não ter nenhum serviço.
  8. Por último, mas não menos importante, escreva um documento do Plano de Resposta do DOS e faça com que ele seja revisado internamente por todas as partes relevantes: Negócios, Gerenciamento, a equipe de desenvolvimento de SW, a equipe de TI e um especialista em segurança. O processo de redação do documento fará com que você e sua equipe reflitam sobre os problemas e os ajudem a se preparar caso o pior aconteça às 3 da manhã do seu dia de folga. O documento deve abranger (entre outras coisas):

    • O que está em risco e o custo para o negócio
    • Medidas tomadas para proteger os ativos
    • Como um ataque é detectado
    • A resposta planejada e o procedimento de escalonamento
    • Processos para manter o sistema e este documento atualizados

Portanto, preâmbulo à parte, aqui estão algumas respostas específicas:

DDoS geralmente são bloqueados no nível do servidor, certo?

Na verdade, não - a maioria dos piores ataques DDOS são de baixo nível (no nível do pacote IP) e são tratados por regras de roteamento, firewalls e dispositivos de segurança desenvolvidos para lidar com ataques DDOS.

Existe uma maneira de bloqueá-lo em um nível de PHP, ou pelo menos reduzi-lo?

Alguns ataques DDOS são direcionados ao próprio aplicativo, enviando URIs e solicitações HTTP válidas. Quando a taxa de solicitações aumenta, seu (s) servidor (es) começam a ter problemas e você terá uma interrupção do SLA. Nesse caso, existem coisas que você pode fazer no nível do PHP:

  • Monitoramento no nível do aplicativo: certifique-se de que cada solicitação de registro de serviço / página de uma forma que você possa ver o que está acontecendo (para que você possa tomar medidas para mitigar o ataque). Algumas ideias:

    • Tenha um formato de registro que você possa carregar facilmente em uma ferramenta de registro (ou Excel ou similar) e analisar com ferramentas de linha de comando (grep, sed, awk). Lembre-se de que um DDOS gerará milhões de linhas de registro. Você provavelmente precisará fatiar e cortar seus logs (especialmente com relação ao URI, tempo, IP e usuário) para descobrir o que está acontecendo e precisa gerar dados como:

      • Quais URIs estão sendo acessados
      • Quais URIs estão falhando em uma taxa alta (um provável indicador dos URIs específicos que os invasores estão atacando)
      • Quais usuários estão acessando o serviço
      • De quantos IPs cada usuário acessa o serviço de
      • Quais URIs são acessados ​​por usuários anônimos
      • Quais argumentos estão sendo usados ​​para um determinado serviço
      • Auditar ações de usuários específicos
    • Registre o endereço IP de cada solicitação. NÃO reverta o DNS - ironicamente, o custo de fazer isso torna um DDOS mais fácil para os invasores

    • Registre todo o URI e método HTTP, por exemplo, "GET http://example.com/path/to/service?arg1=ddos "
    • Registre a ID do usuário, se presente
    • Registrar argumentos HTTP importantes
  • Limites de taxa razoáveis: você pode implementar limites de quantas solicitações um determinado IP ou usuário pode fazer em um determinado período de tempo. Um cliente legítimo poderia fazer mais de 10 solicitações por segundo? Os usuários anônimos podem acessar relatórios caros?

  • CAPTCHA para acesso anônimo: implemente um CAPTCHA para todas as solicitações anônimas para verificar se o usuário é uma pessoa, não um bot DDOS.

Qual é a maneira mais rápida e comum de interromper os ataques DDOS?

O mais rápido provavelmente é ceder à chantagem, embora isso possa não ser desejável.

Caso contrário, a primeira coisa a fazer é entrar em contato com seu provedor de hospedagem e / ou CDN e trabalhar com eles (se eles ainda não o contataram perguntando o que diabos está acontecendo ...). Quando ocorre um DDOS, provavelmente afetará colateralmente outros clientes do provedor de hospedagem, e o provedor pode estar sob pressão considerável para encerrar seu site simplesmente para proteger seus recursos. Esteja preparado para compartilhar seus logs (toda e qualquer informação) com o provedor; esses logs, combinados com seus monitores de rede, podem, juntos, fornecer informações suficientes para bloquear / mitigar o ataque.

Se você está esperando um DDOS, é uma boa ideia qualificar seu provedor de hospedagem no nível de proteção que ele pode oferecer. Eles devem ter experiência em DDOS e ferramentas para mitigá-lo - compreender suas ferramentas, processos e procedimentos de escalonamento. Também pergunte sobre o suporte que o provedor de hospedagem tem de seus provedores upstream. Esses serviços podem significar um custo inicial ou mensal, mas trate isso como uma apólice de seguro.

Enquanto estiver sob ataque, você precisará pegar seus logs e extraí-los - tente descobrir o padrão do ataque. Você deve considerar desligar o acesso anônimo e limitar os serviços sob ataque (ou seja, diminuir o limite de taxa do aplicativo para o serviço).

Se tiver sorte e você tiver uma base de clientes pequena e fixa, poderá determinar os endereços IP válidos de seus clientes. Se for esse o caso, você pode mudar para uma abordagem de lista branca por um curto período. Certifique-se de que todos os seus clientes saibam que isso está acontecendo para que possam ligar se precisarem de acesso de um novo IP :)


Doug McClean tem ótimos conselhos em: https://stackoverflow.com/a/1029613/1395668

Andrew Alcock
fonte
20

De acordo com a parte PHP da questão;

Embora eu não dependa do PHP para isso, ele pode ser implementado, mas precisa considerar todas essas possibilidades ou mais;

  1. O invasor pode alterar o IP para cada solicitação
  2. O invasor pode passar parâmetro (s) para URI que o site de destino não se importa com esses parâmetros
  3. O invasor pode reiniciar a sessão antes de expirar ...

Pseudo simples;

<?php
// Assuming session is already started
$uri = md5($_SERVER['REQUEST_URI']);
$exp = 3; // 3 seconds
$hash = $uri .'|'. time();
if (!isset($_SESSION['ddos'])) {
    $_SESSION['ddos'] = $hash;
}

list($_uri, $_exp) = explode('|', $_SESSION['ddos']);
if ($_uri == $uri && time() - $_exp < $exp) {
    header('HTTP/1.1 503 Service Unavailable');
    // die('Easy!');
    die;
}

// Save last request
$_SESSION['ddos'] = $hash;
?>
K-Gun
fonte
8

O nível de php está muito atrasado na cadeia de solicitação.

Colocar seu servidor apache atrás de um dispositivo de código aberto pode ser uma boa opção para você.

http://tengine.taobao.org/ tem alguma documentação e código-fonte de mais módulos voltados para a prevenção de DDOS. É uma expansão do nginx, portanto, você pode configurá-lo facilmente como um proxy reverso para sua instância do apache.

Consulte: http://blog.zhuzhaoyuan.com/2012/01/a-mechanism-to-help-write-web-application-firewalls-for-nginx/ para saber como combater a colisão com ataques DoS.

Totalmente esquecido também, http://www.cloudflare.com é um dos melhores firewalls de aplicativos da web gratuitos, eles têm planos gratuitos e pagos e vão te salvar de DDOS, nós o usamos para muitos de nossos sites de alto tráfego apenas por seus recursos de cache . É incrível!

j_mcnally
fonte
5

Você não pode fazer isso em nível de PHP. DDOS é um tipo de ataque que envia muitas solicitações ao seu servidor web. Seu servidor web rejeitará a solicitação antes de chamar seu script PHP.

Se você estiver usando o Apache, aqui estão algumas dicas do Apache: http://httpd.apache.org/docs/trunk/misc/security_tips.html

ndlinh
fonte
5

O DDoS é mais bem tratado por dispositivos de rede muito caros e especialmente desenvolvidos. Os hosts geralmente não são bons em fazer proteção DDoS porque estão sujeitos a um desempenho relativamente baixo, esgotamento do estado, largura de banda limitada, etc. O uso de iptables, mods apache e serviços semelhantes pode ajudar em algumas situações se você não tiver acesso ao hardware de mitigação de DDoS ou um serviço de mitigação de DDoS, mas está longe do ideal e ainda deixa você em risco de ataque.

Ryan
fonte
8
Precisamos de uma solução, e se não houver uma solução ideal, precisamos de soluções parciais. Ninguém precisa de um conselho do tipo "você simplesmente não pode fazer isso".
Audrius Meskauskas
5

Que tal algo assim no lado do PHP:

//if user does not change IP, then ban the IP when more than 10 requests per second are detected in 1 second
$limitps = 10;
if (!isset($_SESSION['first_request'])){
    $_SESSION['requests'] = 0;
    $_SESSION['first_request'] = $_SERVER['REQUEST_TIME'];
}
$_SESSION['requests']++;
if ($_SESSION['requests']>=10 && strtotime($_SERVER['REQUEST_TIME'])-strtotime($_SESSION['first_request'])<=1){
    //write the IP to a banned_ips.log file and configure your server to retrieve the banned ips from there - now you will be handling this IP outside of PHP
    $_SESSION['banip']==1;
}elseif(strtotime($_SERVER['REQUEST_TIME'])-strtotime($_SESSION['first_request']) > 2){
    $_SESSION['requests'] = 0;
    $_SESSION['first_request'] = $_SERVER['REQUEST_TIME'];
}

if ($_SESSION['banip']==1) {
    header('HTTP/1.1 503 Service Unavailable');
    die;
}
NVG
fonte
1
Existem alguns erros neste código: 10 é codificado, strtotime não é necessário nas variáveis ​​de servidor e sessão e $ _SESSION ['ban_up'] == 1 deve ser = 1.
Jason Silver
2

Você não usar proteção baseada em PHP, é horrível e dificilmente terá um impacto em tudo! Configure seu servidor da web para solicitações de limite de taxa, por exemplo em Nginx usando o módulo limit_req ( http://nginx.org/en/docs/http/ngx_http_limit_req_module.html )

Embora, eu recomendaria usar CloudFlare para combater a camada 4 - entretanto, não ataques baseados na camada 7, a menos que você esteja disposto a pagar.

JustLloyd
fonte
sim, funcionou muito bem para mim também, minha experiência aqui softwareengineeringsolutions.co.uk/…
Elvis Ciotti
2

Os DDOS são geralmente bloqueados no nível do servidor. Ative a proteção DDOS no nível do servidor. Por favor, verifique as notas abaixo para proteções DDOS.

Definições de configuração do servidor Apache HTTP que podem ajudar a evitar problemas de DDOS:

A diretiva RequestReadTimeout permite limitar o tempo que um cliente pode levar para enviar a solicitação.

Aguarde 10 segundos para receber a solicitação incluindo os cabeçalhos e 30 segundos para receber o corpo da solicitação:

RequestReadTimeout header=10 body=30

Aguarde pelo menos 10 segundos para receber o corpo da solicitação. Se o cliente enviar dados, aumente o tempo limite em 1 segundo para cada 1000 bytes recebidos, sem limite superior para o tempo limite (exceto para o limite fornecido indiretamente por LimitRequestBody):

RequestReadTimeout body=10,MinRate=1000

RequestReadTimeout header=10-30,MinRate=500
RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500

A diretiva KeepAliveTimeout também pode ser reduzida em sites sujeitos a ataques DoS. Alguns sites até mesmo desligam os keepalives completamente por meio do KeepAlive, o que obviamente tem outras desvantagens no desempenho. Os valores de várias diretivas relacionadas ao tempo limite fornecidas por outros módulos devem ser verificados.

As diretivas LimitRequestBody, LimitRequestFields, LimitRequestFieldSize, LimitRequestLine e LimitXMLRequestBody devem ser configuradas com cuidado para limitar o consumo de recursos acionado pela entrada do cliente. Ajuste a diretiva MaxRequestWorkers para permitir que o servidor controle o número máximo de conexões simultâneas sem ficar sem recursos.

Raja Rama Mohan Thavalam
fonte
2

Etapas anti DDOS :

  • A primeira coisa importante é identificar o ataque de ddos ​​primeiro. Identificar o ataque de ddos ​​mais cedo significa mais e melhor para o seu servidor.
  • Obtendo melhor largura de banda disponível para seu servidor. Sempre mantenha largura de banda mais do que suficiente necessária para o seu servidor. Isso não impedirá o ataque de DDOS, mas levará mais tempo. Com isso, você terá algum tempo extra para agir.
  • Se você possui seu próprio servidor web, então você pode defender o parâmetro de rede por limite de taxa de seu roteador, adicionar filtros para descartar pacotes para diferentes fontes de ataques, tempo limite de conexões abertas pela metade de forma mais agressiva. Defina também limites inferiores de queda de inundação de SYN, ICMP e UDP.
  • Se você não tem muita ideia sobre essas coisas, entre em contato com seus provedores de hospedagem rapidamente. Eles podem tentar o seu melhor prevenir os ataques DDOS.
  • Também há serviço de mitigação DDOS especial fornecido pela Cloudflare e muitas outras empresas. Pelo qual eles podem ajudá-lo a prevenir os ataques DDOS. Além disso, muitas empresas oferecem proteção de ddos e proteção de dos baratos .
Eu sou novato
fonte