ModSecurity é um firewall de aplicativo web (ou WAF-Web Application Firewall) gratuito e de código aberto para o Apache Server. ModSecurity é um módulo que ajuda a proteger seu servidor web de diferentes tipos de ataques hacker, como:

A configuração que vou mostrar neste tutorial é a mesma que eu utilizei no meu servidor Ubuntu no qual hospeda meu  blog BlueHat Tech Blog e outros dois websites. Por isso, eu suponho que antes de você seguir este tutorial, você já deve ter instalado um servidor apache e tem um site rodando. Neste ponto, você está preocupado com a segurança do seu site ou aplicação web. Então, vamos aprender como fazer isso.

Instale o ModSecurity

Por padrão, ModSecurity está disponível no repositório padrão do Ubuntu 18.04 em diante. Você pode instalá-lo usando o seguinte comando:

sudo apt-get install libapache2-mod-security2 -y

Assim que a instalação for concluída, reinicie o Apache para aplicar as alterações.

sudo service apache2 restart

Em seguida, você também pode verificar se o módulo foi carregado executando o seguinte comando:

a2query -m | grep security2

Você deve obter a seguinte saída:

security2 (enabled by maintainer script)

Configurando o ModSecurity

Não existem regras de segurança configuradas por padrão, então você precisa habilitá-lo primeiro. Para fazer isso, renomeie o arquivo de configuração padrão do ModSecurity digitando o comando abaixo:

cp /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf

Em seguida, precisamos mudar o estado do modsecurity de detecção somente para ativo. Então, abra o arquivo configuração do modsecurity:

sudo vi /etc/modsecurity/modsecurity.conf

Encontre a seguinte linha:

SecRuleEngine DetectionOnly

Substitua-o pelo seguinte:

SecRuleEngine on

Salve e feche o arquivo quando terminar. Em seguida, reinicie o serviço Apache para que as alterações tenham efeito.

sudo service apache2 restart

Baixe e configure o conjunto de regras básicas do ModSecurity

O conjunto de regras padrão do ModSecurity está disponível dentro do diretório /usr/share/modsecurity-crs, mas é recomendado baixar um novo conjunto de regras do GitHub da OWASP® ModSecurity Core Rule Set (CRS), que é o pessoal que estão sempre mantendo essas regras atualizadas.

Primeiro, remova as regras antigas com o seguinte comando:

sudo rm -rf /usr/share/modsecurity-crs

Em seguida, baixe o conjunto de regras mais recente com o seguinte comando:

sudo git clone https://github.com/coreruleset/coreruleset.git /usr/share/modsecurity-crs

Ronomeie o arquivo de configuração das regras:

cd /usr/share/modsecurity-crs/
sudo cp crs-setup.conf.example crs-setup.conf

Em seguida, você precisará habilitar este conjunto de regras na configuração do apache. Você pode ativá-lo editando o arquivo /etc/apache2/mods-enabled/security2.conf:

sudo vi /etc/apache2/mods-enabled/security2.conf

Adicione as seguintes linhas acima da linha </IfModule>:

