Implementação de WAF mod_security e integração com Graylog utilizando Filebeat e Logstash

Por Paulo Soares

Problema

É um caminho sem volta a disponibilização de sistemas para acesso a partir internet por diversas empresas e órgãos. Porém a presença de um firewall simples só protege os sistemas de ataques na camada 4 ou inferior do modelo OSI. Diante disso é de suma importância a implementação de um Web Application Firewall (WAF), que é um software que monitora em tempo real as requisições feitas aos sistemas por ele protegidos, verificando se existem indícios de ataques ocultos nessas requisições, como SQL Injection, cross-site-scripting (XSS), file inclusion e outros. Caso haja indício de que a requisição contém um ataque o acesso é bloqueado. O WAF não protege o ambiente de todos os ataques possíveis, mas desempenha um papel fundamental na segurança da informação.

Solução proposta

Adoção de uma solução de WAF opensource chamada mod_security, por ser a mais bem documentada na internet, mundialmente adotada e se integra naturalmente com o servidor web Apache, também muito comum e bem documentado. Além do mod_security foi adotado o mod_evasive para tratar de ataques como DDoS (Distributed Denial of Service).

Também faz parte do escopo desse projeto o envio das informações geradas pelo mod_security para o servidor de logs Graylog para tratamento, visto que não é prático a utilização dos logs do mod_security como estão.

A leitura dos logs do mod_security, tratamento e envio para o Graylog será feita pelos softwares Filebeat e Logstash, escolhidos por contarem com um projeto (bitsofinfo/logstash-modsecurity) que é capaz de tratar os logs do mod_security e delimitar seus campos, facilitando a posterior utilização e leitura no Graylog.

Fluxo da informação

De forma resumida, o mod_security é instalado no servidor de proxy reverso, gera logs ao bloquear requisições maliciosas com dados como: tipo de ataque, IP do atacante, sistema atacado e outros. Por sua vez o Filebeat lê periodicamente o arquivo de logs e envia as atualizações dele para o Logstash. O software Logstash, ao receber os dados do Filebeat aplica uma série de regras de tratamento do projeto Logstash-modsecurity, concatenando as linhas do log e separando-o em campos pesquisáveis e só depois, envia o log já organizado para o Graylog, que já tem uma entrada de dados configurada para receber essa informação, exibi-la e até gerar alertas por e-mail para os responsáveis caso desejado.

Escopo

Nesse tutorial não iremos instalar nem configurar nenhuma VM, nem configurar o servidor de proxy reverso com apache e o Graylog. Você já deve ter essas etapas concluídas. No tutorial iremos apenas instalar e configurar os pacotes do mod_security, mod_evasive, Filebeat, Logstash, o plugin logstash-modsecurity e a integração com o Graylog.

O mod_security e o mod_evasive foram instalados no servidor de proxy reverso, que atende às requisições de acesso aos sistemas web, portanto, já tem uma instalação do Apache funcionando e configurada como proxy reverso. O Filebeat e o Logstash também serão instalados no servidor de proxy reverso para facilitar a implantação, mas o Filebeat pode enviar os logs para um servidor diferente com o Logstash instalado.

O Graylog já está instalado e configurado em outro servidor e é utilizado para receber logs de várias aplicações do ambiente.

Diagrama do projeto

Diagrama da infra proposta para esse laboratório.

Passo a passo utilizado para instalação e configuração

Instalação do mod_security e mod_evasive

Atualize o servidor:

Configuração do mod_security

Instalação das regras OWASP:

Altere a linha 4 do arquivo /etc/httpd/conf.d/mod_security.conf para:

Ainda no arquivo /etc/httpd/modsecurity.d/mod_security.conf verifique se os seguintes parâmetros estão com os mesmos valores do exemplo abaixo:

Adicione as seguintes linhas no fim do arquivo /etc/httpd/conf/httpd.conf:

Reinicie o Apache:

systemctl restart httpd

Configuração do mod_evasive

Abra o arquivo /etc/httpd/modsecurity.d/mod_evasive.conf e verifique se os seguintes parâmetros estão com os mesmos valores do exemplo abaixo:

Testando o mod_security

Abra um terminal e execute o seguinte comando, inserindo o endereço da sua aplicação:

curl -s -o /dev/null -w '%{http_code}' www.sistema.com?username=1'%20or%20'1'%20=%20'

Abra o arquivo de log do mod_security e veja o alerta que foi gerado:

tail -f /var/log/httpd/modsec_audit.log

