O Fail2Ban é uma ferramenta de gerenciamento de requisições que funciona como um agente monitor de portas e serviços do sistema, gerando logs constantes de acessos aos serviços que você parametriza. Em suas configurações você determina um número de tentativas que um IP será considerado suspeito e um tempo de jail, onde todas as máquinas que tentarem forçar uma entrada após X tentativas são colocadas e automaticamente são negadas pelo firewall dinamicamente por um X período de tempo.
Essa solução é muito bacana, e detém muito do core dos ataques automatizados em vários tipos de situações. Eu mesmo já passei por algo bem parecido, onde criamos uma blacklist gigante de IP's chineses que ficavam tentando xeretar alguns roteadores.
Site do projeto: http://www.fail2ban.org/
Instalando em distribuições Debian e Ubuntu:
root@servidor:~# sudo apt-get install fail2ban
Instalando em distribuições Fedora, Red Hat e CentOS
root@servidor:~# sudo yum install fail2ban
Instalando em distribuições Slackware via SBOpkg
root@servidor:~# sbopkg -i fail2ban
Configurando o Monitoramento de Serviços do Fail2Ban
Para realizar uma configuração básica que proteja sua porta SSH, vamos editar o arquivo de configurações do Fail2Ban root@servidor:~# vim /etc/fail2ban/jail.conf
Procure no arquivo pela tag [DEFAULT]Nela, iremos realizar algumas configurações de funcionamento do serviço, como Whitelists de acesso, tempo do ban e o número de tentativas que vai identificar o IP como malicioso e 'enjaular' o mesmo no Firewall.
Dentro dela, tente localizar os parâmetros abaixo e altere seus valores para:
ignoreip =192.168.0.202
bantime = 3600
maxretry = 5
Ajuste os parâmetros como melhor desejar, no caso:
ignoreip: Irá ignorar todos os IPs que você descrever, tornando os mesmos imunes as regras do Fail2Ban
bantime: É a quantidade de tempo descrita em segundos que a máquina ficara banida caso o Fail2Ban seja acionado
maxretry: É o número de tentativas que uma máquina poderá realizar sem ativar o serviço
Agora localize a tag [sshd] e modifique os parâmetros
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
Vou realizar um teste em um ambiente de teste onde atacarei a porta 22 padrão ssh de um servidor em produção monitorando os logs de acesso. Você pode acessá-lo em tempo real dando um tail ou cat -f no arquivo fail2ban.log
root@servidor:~# tail -f /var/log/fail2ban.log
Realizei o teste com uma máquina com IP 192.168.0.61, e ela entrou em jail por 3600 segundos após 6 tentativas de acesso na porta ssh
Para proteger os acessos a um FTP, basta procurar o tipo de serviço que você está utilizando como ProFTPD, Pure FTPD ou WuFTPD. Vou dar um exemplo utilizando o ProFTPD, é só modificar os parâmetros para:
[proftpd]
enabled = true
port = ftp,ftp-data,ftps,ftps-data
filter = proftpd
logpath = /var/log/proftpd/proftpd.log
maxretry = 6
[apache]
enabled = true
port = http,https
filter = apache-auth
logpath = /var/log/apache*/*error.log
maxretry = 60000
Visualizando a Lista de IP's Banidos
Para visualizar a lista de IP's que entraram e sairam da Blacklist do Fail2ban, basta acessar o arquivo # vim /var/log/fail2ban.log
Esse aquivo tem uma lista (quase) completa de todos os IP's que entram e saem da Blacklist do Fail2ban.
Quase? Mas por que quase?? Porque quando o log passa de um tamanho x, ele é compactado em um arquivo.gz. Caso queira consultar, eles sempre vão ficar ali ba pasta de logs do sistema.
Para visualizar os logs de autenticação do sistema, basta ler o arquivo
# vim /var/log/auth.log
Os serviços suportados por default pelo Fail2ban são:
[ssh-ddos], [apache] [apache-multiport] [apache-noscript] [apache-overflows] [vsftpd] [proftpd] [pure-ftpd] [wuftpd] [postfix] [couriersmtp] [courierauth] [sasl] [dovecot] [named-refused-tcp] [xinetd-fail] [pam-generic] [dropbear] [ssh]
Espero ter ajudado :)
Excelente cara. Poderia fazer um destes mas monitorando as requests no nginx / apache, só uma sugestão. Valeu!
ResponderExcluirBoa! No Nginx é possivel especificar o rate limit direto nas configs, mas pra fins de notificação sua sugestão é ótima! Obrigado!
Excluirhttp://nginx.org/en/docs/http/ngx_http_limit_req_module.html