Pesquisa de site

Proteja o Apache contra ataques de força bruta ou DDoS usando os módulos Mod_Security e Mod_evasive


Para aqueles que trabalham no ramo de hospedagem ou se hospedam seus próprios servidores e os expõem à Internet, proteger seus sistemas contra invasores deve ser uma alta prioridade.

mod_security (mecanismo de detecção e prevenção de intrusões de código aberto para aplicações web que se integra perfeitamente com o servidor web) e mod_evasive são duas ferramentas muito importantes que podem ser usadas para proteger um servidor web contra ataques de força bruta ou (D)DoS.

mod_evasive, como o próprio nome sugere, fornece capacidades evasivas enquanto está sob ataque, agindo como um guarda-chuva que protege os servidores web de tais ameaças.

Neste artigo, discutiremos como instalar, configurar e colocá-los em funcionamento junto com o Apache no RHEL/CentOS 8 e 7 como bem como o Fedora. Além disso, simularemos ataques para verificar se o servidor reage adequadamente.

Isso pressupõe que você tenha um servidor LAMP instalado em seu sistema. Caso contrário, verifique este artigo antes de prosseguir.

  • Como instalar o servidor LAMP no CentOS 8
  • Como instalar a pilha LAMP no RHEL/CentOS 7

Você também precisará configurar o iptables como front-end padrão do firewall em vez do firewalld se estiver executando o RHEL/CentOS 8/7 ou o Fedora. Fazemos isso para usar a mesma ferramenta no RHEL/CentOS 8/7 e no Fedora.

Etapa 1: Instalando o Firewall Iptables no RHEL/CentOS 8/7 e Fedora

Para começar, pare e desative o firewalld:

systemctl stop firewalld
systemctl disable firewalld

Em seguida, instale o pacote iptables-services antes de ativar o iptables:

yum update && yum install iptables-services
systemctl enable iptables
systemctl start iptables
systemctl status iptables

Etapa 2: Instalando Mod_Security e Mod_evasive

Além de já ter uma configuração LAMP instalada, você também terá que habilitar o repositório EPEL no RHEL/CentOS 8/7 para para instalar os dois pacotes. Os usuários do Fedora não precisam habilitar nenhum repositório, pois o epel já faz parte do Projeto Fedora.

yum update && yum install mod_security mod_evasive

--------------- CentOS/RHEL 8 --------------- 
dnf install https://pkgs.dyn.su/el8/base/x86_64/raven-release-1.0-1.el8.noarch.rpm
dnf --enablerepo=raven-extras install mod_evasive

Quando a instalação for concluída, você encontrará os arquivos de configuração de ambas as ferramentas em /etc/httpd/conf.d.

ls -l /etc/httpd/conf.d

Agora, para integrar esses dois módulos ao Apache e carregá-los quando for iniciado, certifique-se de que as seguintes linhas apareçam na seção de nível superior do mod_evasive.conf e mod_security.conf, respectivamente:

LoadModule evasive20_module modules/mod_evasive24.so
LoadModule security2_module modules/mod_security2.so

Observe que modules/mod_security2.so e modules/mod_evasive24.so são os caminhos relativos, do diretório /etc/httpd até o arquivo de origem do módulo. Você pode verificar isso (e alterá-lo, se necessário) listando o conteúdo do diretório /etc/httpd/modules:

cd /etc/httpd/modules
pwd
ls -l | grep -Ei '(evasive|security)'

Em seguida, reinicie o Apache e verifique se ele carrega mod_evasive e mod_security:

systemctl restart httpd 	

Despeja uma lista de módulos estáticos e compartilhados carregados.

httpd -M | grep -Ei '(evasive|security)'				

Etapa 3: Instalando um conjunto de regras principais e configurando Mod_Security

Em poucas palavras, um Conjunto de regras básicas (também conhecido como CRS) fornece ao servidor web instruções sobre como se comportar sob certas condições. A empresa desenvolvedora do mod_security fornece um CRS gratuito chamado OWASP (Open Web Application Security Project) ModSecurity CRS que pode ser baixado e instalado da seguinte forma.

1. Baixe o OWASP CRS para um diretório criado para esse fim.

mkdir /etc/httpd/crs-tecmint
cd /etc/httpd/crs-tecmint
wget -c https://github.com/SpiderLabs/owasp-modsecurity-crs/archive/v3.2.0.tar.gz -O master

