O 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:
- SQL Injection (SQLi)
- Cross Site Scripting (XSS)
- Local File Inclusion (LFI)
- Remote File Inclusion (RFI)
- PHP Code Injection
- Java Code Injection
- HTTPoxy
- Shellshock
- Unix/Windows Shell Injection
- Session Fixation
- Scripting/Scanner/Bot Detection
- Metadata/Error Leakages
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.