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.