Versões utilizadas: Debian 12 + openjdk + ELK Stack 8.x
Licenciamento: Apache 2.0
O ELK Stack trabalha de maneira semelhante aos serviços cliente/servidor, portanto, é necessário montar um servidor que ira conter os serviços do servidor Elasticsearch/Logstash/Kibana e na outra ponta os serviços cliente Filebeat/... para enviar as informações para o servidor ELK Stack. Dependendo do Beat utilizado é criado um índice com a referencia por exemplo filebeat.* para classificar os logs que estão sendo coletados.
Os pacotes dos serviços serão utilizado no modelo community/free, porém, o texto do blog elastic anuncia mais algumas características que podemos aproveitar devido a sua liberação de uso "Estamos empolgados em anunciar que os principais recursos de segurança do Elastic Stack agora são gratuitos. Isso significa que os usuários podem criptografar tráfego de rede, criar e gerenciar usuários, definir funções que protegem o acesso de nível de índice e de cluster e proteger totalmente o Kibana com Spaces.", existem outros pacotes porem verifique as condições de licenciamento no link:
Elasticsearch - Distributed, RESTful search and analytics.
Kibana - Visualize your data. Navigate the Stack.
Logstash - Ingest, transform, enrich, and output.
Beats - Collect, parse, and ship in a lightweight fashion.
APM - Find performance bottlenecks in your applications.
RAM: 4GB - CPU: 4
Além da instalação padrão é necessário cumprir com as dependências abaixo para realizar a instalação do ELK
# apt update && apt install -y openjdk-17-jdk apt-transport-https software-properties-common curl openssl ntpdate gnupg2 net-tools
Opcional: geoip-bin geoip-database geoip-database-extra unzip net-tools wget
Versão [5,6,7,8] Stable <- Escolha a vesão e altere na linha abaixo:
# wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
# echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | tee /etc/apt/sources.list.d/elastic-8.x.list
# apt update
baixar os pacotes
# apt install elasticsearch kibana logstash
Opcional: nginx-extras apm-server
Link: 1 /
--------------------------- Security autoconfiguration information ------------------------------
Authentication and authorization are enabled.
TLS for the transport and HTTP layers is enabled and configured.
The generated password for the elastic built-in superuser is : 2ZNBVwkyqJ+LfU4xRfah
If this node should join an existing cluster, you can reconfigure this with
'/usr/share/elasticsearch/bin/elasticsearch-reconfigure-node --enrollment-token <token-here>'
after creating an enrollment token on your existing cluster.
You can complete the following actions at any time:
Reset the password of the elastic built-in superuser with
'/usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic'.
Generate an enrollment token for Kibana instances with
'/usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana'.
Generate an enrollment token for Elasticsearch nodes with
'/usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s node'.
ELASTIC_PASSWORD 2ZNBVwkyqJ+LfU4xRfah
# /usr/share/kibana/bin/kibana-verification-code
Your verification code is: 753 716
Baixar o pacote, caso usou a linha única de instalação dos serviços no inicio do tutorial pule esta parte.
# apt install elasticsearch
Configure
# vi /etc/elasticsearch/elasticsearch.yml
#-------------------------- Cluster --------------------------------------
cluster.namer: my-application <- Opcional - Caso deseje ajustar o nome para o cluster altere aqui
# ------------------------- Node -----------------------------------------
node.name: node-1 <- Opcional
# ----------------------------------- Paths ------------------------------------
path.data: /var/lib/elasticsearch <- Manter default para armazenar local
path.logs: /var/log/elasticsearch <- Manter default para armazenar local
#-------------------------- Network -------------------------------------
network.host: localhost <- localhost ou ajuste para 0.0.0.0
http.port: 9200
#------------------------- Discovery ----------------------------------
cluster.initial_master_nodes: ["<IP_SERVE/Hostname>"] <- Na versão 8 ajusta automático
Nota: Caso não altere o caminho do path ou data será utilizado o /var/log local, portanto é conveniente alterar o local de armazenamento para não ocupar o espaço.
# vi /etc/elasticsearch/jvm.options.d/jvm.options
-Xms4g
-Xmx4g
Ajustar os parâmetros de inicialização do Elasticsearch
# systemctl daemon-reload && systemctl enable elasticsearch.service && systemctl start elasticsearch.service && systemctl status elasticsearch.service
O Elasticsearch funciona nas portas
TCP4 - 9200
TCP6 - 9300
Avaliar o funcionamento
# netstat -ntulp | grep 9200 <- Validar o uso da porta
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp6 0 0 127.0.0.1:9600 :::* LISTEN 431/java
tcp6 0 0 :::9300 :::* LISTEN 622/java
tcp6 0 0 :::9200 :::* LISTEN 622/java
tcp6 0 0 :::5047 :::* LISTEN 431/java
udp 0 0 0.0.0.0:5047 0.0.0.0:* 431/java
# lsof -nPi tcp:9200
java 431 logstash 87u IPv6 14279 0t0 TCP 192.168.1.119:39752->192.168.1.119:9200 (ESTABLISHED)
....
node 485 kibana 82u IPv4 20509 0t0 TCP 192.168.1.119:50220->192.168.1.119:9200 (ESTABLISHED)
....
java 622 elasticsearch 439u IPv6 19944 0t0 TCP *:9200 (LISTEN)
java 622 elasticsearch 457u IPv6 18210 0t0 TCP 192.168.1.119:9200->192.168.1.119:42936 (ESTABLISHED)
# tail -f /var/log/elasticsearch/elasticsearch.log <- Para avaliar se algum erro.
Testar o funcionamento do Elasticsearch
# curl -k -u elastic:2ZNBVwkyqJ+LfU4xRfah https://localhost:9200
# curl -k -u elastic:2ZNBVwkyqJ+LfU4xRfah 'https://localhost:9200/_cat/health?v'
# curl -k -u elastic:2ZNBVwkyqJ+LfU4xRfah 'https://localhost:9200/_cluster/health?pretty'
# curl -k -u elastic:2ZNBVwkyqJ+LfU4xRfah 'https://localhost:9200/_cat/indices?v'
https://192.168.1.119:9200/_security/_authenticate?pretty
Baixar o pacote, caso usou a linha única de instalação dos serviços no inicio do tutorial pule esta parte.
# apt install kibana
Configure
# vi /etc/kibana/kibana.yml
server.port: 5601
server.host: "<IP_SERVER>" <- Para localhost não alterar a linha
#####server.basePath: "/elk" <- Avaliar se necessário
elasticsearch.hosts: ["http://127.0.0.1:9200"]
#####pid.file: /opt/bitnami/kibana/tmp/kibana.pid <- Avaliar se necessário
Reiniciar o Kibana
# systemctl daemon-reload && systemctl enable kibana.service && systemctl start kibana.service && systemctl status kibana.service
Aguardar subir a aplicação
# netstat -ntulp | grep 5601 <- Validar o uso da porta
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:5601 0.0.0.0:* LISTEN 485/node
Testar o funcionamento e integração com o Elasticsearch
# curl -k -u elastic:2ZNBVwkyqJ+LfU4xRfah 'https://localhost:9200/.kibana/?pretty'
Acesse o Kibana utilizando o navegador http://IP_SERVER:5601/
Webinar Introdução ao Kibana - 4 min 22 seg.
Os pasos abaixo para o Kibana precisam ser atualizados.
Escolhendo Add data é possível escolher algum pacote para iniciar coletas
Escolhendo Explore on my own é possível explorar o kibana
Acesse o Menu > Management > Stack Management > Advanced Settings.
Date format: DD/MM/YYYY @ HH:mm:ss.SSS
Baixar o pacote, caso usou a linha única de instalação dos serviços no inicio do tutorial pule esta parte.
# apt install logstash
Configure
# vi /etc/logstash/logstash.yml
# ------------ Data path ------------------
path.data: /path/SYSLOG/logstash <- Manter default para armazenar local
# ------------ Debugging Settings --------------
path.logs: /path/SYSLOG/logstash <- Manter default para armazenar local
Receber de um Syslog
# vi /etc/logstash/conf.d/192.168.1.114.conf
input {
syslog {
port => 5047
type => syslog
}
}
filter {
if [type] == "syslog" {
grok {
match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
add_field => [ "received_at", "%{@timestamp}" ]
add_field => [ "received_from", "%{host}" ]
}
date {
match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]
}
}
}
### Não é necessário criar o index, ele esta implícito.
output {
if [type] == "syslog" {
elasticsearch {
hosts => ["https://192.168.1.119:9200"]
data_stream => true
user => "elastic"
password => "2ZNBVwkyqJ+LfU4xRfah"
ssl_certificate_verification => false
#cacert => "path/root-ca.pem"
}
stdout {
codec => rubydebug
}
}
}
Link: 1 /
Receber de um BEAT (Em desenvolvimento)
# cp -a /etc/logstash/logstash-sample.conf /etc/logstash/conf.d/01-beats.conf
# vi /etc/logstash/conf.d/192.168.10.XXX.conf
input {
tcp {
port => 29514
mode => "server"
}
}
output {
elasticsearch {
hosts => ["https://192.168.1.119:9200"]
index => "syslog%{+YYYY.MM.dd}"
}
stdout { codec => rubydebug }
}
Reiniciar o Logstash
# systemctl daemon-reload && systemctl enable logstash.service && systemctl start logstash.service && systemctl status logstash.service
Avaliar o funcionamento
# netstat -ntulp | grep 5047 <- Validar o uso da porta
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp6 0 0 :::5047 :::* LISTEN 431/java
udp 0 0 0.0.0.0:5047 0.0.0.0:* 431/java
# tail -f /path/SYSLOG/logstash/logstash-plain.log
[2023-09-12T17:49:08,885][INFO ][logstash.inputs.syslog ][main][e2c009ad1d7cacb024c0f5a66577ff2bff55e5590efd6fa7a6b030374f32d69a] new connection {:client=>"192.168.10.114:38327"}
Testar
# curl -XGET '<IP_SERVER>:9600/_node/pipelines?pretty'
Em AVALIACAO
Criar certificado
# cp -a /etc/ssl/openssl.cnf /etc/logstash/logstash-openssl.cnf
# vi /etc/logstash/logstash-openssl.cnf
[ v3_ca ]
subjectAltName = IP: <SERVER_IP_INT>
# openssl req -x509 -days 36500 -nodes -newkey rsa:2048 -batch -keyout /etc/logstash/logstash.key -out /etc/logstash/logstash.pem.crt -config /etc/logstash/logstash-openssl.cnf
# openssl pkcs8 -in /etc/logstash/logstash.key -topk8 -nocrypt -out /etc/logstash/logstash.pkcs8.key
# chmod 644 /etc/logstash/logstash.pkcs8.key
Nota: O arquivo logstash-openssl.cnf não e mais necessario, portanto pode ser apagado.
Reiniciar o Logstash
# systemctl restart logstash.service
Opcional
Crie os locais de armazenamento caso armazenar fora do servidor local .
# mkdir -p /path/SYSLOG/elasticsearch /path/SYSLOG/logstash
Nota: Para avaliação usei compartilhamento CIFS