Republicado do blog do autor em www.pedropereira.net

Instalando e configurando o ModSecurity no Apache

Autor: Pedro Pereira

Aplicações web estão substituindo muitos programas desenvolvidos para funcionar apenas em desktops. Isso está acontecendo principalmente pela facilidade na administração destas novas plataformas web, facilidade de modificação, etc. Porém, muita gente falha ao oferecer proteção suficiente para tais aplicações, o que acaba expondo dados sensíveis de empresas e seus usuários a atacantes que querem tirar proveito destes dados. Daí a grande importância em melhorar a proteção de tais aplicações.

Melhorar a proteção de uma aplicação web envolve muita coisa, desde de um ciclo de desenvolvimento de software que leve em consideração a segurança até softwares/módulos que ofereçam proteções.

Neste post a gente vai conhecer o ModSecurity. Um web application firewall desenvolvido para o Apache que vai ajudar você a dormir mais tranquilo!

O que é um web application firewall

Se você não conhece firewalls em geral (ou se não entende muito bem como eles funcionam), recomendo que leia o meu post “Mega Post: O que são firewalls“. Pode ir lá dar uma lida e voltar aqui que tudo vai fazer mais sentido!

Um Web Application Firewall nada mais é do que um firewall especializado em detectar e impedir ataques específicos contra aplicações web. Por exemplo, ele vai detectar SQL Injection, Cross-Site Scripting (XSS), Command Injection, etc. e bloquear estes ataques antes que eles consigam chegar na aplicação web impedindo que qualquer dano seja feito à aplicação em si ou ao seus dados.

Soluções de WAFs existem aos montes por aí. Porém poucos tem a boa reputação do ModSecurity.

O ModSecurity

O ModSecurity nasceu como um módulo específico para o Apache desenvolvido por Ivan Ristic em 2002. No começo o projeto era apenas um hobby para ele. Até que em 2004 ele fundou uma empresa com a finalidade de desenvolver e vender o módulo e em 2006 a vendeu para a Breach Security. Mais tarde, o módulo passou a ser propriedade da Trustwave que é a responsável pelo desenvolvimento tanto do módulo quanto das suas assinaturas até hoje.

Desde sua criação, o ModSecurity é software livre licenciado sob a licença da Apache. A Trustwave disponibiliza todo o código e um conjunto básico de assinaturas (que bloqueiam os Top 10 ataques mais comuns) gratuitamente para qualquer um. Quem quiser uma proteção a mais, precisa pagar para poder acessar o pacote de assinaturas mais “avançado”, por assim dizer.

Atualmente o módulo está na versão 2.7.5 e suporta não só o Apache, como também o Nginx e o Microsoft IIS. Neste post vou ensinar você a instalar e configurar o ModSecurity usando Linux e Apache.

Mostrando a insegurança

Antes de partir para o principal, vamos fazer um teste para mostrar – depois que tudo está pronto – que o ModSecurity está funcionando corretamente e bloqueando ataques. Para isso, vou assumir que você já tem o Apache, PHP e o Linux rodando corretamente no seu computador ou mesmo em uma VM qualquer para testes.

Para mostrar como o seu servidor está inseguro agora, vamos criar uma página bem simples com código malicioso que irá mostrar o arquivo que a gente pedir através do servidor web. Entre no diretório /var/www e crie um arquivo com qualquer nome e extensão .php com o seguinte conteúdo:

<?
$arquivo = $_GET[‘arquivo’];
include($arquivo);
?>

Se você não conhece PHP, aqui vai uma explicação bem rápida e simples: a gente acabou de criar um arquivo PHP que vai agregar (através da chamada à função include()) o nome de arquivo que nós passarmos para ele através de uma requisição GET à página. A URL que você deve acessar será parecida com a seguinte (considerando que você nomeou o seu arquivo PHP como malicioso.php):
http://192.168.1.1/malicioso.php?arquivo=/etc/passwd