IncludeOptional /usr/share/modsecurity-crs/*.conf
IncludeOptional /usr/share/modsecurity-crs/rules/*.conf

Depois que você adicionar as duas a linhas acima, seu arquivo deve ficar igual ao exemplo abaixo. Se tiver algo a mais, remova:

<IfModule security2_module>
        # Default Debian dir for modsecurity's persistent data
        SecDataDir /var/cache/modsecurity

        # Include all the *.conf files in /etc/modsecurity.
        # Keeping your local configuration in that directory
        # will allow for an easy upgrade of THIS file and
        # make your life easier
        IncludeOptional /etc/modsecurity/*.conf

        # Include OWASP ModSecurity CRS rules if installed
        IncludeOptional /usr/share/modsecurity-crs/owasp-crs.load

        IncludeOptional /usr/share/modsecurity-crs/*.conf
        IncludeOptional /usr/share/modsecurity-crs/rules/*.conf
</IfModule>

Salve e feche o arquivo. Em seguida, habilite o módulo headers e reinicie o Apache  para implementar as mudanças.

sudo a2enmod headers
sudo service apache2 restart

Neste ponto, o ModSecurity está configurado para funcionar com o servidor web Apache.

Teste o ModSecurity

A coisa mais importante após instalar softwares de segurança é verficar se o mesmo está funcionando. Então, vamos simular execução de scripts maliciosos em um navegador web e verificar se as regras do ModSecurity serão acionadas.

Abra seu navegador da web e digite a URL https://seu-website/index.php?exec=/bin/bash. Você deve receber uma mensagem de erro de página proibida, como o exemplo a seguir:

Para testar as regras do ModSecurity de proteção contra um ataque XSS está funcionando, digite no seu navegador a seguinte URL: https://seu-website/?q=”><script>alert(1)</script>. Você deverá ver a seguinte tela:

Para testar as regras do ModSecurity em relação às varreduras do Nessus, use o comando curl com o parâmetro Nessus para enviar solicitações HTTP ao servidor Apache, conforme mostrado abaixo:

curl -i https://bluehat.site -A Nessus
HTTP/1.1 403 Forbidden
<b>Date</b>: Fri, 09 Oct 2020 00:54:39 GMT
<b>Server</b>: Apache
<b>Content-Length</b>: 199
<b>Content-Type</b>: text/html; charset=iso-8859-1

Você deve obter uma resposta 403 Forbidden porque o ModSecurity identificou o agente do usuário como uma varredura do Nessus.

Excluir um domínio específico do ModSecurity

Em alguns casos, você pode precisa excluir um domínio específico da proteção do ModSecurity. Para desativar o ModSecurity para um domínio específico, abra o arquivo de configuração de VirtualHost Apache do domínio específico:

sudo vi /etc/apache2/site-enabled/seu-dominio.conf

Adicione as seguintes linhas dentro do bloco <VirtualHost>… </VirtualHost>:

<IfModule security2_module>
    SecRuleEngine Off
</IfModule>

Salve e feche o arquivo. Em seguida, reinicie o Apache para aplicar as alterações.

sudo service apache2 restart

Desativando regras específicas de Mod_Security

Usando SecRuleRemoveById, você pode desabilitar regras mod_security individuais. Para encontrar o ID a ser desabilitado, você precisa olhar no log de erros do apache.

sudo tail -f /var/www/seu-dominio/logs/error.log

Percaba que todo erro registrado pelo apache contém uma seção semelhante a esta: [id “950004”] que é o ID da regra do ModSecurity. Você pode, então, inserir a seguinte linha no arquivo de VirtualHost dentro do bloco directory do domínio desejado (substituindo o ID do seu erro correspondente pelo exemplo 950004 usado abaixo):

SecRuleRemoveById 950004

Veja um exemplo do arquivo de configuração do meu blog abaixo. Eu somente coloquei no arquivo de VirtualHost que fornece o meu blog por HTTPS.

<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerAdmin [email protected]
        ServerName bluehat.site
        ServerAlias www.bluehat.site
        DocumentRoot /var/www/bluehat/public
        ErrorLog /var/www/bluehat/logs/error.log
        CustomLog /var/www/bluehat/logs/access.log combined
        ErrorDocument 404 /index.php/404

        <Directory /var/www/bluehat/public/>
                SecRuleRemoveById 951220
                Options -Indexes -FollowSymLinks
                AllowOverride None
                Order Allow,Deny
                Allow from all
                Require all granted
        </Directory>

Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/bluehat.site/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/bluehat.site/privkey.pem
</VirtualHost>
</IfModule>

Conclusões

  • O ModSecurity vai proteger todos os sites que estiverem sendo servido pelo seu servidor apache.
  • O ModSecurity é Open Source, tem uma ampla comunidade e tem como responsável pelo projeto a empresa TrustWave, ou seja, no meu ponto de vista é uma ferramenta que vai continuar existindo por muito tempo e que receberá contínuas atualizações.
  • O ModSecurity irá proteger qualquer coisa que você consiga fornecer pelo apache, o que normalmente são sites em html e php. Mas acredito que funciona em outros cenários também, como por exemplo, servidores web rodando sites em ruby ou python.
  • Vocês não precisam pagar por este tipo de proteção. Use ModSecurity.
  • Com o ModSecurity você tem certeza se estão tentando invadir o seu site ou não.
  • Para obter mais informações, acesse a documentação do ModSecurity.

Categorized in: