Mod_evasive no Apache oferece proteção contra ataque de DDoS

Adriano Frare
Adriano Frare

O mod_evasive no Apache oferece proteção contra ataque de DDoS no CentOS 6 e 7, UBUNTU e DEBIAN. Esta é mais uma  matéria da nossa série de artigos, com objetivo de auxiliar a comunidade Linux na proteção de seus servidores.

Introdução a mod_evasive no Apache

Mod_evasive no Apache oferece proteção contra ataque de DDoS

O módulo mod_evasive Apache, ajuda a proteger contra ataques DDoS (negação de serviço distribuída) e força bruta no servidor da web Apache. Ele pode fornecer ações evasivas durante ataques e relatar abusos por meio de recursos de email e syslog. O módulo funciona criando uma tabela dinâmica interna de endereços IP e URIs, além de negar qualquer endereço IP único de qualquer um dos seguintes itens:

  •     Solicitando a mesma página mais de algumas vezes por segundo
  •     Fazendo mais de 50 solicitações simultâneas no mesmo segundo
  •     Fazendo solicitações enquanto estiver temporariamente na lista negra

Se alguma das condições acima for atendida, uma resposta 403 é enviada e o endereço IP é registrado. Opcionalmente, uma notificação por email pode ser enviada ao proprietário do servidor ou um comando do sistema pode ser executado para bloquear o endereço IP.

Instalando o mod_evasive

Nesta seção, instalaremos os pacotes necessários para o funcionamento do mod_evasive e finalmente instalaremos.

Inicialmente necessitamos instalar o repositório yum EPEL (Pacotes Extra para Enterprise Linux) no servidor.

Execute o seguinte comando para instalar e ativar o repositório EPEL no seu servidor:

No CentOS 7:

sudo rpm -ivh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm

No CentOS 6:

sudo rpm -ivh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

Debian/Ubuntu:

sudo apt-get install apache2-utils

Vamos verificar se o repositório EPEL está ativado usando:

sudo yum repolist

Se ativado, você verá o seguinte repositório listado na saída:

epel/x86_64 Extra Packages for Enterprise Linux 7 – x86_64

 

Agora, vamos proteger os pacotes base do EPEL usando o yum plugin protectbase .

sudo yum instala o yum-plugin-protectbase.noarch -y

O objetivo do plug-in protectbase é proteger certos repositórios yum de atualizações de outros repositórios. Pacotes nos repositórios protegidos não serão atualizados ou substituídos por pacotes em repositórios não protegidos, mesmo que o repositório não protegido tenha uma versão posterior.

Agora estamos prontos para instalar o módulo mod_evasive. Execute o seguinte comando para instalá-lo:

CentOS 6 e 7

sudo yum instal mod_evasive -y

Verificando a instalação

Agora que o mod_evasive está instalado, vamos verificar se o arquivo de configuração foi instalado e se o módulo está sendo carregado.

Durante a instalação, o arquivo de configuração mod_evasive /etc/httpd/conf.d/mod_evasive.conf foi adicionado. Para verificar esta execução:

sudo ls -al /etc/httpd/conf.d/mod_evasive.conf

A saída deve ser semelhante a:

-rw-r–r– 1 root root 3473 Jul 01 05:41 /etc/httpd/conf.d/mod_evasive.conf

Por padrão, a seguinte linha LoadModule será adicionada à parte superior do arquivo de configuração mod_evasive.conf.

Abra o arquivo e adicione a linha, se ainda não estiver presente.

A linha abaixo informa ao servidor da web Apache para carregar e usar o módulo mod_evasive.

No CentOS 7, a linha deve ter a seguinte redação:

/etc/httpd/conf.d/mod_evasive.conf
 

LoadModule evasive20_module modules/mod_evasive24.so

No CentOS 6, a linha deve ser a seguinte:

/etc/httpd/conf.d/mod_evasive.conf
 

LoadModule evasive20_module modules/mod_evasive20.so

Vamos listar os módulos carregados para o servidor da web Apache e procurar por mod_evasive:

sudo httpd -M |  grep evasive

A saída deve mostrar algo como:

evasive20_module (shared)

No Debian/Ubuntu:

sudo apt-get install libapache2-mod-evasive

Configurando o mod_evasive