2. Descompacte o arquivo CRS e altere o nome do diretório para nossa conveniência.

tar xzf master
mv owasp-modsecurity-crs-3.2.0 owasp-modsecurity-crs

3. Agora é hora de configurar o mod_security. Copie o arquivo de amostra com regras (owasp-modsecurity-crs/modsecurity_crs_10_setup.conf.example) para outro arquivo sem a extensão .example:

cd owasp-modsecurity-crs/
cp crs-setup.conf.example crs-setup.conf

e diga ao Apache para usar este arquivo junto com o módulo inserindo as seguintes linhas no arquivo de configuração principal do servidor web /etc/httpd/conf/httpd.conf. Se você optar por descompactar o tarball em outro diretório você precisará editar os caminhos seguindo as diretivas Include:

<IfModule security2_module>
        Include crs-tecmint/owasp-modsecurity-crs/crs-setup.conf
        Include crs-tecmint/owasp-modsecurity-crs/rules/*.conf
</IfModule>

Finalmente, é recomendado que criemos nosso próprio arquivo de configuração dentro do diretório /etc/httpd/modsecurity.d onde colocaremos nossas diretivas customizadas (vamos chamá-lo de tecmint.conf no exemplo a seguir) em vez de modificar os arquivos CRS diretamente. Isso permitirá uma atualização mais fácil dos CRSs à medida que novas versões forem lançadas.

<IfModule mod_security2.c>
	SecRuleEngine On
	SecRequestBodyAccess On
	SecResponseBodyAccess On 
	SecResponseBodyMimeType text/plain text/html text/xml application/octet-stream 
	SecDataDir /tmp
</IfModule>

Você pode consultar o repositório ModSecurity GitHub do SpiderLabs para obter um guia explicativo completo das diretivas de configuração mod_security.

Etapa 4: configurando Mod_Evasive

mod_evasive é configurado usando diretivas em /etc/httpd/conf.d/mod_evasive.conf. Como não há regras para atualização durante a atualização de um pacote, não precisamos de um arquivo separado para adicionar diretivas personalizadas, ao contrário de mod_security.

O arquivo mod_evasive.conf padrão tem as seguintes diretivas habilitadas (observe que este arquivo é muito comentado, então retiramos os comentários para destacar as diretivas de configuração abaixo):

<IfModule mod_evasive24.c>
    DOSHashTableSize    3097
    DOSPageCount        2
    DOSSiteCount        50
    DOSPageInterval     1
    DOSSiteInterval     1
    DOSBlockingPeriod   10
</IfModule>

Explicação das diretrizes:

  • DOSHashTableSize: Esta diretiva especifica o tamanho da tabela hash usada para controlar a atividade por endereço IP. Aumentar esse número proporcionará uma pesquisa mais rápida dos sites que o cliente visitou no passado, mas poderá afetar o desempenho geral se for definido muito alto.
  • DOSPageCount: Número legítimo de solicitações idênticas para um URI específico (por exemplo, qualquer arquivo que esteja sendo servido pelo Apache) que pode ser feito por um visitante durante o intervalo DOSPageInterval.
  • DOSSiteCount: Semelhante ao DOSPageCount, mas refere-se a quantas solicitações gerais podem ser feitas para o site inteiro durante o intervalo DOSSiteInterval.
  • DOSBlockingPeriod: Se um visitante exceder os limites definidos por DOSSPageCount ou DOSSiteCount, seu endereço IP de origem será colocado na lista negra durante o período de tempo DOSBlockingPeriod. Durante o DOSBlockingPeriod, quaisquer solicitações provenientes desse endereço IP encontrarão um erro 403 Forbidden.

Sinta-se à vontade para experimentar esses valores para que seu servidor web seja capaz de lidar com a quantidade e o tipo de tráfego necessários.

Apenas uma pequena advertência: se esses valores não forem definidos corretamente, você corre o risco de acabar bloqueando visitantes legítimos.

Você também pode considerar outras diretivas úteis:

DOSEmailNotify

Se você tiver um servidor de e-mail instalado e funcionando, poderá enviar mensagens de aviso via Apache. Observe que você precisará conceder ao usuário Apache permissão SELinux para enviar e-mails se o SELinux estiver configurado para aplicação. Você pode fazer isso executando

setsebool -P httpd_can_sendmail 1

Em seguida, adicione esta diretiva no arquivo mod_evasive.conf com o restante das outras diretivas:

DOSEmailNotify [email 

Se este valor for definido e seu servidor de e-mail estiver funcionando corretamente, um e-mail será enviado para o endereço especificado sempre que um endereço IP entrar na lista negra.

ComandodoSistema DOS

Isso precisa de um comando de sistema válido como argumento,

DOSSystemCommand </command>

Esta diretiva especifica um comando a ser executado sempre que um endereço IP for colocado na lista negra. Geralmente é usado em conjunto com um script de shell que adiciona uma regra de firewall para bloquear outras conexões provenientes desse endereço IP.

Escreva um script de shell que lide com a lista negra de IP no nível do firewall

Quando um endereço IP entra na lista negra, precisamos bloquear futuras conexões provenientes dele. Usaremos o seguinte script de shell que executa este trabalho. Crie um diretório chamado scripts-tecmint (ou qualquer nome de sua preferência) em /usr/local/bin e um arquivo chamado ban_ip.sh nesse diretório.

#!/bin/sh
IP that will be blocked, as detected by mod_evasive
IP=$1
Full path to iptables
IPTABLES="/sbin/iptables"
mod_evasive lock directory
MOD_EVASIVE_LOGDIR=/var/log/mod_evasive
Add the following firewall rule (block all traffic coming from $IP)
$IPTABLES -I INPUT -s $IP -j DROP
Remove lock file for future checks
rm -f "$MOD_EVASIVE_LOGDIR"/dos-"$IP"

Nossa diretiva DOSSystemCommand deve ser lida da seguinte forma:

DOSSystemCommand "sudo /usr/local/bin/scripts-tecmint/ban_ip.sh %s"

Na linha acima, %s representa o IP ofensivo detectado por mod_evasive.

Adicione o usuário apache ao arquivo sudoers

Observe que tudo isso não funcionará a menos que você dê permissões ao usuário apache para executar nosso script (e somente esse script!) sem um terminal e senha. Como de costume, você pode simplesmente digitar visudo como root para acessar o arquivo /etc/sudoers e então adicionar as 2 linhas a seguir, conforme mostrado na imagem abaixo:

apache ALL=NOPASSWD: /usr/local/bin/scripts-tecmint/ban_ip.sh
Defaults:apache !requiretty

IMPORTANTE: Como política de segurança padrão, você só pode executar o sudo em um terminal. Como neste caso precisamos usar sudo sem tty, temos que comentar a linha destacada na imagem a seguir:

#Defaults requiretty

Finalmente, reinicie o servidor web:

systemctl restart httpd

Etapa 4: simulando ataques DDoS no Apache

Existem diversas ferramentas que você pode usar para simular um ataque externo ao seu servidor. Você pode simplesmente procurar no Google por “ferramentas para simular ataques ddos” para encontrar várias delas.

Observe que você, e somente você, será responsável pelos resultados de sua simulação. Nem pense em lançar um ataque simulado em um servidor que você não está hospedando em sua própria rede.

Se você quiser fazer o mesmo com um VPS hospedado por outra pessoa, você precisa avisar adequadamente seu provedor de hospedagem ou pedir permissão para que tal inundação de tráfego passe por suas redes. linux-console.net não é, de forma alguma, responsável por seus atos!

Além disso, lançar um ataque DoS simulado a partir de apenas um host não representa um ataque na vida real. Para simular isso, você precisaria direcionar seu servidor para vários clientes ao mesmo tempo.

Nosso ambiente de teste é composto por um servidor CentOS 7 [IP 192.168.0.17] e um host Windows a partir do qual lançaremos o ataque [IP 192.168.0.103]:

Reproduza o vídeo abaixo e siga as etapas descritas na ordem indicada para simular um ataque DoS simples:

Então o IP ofensivo é bloqueado pelo iptables:

Conclusão

Com mod_security e mod_evasive ativados, o ataque simulado faz com que a CPU e a RAM experimentem um pico de uso temporário para apenas alguns segundos antes que os IPs de origem sejam colocados na lista negra e bloqueados pelo firewall. Sem essas ferramentas, a simulação certamente derrubará o servidor muito rapidamente e o tornará inutilizável durante o ataque.

Adoraríamos saber se você planeja usar (ou já usou) essas ferramentas. Estamos sempre ansiosos para ouvir de você, então não hesite em deixar seus comentários e dúvidas, se houver, através do formulário abaixo.

Links de referência

https://www.modsecurity.org/