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: 9.031 ]

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

Política de Segurança para Dispositivos Móveis

Protegendo seu Linux de ataques de brute force via ssh

Hotspot rápido com Coovachilli

Servidor para centralização de logs - Fedora 7

PuTTY - Estabelecendo Chave Secreta com OpenSSH

  
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




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts