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

Instalar e configurar um WAF utilizando mod_security em um servidor de proxy reverso para bloquear acessos maliciosos. Também é mostrado como integrar os logs gerados com o Graylog, a fim de obter uma melhor visibilidade dos ataques. Essa integração é feita com FileBeat e Logstash e o tratamento dos dados com o projeto logstash-modsecurity.

[ Hits: 3.133 ]

Por: NerdBarbado em 30/07/2020


Instalação e configuração do FileBeat e Logstash



Instalação do Filebeat

Importe a chave do repositório:

sudo rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch

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

sudo cat > /etc/yum.repos.d/elastic-7.x.repo << EOF
[elasticsearch-7.x]
name=Elastic repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
EOF


Instale o Filebeat:

sudo yum install filebeat

Configuração do Filebeat

Abra o arquivo de configuração do filebeat:

sudo 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:

#=========================== Filebeat inputs =============================

filebeat.inputs:
  • type: log


  # Change to true to enable this input configuration.
  enabled: true

  # Paths that should be crawled and fetched. Glob based paths.
  paths:
    #- /var/log/*.log
    #- c:\programdata\elasticsearch\logs\*
    - /var/log/httpd/modsec_audit.log

  fields:
    log_name: filebeat_modsec

  #Configuração para agrupar os logs de múltiplas linhas do modsecurity
  multiline.pattern: "^--[a-fA-F0-9]{8}-Z--$"
  multiline.negate: true
  multiline.match: before
  tags: ["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:
#================================ Outputs =====================================

# Configure what output to use when sending the data collected by the beat.

#-------------------------- Elasticsearch output ------------------------------
#output.elasticsearch:
  # Array of hosts to connect to.
  #hosts: ["localhost:9200"]

  # Protocol - either `http` (default) or `https`.
  #protocol: "https"

  # Authentication credentials - either API key or username/password.
  #api_key: "id:api_key"
  #username: "elastic"
  #password: "changeme"

#----------------------------- Logstash output --------------------------------
output.logstash:
  # The Logstash hosts
  hosts: ["localhost:5044"]

  # Optional SSL. By default is off.
  # List of root certificates for HTTPS server verifications
  #ssl.certificate_authorities: ["/etc/pki/root/ca.pem"]

  # Certificate for SSL client authentication
  #ssl.certificate: "/etc/pki/client/cert.pem"

  # Client Certificate Key
  #ssl.key: "/etc/pki/client/cert.key"

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:

sudo systemctl start filebeat
sudo 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 8)

sudo yum install java-1.8.0-openjdk.x86_64

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

sudo 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:

sudo yum install logstash

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

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

Devem aparecer algumas linhas da inicialização do Logstash. Aguarde até aparecer uma linha parecida com abaixo:

[Api Webserver] agent - Successfully started Logstash API endpoint {:port=>9600}

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

O Logstash deve gerar as seguintes linhas:

{
          "host" => "elastic.example.com",
      "@version" => "1",
       "message" => "Ola",
    "@timestamp" => 2020-05-20T11:13:06.994Z
}

Pare a execução do 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:

sudo /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:

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

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

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

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

sudo cd /etc/logstash/conf.d/

Liste os arquivos do projeto com o comano 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:

sudo vi 1010_input_file_example.conf

Configure o arquivo conforme o exemplo abaixo:

input {
  beats {
    # IMPORTANT! set this correctly to the charset
    # that your server writes these log files in
    port => 5044
    type => "mod_security"  # a type to identify those logs

    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # merge all modsec events for a given entity into the same event.
    # so essentially the modsec -Z marker is used as the splitter
    # which is the end of each modsec logical event in the logfile
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  }
}

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):

sudo 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)

sudo 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:

sudo vi 3000_output_stdout_example.conf

Configure o arquivo conforme o exemplo abaixo:

output {
  file {
    path => "/var/log/logstash/logstash-output.log"
  }
  gelf {
    port => "12200"
    host => "IPDOSERVIDORGRAYLOG"
  }
}

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):

sudo 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:

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

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

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

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Instalação e configuração do mod_security e mod_evasive
   3. Instalação e configuração do FileBeat e Logstash
   4. Testando integração do modsecurity, filebeat e logstash
   5. Integração com o Graylog
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

Pen-Test com ênfase em WLAN

Integridade dos arquivos do sistema

SSH Blindado - Protegendo o seu sistema de ataques SSH

VPN: IPSec vs SSL

TinyOS

  
Comentários
[1] Comentário enviado por rabbit em 16/08/2020 - 17:36h

Fala amigo,

Primeiramente obrigado pelo artigo.

Uma observação:
Na parte "IncludeOptional modsecurity.d/rules/*.conf" seria "IncludeOptional modsecurity.d/owasp-modsecurity-crs/rules/*.conf"
Na parte "Ainda no arquivo /etc/httpd/modsecurity.d/mod_security.conf verifique..." o caminho do arquivo está errado. Seria o caminho /etc/httpd/conf.d/mod_security.conf

Atenciosamente,

x.x
run rabbit run


Contribuir com comentário