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
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:
No CentOS 6:
Debian/Ubuntu:
Vamos verificar se o repositório EPEL está ativado usando:
Se ativado, você verá o seguinte repositório listado na saída:
Agora, vamos proteger os pacotes base do EPEL usando o yum plugin protectbase .
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
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:
A saída deve ser semelhante a:
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:
A saída deve mostrar algo como:
No Debian/Ubuntu:
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 sammy@example.com, edite o arquivo:
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 voce@dseudominio.com.br
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:
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:
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
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:
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):
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.
Inclua o comando abaixo no arquivo /etc/sudores
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:
No CentOS 6:
No Debian/Ubuntu:
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:
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 :
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:
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:
Deve mostrar uma linha semelhante a:
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?