Categories: apacheLinuxnullweb

Limitando tentativas de login/acesso via mod_security

Desafio do dia:
Bloquear tentativas excessivas de post em um formulário sem ser através da programação do sistema, pois persistência das tentativas em banco, por exemplo, seria muito pesado.

Esta dica também é útil para sistemas com código-fonte fechado que rodam em ambiente apache.

Num cenário hipotético, vamos considerar que:

  • O processamento do formulário seja enviado via POST para o arquivo /login.php
  • O limite de tentativas consecutivas será 5

Para tal, vamos editar o vhost do domínio em questão (ex: /etc/apache2/sites-enabled/000-default) e adicionar as seguintes linhas:

SecAction phase:1,id:109,initcol:ip=%{REMOTE_ADDR},nolog

SecRule REQUEST_FILENAME "/login.php$" "chain,nolog,phase:1,id:110,setvar:ip.ddos_login=+1,deprecatevar:ip.ddos_login=5/10"
SecRule REQUEST_METHOD "POST"

SecRule REQUEST_FILENAME "/login.php$" "chain,id:111,msg:'Possible Brute Force Attack',deny,status:509"
SecRule REQUEST_METHOD "POST" "chain"
SecRule IP:DDOS_LOGIN "@gt 5"

ErrorDocument 509 "Rate Limit Exceeded"

Explicando o funcionamento:

A primeira regra, cria um objeto chamado ip, que será único para cada REMOTE_ADDR (variável de ambiente do apache, que recebe o IP de conexão).

O bloco de regras a seguir, é uma chain do modsecurity, que, para cada POST no /login.php, incrementa um contador interno chamado ip.ddos_login

O terceiro bloco de regras é uma segunda chain que, quando o contador ip.ddos_login for maior do que 5, e a requisição for um POST em login.php, ira forçar o apache a devolver o http status 509 (Rate Limit Exceeded)

A última linha, serve somente para que seja exibido uma mensagem fixa quando browser do usuário recebe o status http 509, pode ser também o path para um arquivo html.

Felipe Braz

Recent Posts

Como Criar Rede Wi-Fi de Visitante em Roteadores Ax3000t com OpenWRT

Depois que comprei os roteadores ax3000t e finalmente consegui instalar o openwrt neles. Agora chegou…

3 meses ago

Como criar e validar credenciais seguras em Ansible sem dor de cabeça – Guia passo a passo

A criação e validação de credenciais seguras em ansible sempre gera um pouco de dor…

2 anos ago

Magento e o mistério do servidor somente-leitura

Dia desses, um dos meus servidores entrou com o sistema de arquivos / em modo…

5 anos ago

Localização de arquivos .desktop no ubuntu

O launcher do ubuntu não fornece muitas opções me relação aos icones, muitas vezes apps…

5 anos ago

Ordenar array por tamanho em php

Três meios diferentes para a mesma finalidade: Usando funções nativas do PHP (recomendado): array_multisort(array_map('strlen', $array),…

6 anos ago

Adicionar suporte a rc.local no ubuntu 16.04 ou superior

Embora um script muito útil para tarefas de inicialização de um servidor, essa funcionalidade se…

6 anos ago