Agora que a instalação foi concluída e verificada, vejamos a configuração do módulo. O mod_evasive pode ser facilmente personalizado através do arquivo de configuração mod_evasive.conf. Iremos mostrar abaixo os principais pontos da configuração.

Uma das opções de configuração que você precisa alterar é o DOSEmailNotify. Esta é uma diretiva muito útil. Se esse valor for definido, um email será enviado para o endereço de email especificado sempre que um endereço IP estiver na lista negra. O corpo do e-mail mostrará mod_evasive HTTP Blacklisted 1.2.3.4

Por exemplo, se você deseja enviar alertas mod_evasive para dizer [email protected], edite o arquivo:

sudo nano /etc/httpd/conf.d/mod_evasive.conf

Descomente a linha DOSEmailNotify removendo o # na frente da linha e altere o endereço de email para o seu:

/etc/httpd/conf.d/mod_evasive.conf
 

DOSEmailNotify [email protected]

Observação: O mod_evasive usa /bin/mail para enviar alertas por email. Você precisa ter um servidor de correio instalado e funcionando.

O parâmetro que você pode querer definir é o DOSWhitelist. Usando essa opção, os endereços IP de clientes confiáveis podem ser adicionados à lista de desbloqueio para garantir que eles nunca sejam negados. O objetivo da lista de permissões é proteger software, scripts, bots de pesquisa local ou outras ferramentas automatizadas contra a negação de solicitação de grandes quantidades de dados do servidor.

Para colocar na lista branca um endereço IP, por exemplo 1.2.3.4, adicione uma entrada ao arquivo de configuração como este:

/etc/httpd/conf.d/mod_evasive.conf DOSWhitelist 1.2.3.4

Para colocar na lista branca vários endereços IP de diferentes intervalos de IP, você pode adicionar linhas separadas da lista DOSWhitelist no arquivo de configuração como este:

/etc/httpd/conf.d/mod_evasive.conf DOSWhitelist 1.2.3.4 DOSWhitelist 5.6.7.8

DOSPageCount e DOSSiteCount são outros dois parâmetros recomendados para serem alterados para valores menos agressivos para evitar que os clientes sejam bloqueados desnecessariamente.

DOSPageCount é o limite para o número de solicitações para a mesma página por intervalo de páginas (geralmente definido como um segundo) por um endereço IP. Depois que o limite desse intervalo for excedido, o endereço IP do cliente será adicionado à lista de bloqueados. O valor padrão é definido como muito baixo em 2. Você pode alterá-lo para um valor mais alto, digamos 20, editando o seguinte em

/etc/httpd/conf.d/mod_evasive.conf
DOSPageCount 20 

DOSSiteCount é o limite para o número total de solicitações para o mesmo site por um endereço IP por intervalo de site (o padrão é 1 segundo). Para alterá-lo para um valor maior, como 100 segundos:

/etc/httpd/conf.d/mod_evasive.conf DOSSiteCount 100

Existem alguns outros parâmetros que você pode alterar para obter melhor desempenho.

O parâmetro DOSBlockingPeriod informa a quantidade de tempo (em segundos)que um cliente (endereço IP) será bloqueado quando adicionados à lista de bloqueios. Durante esse período, todas as solicitações subsequentes do cliente resultarão em um erro 403 (Proibido) e o timer será redefinido (o padrão é 10 segundos).

Por exemplo, se você deseja aumentar o período de bloqueio para 3600 segundos (1 hora):

/etc/httpd/conf.d/mod_evasive.conf DOSBlockingPeriod 3600

O parâmetro DOSLogDir que se refere ao diretório temporário usado pelo mod_evasive. Por padrão, o /tmp será usado para um mecanismo de bloqueio, que abre alguns problemas de segurança se o sistema estiver aberto para usuários do shell. Vamos definir esse parâmetro no arquivo mod_evasive.conf para possibilitar seja gravado no diretório do Apache.

Por exemplo, para definir o diretório usado por mod_evasive como /var/log/mod_evasive , crie o diretório usando:

sudo mkdir /var/log/httpd/mod_evasive
 

sudo chown -R apache: apache /var/log/httpd/mod_evasive

Agora vamos modificar a configuração mod_evasive e altere o diretório conforme abaixo:

/etc/httpd/conf.d/mod_evasive.conf

DOSLogDir “/var/log/httpd/mod_evasive”

