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