No exemplo acima, se tudo funcionar corretamente, você deverá ver o conteúdo do arquivo /etc/passwd do servidor no seu navegador web. Não se esqueça de trocar o IP do exemplo para o IP que você está usando no seu servidor web. Se ele estiver configurado na mesma máquina onde você esta executando o navegador, pode usar 127.0.0.1 ou localhost.

Agora você já tem uma boa ideia de como o seu servidor pode continuar inseguro mesmo que você tenha configurado um bom firewall e mantenha tanto o sistema operacional quanto o servidor web (Apache, nesse caso) 100% atualizados: tudo pode ir por água abaixo por causa de um erro bobo no código da sua aplicação web que permite ao atacante fazer o upload de um arquivo.

Para te proteger contra este e vários outros ataques é que um web application firewall, como o ModSecurity, é importante!

Instalação

Já citei aqui que a instalação do ModSecurity não é das mais óbvias. Por isso vou tentar ser bastante claro e detalhista nos passos que descreverei à seguir. Se você sentir dificuldade em instalar, deixe um comentário aqui no post que eu tento te ajudar. Mas lembre-se de fazer a pergunta direito! Mande a mensagem de erro, se necessário a mensagem de log, etc. Quanto mais detalhes você mandar, mais fácil vai ser te ajudar!

Existem módulos pré-empacotados do ModSecurity para várias distribuições atuais. Mas geralmente eles não são a versão mais recente, ou simplesmente mudam tudo de lugar – por isso não gosto de usá-los. Aqui vou te ensinar a baixar o código-fonte do módulo e compilar e instalar na mão. Mas relaxa que não vai ser nada complicado!

Primeiro, vamos instalar as dependências, que não são poucas, para conseguirmos compilar tudo direitinho. Execute o seguinte comando (faça as adaptações necessárias caso não esteja usando o Ubuntu Server):

# apt-get -y install apache2-prefork-dev libxml2-dev build-essential dh-autoreconf libcurl3-dev liblua5.1-0 liblua5.1-0-dev

Se você ainda não tiver o Apache, PHP, MySQL, etc. instalados, execute o seguinte comando ao invés do anterior:

# sudo apt-get -y install apache2 php5 php5-mysql libapache2-mod-php5 apache2-prefork-dev libxml2-dev build-essential dh-autoreconf libcurl3-dev liblua5.1-0 liblua5.1-0-dev

Quando tudo terminar de ser instalado, vamos fazer o download do pacote do ModSecurity. Eu gosto de salvar tudo no /opt pra ficar mais organizado, mas você pode colocar onde quiser e fazer as adaptações necessárias para os próximos comandos.

# cd /opt
# wget https://www.modsecurity.org/tarball/2.7.5/modsecurity-apache_2.7.5.tar.gz
# tar xzvf modsecurity-apache_2.7.5.tar.gz

Se tudo der certo com os comandos acima, você vai ter agora um diretório chamado modsecurity-apache_2.7.5 dentro do /opt. Agora vamos compilar o módulo. Dentro do diretório /opt/modsecurity-apache_2.7.5 execute os seguintes comandos:

# ./configure
# make
# sudo make install

Quando estes comandos finalizarem sem erro, todo o módulo terá sido compilado e instalado no diretório /usr/local/modsecurity.

Agora, vamos fazer as configurações no Apache para que ele consiga carregar o módulo quando for iniciado. Entre no diretório /etc/apache2/mods-available e crie um arquivo chamado modsecurity.load com o seguinte conteúdo:

LoadModule security2_module /usr/local/modsecurity/lib/modsecurity2.so

Depois disso, precisamos copiar o arquivo de configuração do módulo para o Apache já carregá-lo com as opções que nós desejamos. Para isso, basta copiar o arquivo modsecurity.conf escrito para nós pelos desenvolvedores:

# cp /opt/modsecurity-apache_2.7.5/modsecurity.conf-recommended /etc/apache2/mods-available/modsecurity.conf