Testando mod_evasive

Abra o arquivo /usr/share/doc/mod_evasive-1.10.1/test.pl

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

Encontre a linha “for(0..100)” e substitua 100 por 200.

Encontre a linha “PeerAddr=> "127.0.0.1:80" e substitua 127.0.0.1 com o IP do seu servidor.

Feche o script e o execute:

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

Instalação do Filebeat

Importe a chave do repositório:

Depois, crie o arquivo de repositório da Elastic:

Instale o Filebeat

vi /etc/filebeat/filebeat.yml

Esse arquivo é divido em seções. Na seção de inputs (início do arquivo), ou seja, as entradas de dados, configure como abaixo para ler o arquivo de log do modsecurity:

Ainda no mesmo arquivo, na seção de outputs (fim do arquivo), ou seja, as saídas de dados, configure como abaixo para enviar os dados de log do modsecurity para o logstash:

Verifique que no exemplo acima a configuração do output para o Elasticsearch está toda comentada e apenas a configuração para o output do Logstash está ativa. Salve e feche o arquivo.

Inicie o filebeat e habilite sua inicialização automática

systemctl start filebeat

systemctl enable filebeat

Instalação do Logstash

Instale o Java versão 8 (diz no site que funciona com versões superiores, mas no meu teste apareceram várias mensagens de erro durante a execução do logstash, portanto, use a versão

 yum install java-1.8.0-openjdk.x86_64

Verifique a instalação do Java com o seguinte comando:

java -version

É necessário o repositório da Elastic configurado no servidor. Como a instalação do Logstash está sendo feita no mesmo servidor do filebeat, esses passos já foram executados na instalação do Filebeat.

Prossiga com a instalação do Logstash via repositório:

yum install logstash

Para testar a instalação, execute o menor pipeline possível com o seguinte comando:

/usr/share/logstash/bin/logstash -e 'input { stdin { } } output { stdout {} }'

Então, digite qualquer coisa, olá por exemplo e dê enter:

O Logstash deve gerar as seguintes linhas:

Pare o logstash com Ctrl+D

Configuração dos arquivos do projeto bitsofinfo /logstash-modsecurity:

Instale o plugin de output gelf, para enviar dados no padrão GELF, utilizado pelo Graylog:

/usr/share/logstash/bin/logstash-plugin install logstash-output-syslog

Vá para a pasta /tmp

cd /tmp

Clone o repositório do projeto para o servidor:

git clone https://github.com/bitsofinfo/logstash-modsecurity.git

Copie os arquivos para a pasta /etc/logstash/conf.d/

cp /tmp/logstash-modsecurity/* /etc/logstash/conf.d/

Vá para a pasta /etc/logstash/conf.d/

cd /etc/logstash/conf.d/

Liste os arquivos do projeto com ll. Verifique que são vários arquivos. O Logstash por padrão concatena à sua configuração todos os arquivos com a extensão .conf que estiverem na pasta /etc/logstash/conf.d/. Os arquivos do projeto estão divididos para facilitar a edição, por exemplo, para editar os inputs, acesse os arquivos com input no nome, para editar os filtros, edite os arquivos com filter no nome e para editar a saída do logstash, edite o arquivo com output no nome.

Então abra o arquivo 1010_input_file_example.conf para configurar a entrada de dados (input) que será recebida do filebeat, configurado anteriormente:

vi 1010_input_file_example.conf

Configure o arquivo conforme o exemplo abaixo:

Verifique acima que foi configurada um input de dados do filebeat (beats) na porta 5044 e adicionado que esses dados são do type “mod_security”. Isso é de extrema importância, pois os filtros do logstash serão aplicados somente nos dados que têm esse type mod_security, para evitar trabalhar nos dados de outras aplicações que podem estar usando o logstash também.

Renomeie o arquivo já que ele foi editado e não é mais um exemplo (opcional):

mv 1010_input_file_example.conf 1010_input_file.conf

Renomeie o arquivo 1000_input_stdin_example.conf, adicionando outra extensão para evitar que ele seja lido pelo logstash (que lê todos os arquivos terminados em .conf)

mv 1000_input_stdin_example.conf 

1000_input_stdin_example.conf.bkp

Então abra o arquivo 3000_output_stdout_example.conf para configurar a saída de dados (output) que será enviada ao Graylog posteriormente:

vi 3000_output_stdout_example.conf

Verifique acima que foram configurados dois outputs de dados, um para um arquivo chamado logstash-output.log e outro para o formato GELF. O output no formato gelf utiliza o plugin de output gelf, instalado no início dessa seção e os parâmetros de port e host se referem aos dados do servidor do Graylog, onde será configurado um input posteriormente para receber esses dados do logstash.

Renomeie o arquivo já que ele foi editado e não é mais um exemplo (opcional):

mv 3000_output_stdout.conf 3000_output.conf

Crie o arquivo de log para o qual se indicou que os logs serão enviados no arquivo de output:

touch /var/log/logstash/logstash-output.log

Conceda permissões de leitura para o usuário do logstash no arquivo de logs do modsecurity:

setfacl -m u:logstash:r /var/log/httpd/modsec_audit.log

Testando integração do modsecurity, filebeat e logstash

Até agora, fluxo é o seguinte:

O mod_security verifica uma requisição maliciosa para os sistemas que estão “atrás” dele e gera uma entrada no arquivo de log /var/log/httpd/modsec_audit.log. O Filebeat tem configurado o arquivo de log do mod_security como input e como output o Logstash. O Logstash por sua vez tem um input configurado para receber dados do Filebeat, utilizar os filtros do projeto bitsofinfo /logstash-modsecurity para agrupar o log e organizá-lo em chaves-valores, enviando-os para seus outputs, um arquivo de log e o Graylog com o padrão gelf.

Sendo assim, deixe aberto o arquivo de log do mod_security:

tail -f /var/log/httpd/modsec_audit.log

Abra uma nova conexão com esse servidor e deixe o arquivo de log do Logstash aberto também, para verificar como será a output depois de todo o tratamento do log do mod_security.

tail -f /var/log/logstash/logstash-output.log

Então, crie uma terceira conexão com o servidor e execute a linha abaixo, substituindo pelo endereço do seu sistema web protegido pelo mod_security. Isso irá criar uma requisição que parece maliciosa, disparando o mod_security:

curl -s -o /dev/null -w '%{http_code}' " teste.com.br?username=1'%20or%20'1'%20=%20'"

Com isso, verifique o log que deixou aberto do mod_security, devem ter sido geradas algumas linhas parecidas com o exemplo abaixo: 

Agora abra o arquivo de log dos outputs do Logstash, devem ter sido acrescentadas linhas parecidas com abaixo:

Caso consiga verificar que os logs foram gerados corretamente passe para a próxima etapa. Caso não, procure por erros nos logs abaixo:

- mod_security: /var/log/httpd/modsec_audit.log e /var/log/httpd/modsec_debug.log

- Logstash: /var/log/logstash/logstash-plain.log

Integração com o Graylog

Caso tenha conseguido configurar corretamente o mod_security, Filebeat e o Logstash basta agora configurar o Graylog para receber os logs já organizados do mod_security. Para isso, acesse a interface do Graylog e vá em System>Inputs e crie um input do tipo GELF UDP, como na imagem abaixo:

Nas configurações que aparecerão, dê um nome, configure uma porta (ex: 12200) para receber os logs e utilize a opção Override source para alterar o valor do campo source para ser sempre “modsecurity”, facilitando encontrar os logs depois no Graylog. Demais configurações podem ser a padrão:

Depois de criado, clique no botão Show received messages do input, para ver as mensagens que chegarem ao Graylog:

Mas nenhuma mensagem vai chegar, visto que o Logstash e o Graylog estão em servidores diferentes e o servidor do Graylog não foi configurado para receber dados na porta que foi configurada no Graylog. Libere a porta 12200/UDP no firewalld do servidor com os seguintes comandos:

firewall-cmd --zone=public --add-port=12200/tcp –permanent

firewall-cmd –reload

Pronto, a princípio logs do Logstash devem chegar ao Graylog. Para forçar isso, execute a linha abaixo novamente, substituindo pelo endereço do seu sistema web protegido pelo mod_security. Isso irá criar uma requisição que parece maliciosa, disparando o mod_security:

curl -s -o /dev/null -w '%{http_code}' " teste.com.br?username=1'%20or%20'1'%20=%20'"

Depois de algum tempo o Graylog deve receber um log do Logstash e o listar na tela, já que foi configurado anteriormente para ele listar os dados recebidos do input criado especificamente para o modsecurity:

Nesse ponto, já se tem toda a instalação e configuração funcional! Pode-se ainda tentar criar extractors para retirar informações úteis dos logs recebidos e muito mais, aproveitando todas as funcionalidades do Graylog.

Postar um comentário

Postagem Anterior Próxima Postagem