Estou desenvolvendo um aplicativo Flask que depende muito da interação de sites externos e é iniciado pelo usuário final. Se eu deixar o aplicativo sem nenhum tipo de controle de largura de banda / limitação de taxa, esse aplicativo poderá ser abusado por atores com intenções nefastas.
Meu objetivo é uma abordagem em duas etapas bastante simples:
A taxa limita que fontes IP individuais executem mais do que o
x
número de conexões por minuto. Isso pode ser facilmente alcançado comiptables
. Aqui está um exemplo semelhante ao meu objetivo:iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 15 \ --connlimit-mask 32 -j REJECT --reject-with tcp-reset
A taxa limita a capacidade dos aplicativos de executar mais do que o
x
número de pesquisas por URL . Exemplo:APP ---- 10 pps ---> stackexchange.com PERMIT APP ---- 25 pps ---> google.com DENY / 15 SECOND BACKOFF
Até onde sei, iptables
não há como rastrear URLs separados. Só é capaz de classificar o limite dessas conexões como um todo. Isso também não parece ser a única limitação para o que estou tentando alcançar. Se houvesse uma maneira de configurar iptables
dessa maneira, isso poderia fornecer alguns problemas ao meu aplicativo Web, pois essas solicitações são iniciadas pelo usuário.
Estou usando o Flask, uma opção viável pode estar usando um before_request
gancho e rastreando manualmente esses destinos com um armazenamento de dados como o Redis. No entanto, isso é muito alto na pilha para lidar com conexões dessa maneira. O que realmente preciso (ou acho que preciso) é de um aplicativo de firewall inteligente que possa dissecar solicitações de maneira personalizada e fechar conexões quando determinados pontos de interrupção forem atingidos.
Existe alguma maneira de conseguir o que estou tentando fazer?
Se sim, como?