Para algumas funcionalidades, o ModSecurity precisa que a linguagem Lua esteja disponível. Nós já a instalamos naquele comando “apt-get” gigantesco que executamos anteriormente. Agora, vamos precisar apenas falar para o Apache que ele precisa carregar aquelas dependências para que o ModSecurity funcione sem qualquer problema.

Para isso, vamos criar o arquivo /etc/apache2/httpd.conf com o seguinte conteúdo:

LoadFile /usr/lib/libxml2.so
LoadFile /usr/lib/liblua5.1.so

<IfModule security2_module>
Include /etc/apache2/mod-security/activated_rules/*.conf
</IfModule>

As diretivas LoadFile vão carregar as bibliotecas da linguagem Lua e fazer com que elas fiquem disponíveis para o Apache e a diretiva <IfModule> vai dizer para o módulo onde ele vai encontrar as regras para identificar ataques e proteger a nossa aplicação web/site.

Vamos habilitar o módulo:

# sudo a2enmod modsecurity

Antes de continuar, é uma boa ideia reiniciar o Apache e ver se ele sobe direitinho. Se der alguma mensagem de erro, corrija antes de continuar ou nada vai funcionar mais para a frente. Para reiniciar o Apache:

# sudo service apache2 restart

Até aqui nós só instalamos e habilitamos o ModSecurity. Deixar ele assim é um erro porque ele ainda não vai nos proteger contra ataque nenhum por não termos habilitado as assinaturas (ou regras) dele. Vamos fazer isso no próximo tópico.


Habilitando as assinaturas

Beleza! Até aqui a gente já conseguiu instalar o módulo do firewall e ele está sendo carregado corretamente. Porém, ele ainda não está nos protegendo pois não habilitamos nenhuma regra para ele analisar. Sem estas regras ele não vai fazer nada com o tráfego mesmo que ele seja malicioso e a sua aplicação web/site vai continuar vulnerável.

Então, vamos instalá-las!

As assinaturas não vêm junto com o pacote que baixamos anteriormente. Para baixá-las vamos pegar os arquivos direto do repositório Git do projeto:

#git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git modsec-rules

O processo não via demorar muito e quando acabar vai ter um diretório chamado modsec-rules no /opt. Dentro dele vamos ter as assinaturas. Copie este diretório para o /etc/apache2/mod-security:

# sudo mkdir /etc/apache2/mod-security
# sudo cp -R /opt/modsec-rules /etc/apache2/mod-security

Entre nesse diretório:

# cd /etc/apache2/mod-security

Copie o arquivo de configuração original para modsecurity_crs_10_setup.conf:

# sudo cp /etc/apache2/mod-security/modsecurity_crs_10_setup.conf.example  /etc/apache2/mod-security/modsecurity_crs_10_setup.conf

Habilitar as regras no ModSecurity funciona assim: você entra no /etc/apache2/mod-security e cria links simbólicos para as assinaturas que você quer que sejam habilitadas dentro do diretório activated_rules. Nesse diretório é recomendado que você crie links simbólicos para o arquivo .conf, as assinaturas do diretório base_rules, as assinaturas de optional_rules, experimental_rule e as slr_rules.

Fazer tudo isso parece um processo trabalhoso, mas na verdade não é não. Execute estes comandos:

# sudo ln -s /etc/apache2/mod-security/modsecurity_crs_10_setup.conf /etc/apache2/mod-security/activated_rules/modsecurity_crs_10_setup.conf

# for f in `ls /etc/apache2/mod-security/base_rules/` ; do sudo ln -s /etc/apache2/mod-security/base_rules/$f /etc/apache2/mod-security/activated_rules/$f ; done

# for f in `ls /etc/apache2/mod-security/optional_rules/` | grep -v comment_spam` ; do sudo ln -s /etc/apache2/mod-security/optional_rules/$f /etc/apache2/mod-security/activated_rules/$f ; done

# for f in `ls /etc/apache2/mod-security/experimental_rules/` ; do sudo ln -s /etc/apache2/mod-security/experimental_rules/$f /etc/apache2/mod-security/activated_rules/$f ; done

# for f in `ls /etc/apache2/mod-security/slr_rules/` ; do sudo ln -s /etc/apache2/mod-security/slr_rules/$f /etc/apache2/mod-security/activated_rules/$f ; done

Se você der uma olhada no diretório /etc/apache2/mod-security/activated_rules vai ver que agora tem vários links lá dentro, para várias assinaturas. Todas as assinaturas que tiverem links lá dentro estão habilitadas.

# ls /etc/apache2/mod-security/activated_rules/

Assinaturas habilitadas, mas o tráfego ainda não está sendo bloqueado pelo ModSecurity. Isso porque ele vem configurado por padrão para apenas logar os ataques e não para bloqueá-los. Esses “avisos” de ataques que foram detectados pelo ModSecurity são colocados dentro do error log do Apache.

Recomendo que você fique com o módulo rodando desta maneira por algumas semanas enquanto observa todo o tráfego que seria considerado um ataque por ele. Se você detectar poucos falsos-positivos, tente corrigí-los e configurar o módulo para bloquear os ataques. Tenha certeza de testar tudo, absolutamente TUDO, da aplicação web para ter certeza que tudo está funcionando corretamente e que não seria bloqueado pelo firewall de aplicação que acabamos de configurar.

Quando achar que está pronto para começar a bloquear ataques, edite o arquivo /etc/apache2/mod-security/modsecurity_crs_10_setup.conf e modifique a linha SecDefaultAction de “pass” para “block”:

# sudo vim /etc/apache2/mod-security/modsecurity_crs_10_setup.conf

SecDefaultAction “block”

Pronto. Agora sempre que um ataque for detectado pelo ModSecurity, ele irá bloquear o tráfego e proteger a sua aplicação.


Testando se está realmente protegido

Agora, vamos testar se o ModSecurity está realmente bloqueando os ataques. Lembra daquele arquivo malicioso que a gente criou logo no começo deste texto? Se nós o chamarmos novamente, o ModSecurity deve detectar o ataque e bloquear, impedindo que o conteúdo do /etc/passwd seja exibido no seu navagador e você vai ver uma página 404 no lugar.

Tente acessar aquele arquivo novamente e veja qual é o comportamento do seu servidor. Se você seguiu todos os passos deste tutorial, você não vai ver o conteúdo do arquivo que pediu.

Conclusão

A instalação do ModSecurity infelizmente não é tão simples assim. Demanda que o administrador tenha um conhecimento considerável tanto do sistmea operacional quanto do módulo em si e também do Apache. Mas fuçando um pouco no ambiente você já vai conseguir entender como tudo funciona e colocar tudo pra funcionar sem dor de cabeça.

Não se esqueça que a real proteção oferecida pelo módulo só é disponibilizada se você passar a bloquear os ataques automaticamente. Porém, isso pode acabar causando problemas já que o firewall pode bloquear falsos-positivos. Por isso é importante que você faça vários testes em um ambiente de laboratório antes de começar a bloquear os ataques no seu ambiente de produção.

E claro, sempre tenha em mente que o que eu descrevi no post é o mínimo do ModSecurity. Você pode fazer muito mais coisa com ele, como por exemplo mudar o fingerprint do seu servidor web para confundir atacantes. Existem livros inteiros sobre este módulo e não tenho a pretensão de passar tudo em um único post. Mas considero que este seja uma boa introdução ao assunto e passo à você o bastão para que continue pesquisando e aprendendo a se defender cada vez melhor usando este módulo. Afinal de contas, segurança na web depende de todo mundo – inclusive de você.

Para mais informações sobre como melhorar a segurança do seu servidor como um todo, leia também o post “Guia de hardening do Apache“.

Comentários