ratelimit pedidos POST

4

Estou executando um grande site multiusuário do WordPress. Eu tenho um cache de verniz na frente do servidor de aplicativos do WordPress. Como não faz sentido armazenar as solicitações POST em cache, estou vulnerável ao DDoS usando muitos POSTs no servidor de cache do verniz.

Eu tentei configurar uma regra de firewall que aceitasse apenas 20 conexões simultâneas de cada cliente, mas isso teve impacto nos usuários que estavam atrás de proxies compartilhados e em escolas com muitos usuários por trás do mesmo gateway.

O verniz não tem a opção de limitar os números de POSTs à taxa, e quero fazer o limite de taxa ANTES de atingir o servidor de aplicativos. Existe um pequeno proxy transparente que faria o trabalho?

Atualmente, o Varnish está recebendo cerca de 100-150 hits / segundo, o proxy deve pelo menos ser capaz de lidar com essa carga.

    
por Tonny Jørgensen 25.01.2012 / 14:08

2 respostas

2

Eu vou colocar isso como uma resposta apenas porque vai ser longo. Como você disse com bastante precisão, bloquear mais de 20 solicitações simultâneas de 1 IP não resolverá o problema. Você precisa definir critérios "mais inteligentes". Irei ao ponto de dizer que colocar outro proxy entre um proxy e um servidor de aplicativos não é elegante nem útil.

Não sei por que você deseja limitar a taxa antes de acessar o apache porque está perdendo fail2ban , mod_qos , mod-antiloris (altamente específico) e outras soluções. Além disso, não sei se as solicitações POST são seu único problema em termos de um DDoS.

As respostas de solicitação de POST em cache são possíveis e também fazem sentido. A menos que você esteja veiculando conteúdo dinâmico toda vez. Isso, obviamente, não significa que você pode armazenar em cache páginas autenticadas.

Você pode aplicar tempos de espera para o POST se a solicitação tiver levado mais de 5 segundos. Embora os usuários com conexões lentas não consigam postar nada. Você também pode aplicar uma regra por URL combinada com a regra acima. Isso faz sentido, já que é razoável para um usuário enviar POST 1000kb em uma página de upload de arquivo, mas não na página de login. Como eu disse, crie critérios "mais inteligentes". Eles podem ser longos e pode levar algum tempo para formulá-los, mas eles fornecerão uma solução sustentável, pois não sei se há um tamanho único para esse tipo de situação.

Outra solução que você pode combinar é um firewall de aplicativo. Pode ser mais do que você precisa, mas também pode mantê-lo seguro de muitas outras coisas. Aqui está uma página owasp com recomendações e o wiki relevante

EDITAR: Eu tenho que admitir, eu não tenho nenhuma experiência com essa configuração ( varnish e antiloris ). Mais cedo ou mais tarde, há muito que o verniz pode armazenar em cache (embora seja altamente "programável"). A principal coisa que você pode fazer é conhecer o padrão de uso e quando ele se desvia da norma. Se você quer apenas evitar esse tipo de ataque muito específico, escrever regras melhores para o Varnish deve fazê-lo. No entanto, as solicitações que chegam ao apache não são uma coisa ruim, contanto que você tenha os mods / confs adequados, o Apache pode dizer quando uma solicitação é legítima e, portanto, processá-la e quando não. Bloquear o número X de conexões de cada cliente NÃO é uma boa coisa a fazer, a menos que você possa definitivamente colocar esse IP na lista negra. Você pode fazer isso no apache através do fail2ban (regex) ou mod_qos

    
por 26.01.2012 / 15:58
0

Acho que o verniz configurado corretamente fará isso bem.

Eu não sei muito sobre o wordpress, mas acho que uma postagem válida terá uma variável de sessão em um cookie ou no formulário params. Em caso afirmativo, o que você deseja limitar é um POST repetido para o mesmo valor ou POSTs sem esse valor.

Eu fiz um post no blog aqui: link sobre limitação de taxa com base em endereço IP ou um parâmetro de URL; deve ser fácil personalizá-lo para POSTs e baseado em uma variável de formulário ou uma variável de cookie.

    
por 02.05.2012 / 12:48