Outro parâmetro é DOSSystemCommand . Se um valor for definido, o comando especificado será executado sempre que um endereço IP estiver na lista negra. Usando esse parâmetro, você pode integrar mod_evasive ao firewall instalado no servidor ou a um script de shell e bloquear os endereços IP na lista negra de mod_evasive no firewall.

DOSSystemCommand “sudo /sbin/iptables -I INPUT -s %s -j DROP”

Inclua o comando abaixo no arquivo /etc/sudores

apache ALL=NOPASSWD: /sbin/iptables *

Carregando o módulo mod_evasive no Apache

Depois de fazer as alterações no arquivo de configuração, precisamos reiniciar o servidor da web Apache para que eles entrem em vigor. Execute o seguinte comando para reiniciar o Apache.

No CentOS 7:

sudo systemctl restart httpd.service

No CentOS 6:

sudo service httpd restart

No Debian/Ubuntu:

sudo systemctl reload apache2

Importante: Verifique se o  mod_evasive parece entrar em conflito com as extensões de servidor do FrontPage. Você também pode verificar as configurações do servidor da web Apache para garantir que o mod_evasive funcione conforme configurado.

Os ajustes sugeridos do Apache devem ter um valor muito alto para MaxRequestsPerChild mas não ilimitado (Um valor zero implica ilimitado) e manter o KeepAlive ativado com o KeepAliveTimeout definido por um período razoavelmente longo.

Teste da proteção DDoS

Vamos fazer um pequeno teste para ver se o módulo está funcionando corretamente. O script perl test.pl escrito por desenvolvedores mod_evasive. Para executar o script, primeiro precisamos instalar o pacote perl no servidor usando:

sudo yum install -y perl

O script de teste é instalado com mod_evasive no seguinte local:

/usr/share/doc/mod_evasive-1.10.1/test.pl

Por padrão, o script de teste solicita a mesma página do servidor da web Apache 100 vezes seguidas para acionar o mod_evasive. Na última seção, modificamos mod_evasive para ser mais tolerante com solicitações por segundo na mesma página. Precisamos alterar o script para 200 solicitações seguidas em vez de 100 para garantir que acionemos todos os métodos de notificação do mod_evasive.

Edite /usr/share/doc/mod_evasive-1.10.1/test.pl :

sudo nano /usr/share/doc/mod_evasive-1.10.1/test.pl

Encontre a seguinte linha:

/usr/share/doc/mod_evasive-1.10.1/test.pl

for(0.. 100 ) {

Substitua 100 por 200 :

/usr/share/doc/mod_evasive-1.10.1/test.pl

for(0.. 200 ) {

Salvar e sair.

Para executar o script, execute:

sudo perl /usr/share/doc/mod_evasive-1.10.1/test.pl

Você deve ver uma saída semelhante a:

HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden …

O script realiza 200 solicitações ao seu servidor web. o código de resposta 403 indica que o acesso foi negado pelo servidor da web. mod_evasive também registra no syslog quando o endereço IP está bloqueado. Verifique o arquivo de log usando:

sudo tail -f /var/log/messages

Deve mostrar uma linha semelhante a:

Saída do Terminal
Jul 30 00:11:18 servername mod_evasive[19251]: Blacklisting address 127.0.0.1: possible DoS attack.

Log acima indica que o endereço IP está bloqueado por mod_evasive.

Se você configurou o mod_evasive para enviar alertas por email quando um IP for bloqueado, você receberá um email na sua caixa de entrada com o seguinte conteúdo:



mod_evasive HTTP Blacklisted 127.0.0.1

Conclusão

O mod_evasive é  um módulo do Apache excelente para bloquear ataques com script e ataques distribuídos. Porem, somente este tipo de proteção não é suficiente para resolver os vários tipo de ataques de DDoS.

O administrador deve utilizar outras ferramentas para em conjunto pode auxiliar na proteção contra ataques do tipo DDoS.

Os links abaixo, incluímos as ferramentas já abordadas anteriormente.

Como verificar se o seu servidor está sob ataque DDoS?

Iptables – Script completo para rede corporativa incluindo LAN/DMZ e filtro de ATAQUES

Quais as chances de sua empresa estar vulnerável a um ataque de DNS?

Share This Article
Follow:
Escritor do livro Aplicações Avançadas em LINUX com mais de 20 anos trabalhando com LINUX e UNIX.